diff options
| author | Kenny Levinsen <kl@kl.wtf> | 2024-03-28 00:34:30 +0100 |
|---|---|---|
| committer | Alexander Orzechowski <alex@ozal.ski> | 2024-07-03 10:06:22 -0400 |
| commit | b04f4136bc6163246d7e24454b84a950c8137ffc (patch) | |
| tree | 09214a5d78ebe61eedfe907534140ce490b11a25 | |
| parent | e32bdaa7bead5052dd32c12917ea8f74a9b14405 (diff) | |
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.
| -rw-r--r-- | include/sway/server.h | 2 | ||||
| -rw-r--r-- | sway/desktop/output.c | 32 |
2 files changed, 25 insertions, 9 deletions
diff --git a/include/sway/server.h b/include/sway/server.h index 3a63df34..abf1b6b4 100644 --- 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 index 4c9d0b63..f936b2a8 100644 --- 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); } |
