commit b04f4136bc6163246d7e24454b84a950c8137ffc
parent e32bdaa7bead5052dd32c12917ea8f74a9b14405
Author: Kenny Levinsen <kl@kl.wtf>
Date: Thu, 28 Mar 2024 00:34:30 +0100
desktop/output: Debounce modesets
Output changes often happen in rapid succession. Instead of doing the
modesets one by one, set a 10 millisecond debounce timer.
Diffstat:
2 files changed, 25 insertions(+), 9 deletions(-)
diff --git a/include/sway/server.h b/include/sway/server.h
@@ -135,6 +135,8 @@ struct sway_server {
// Stores the nodes that have been marked as "dirty" and will be put into
// the pending transaction.
list_t *dirty_nodes;
+
+ struct wl_event_source *delayed_modeset;
};
extern struct sway_server server;
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
@@ -365,6 +365,26 @@ static void update_output_manager_config(struct sway_server *server) {
ipc_event_output();
}
+static int timer_modeset_handle(void *data) {
+ struct sway_server *server = data;
+ wl_event_source_remove(server->delayed_modeset);
+ server->delayed_modeset = NULL;
+
+ apply_all_output_configs();
+ transaction_commit_dirty();
+ update_output_manager_config(server);
+
+ return 0;
+}
+
+static void request_modeset(struct sway_server *server) {
+ if (server->delayed_modeset == NULL) {
+ server->delayed_modeset = wl_event_loop_add_timer(server->wl_event_loop,
+ timer_modeset_handle, server);
+ wl_event_source_timer_update(server->delayed_modeset, 10);
+ }
+}
+
static void begin_destroy(struct sway_output *output) {
struct sway_server *server = output->server;
@@ -388,9 +408,7 @@ static void begin_destroy(struct sway_output *output) {
output->wlr_output->data = NULL;
output->wlr_output = NULL;
- transaction_commit_dirty();
-
- update_output_manager_config(server);
+ request_modeset(server);
}
static void handle_destroy(struct wl_listener *listener, void *data) {
@@ -524,11 +542,7 @@ void handle_new_output(struct wl_listener *listener, void *data) {
sway_session_lock_add_output(server->session_lock.lock, output);
}
- apply_all_output_configs();
-
- transaction_commit_dirty();
-
- update_output_manager_config(server);
+ request_modeset(server);
}
void handle_output_layout_change(struct wl_listener *listener,
@@ -680,5 +694,5 @@ void handle_output_power_manager_set_mode(struct wl_listener *listener,
break;
}
store_output_config(oc);
- apply_all_output_configs();
+ request_modeset(output->server);
}