Skip to content

Commit

Permalink
desktop/output: Debounce modesets
Browse files Browse the repository at this point in the history
Output changes often happen in rapid succession. Instead of doing the
modesets one by one, set a 10 millisecond debounce timer.
  • Loading branch information
kennylevinsen committed Mar 29, 2024
1 parent c276b36 commit 1d6009a
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 9 deletions.
2 changes: 2 additions & 0 deletions include/sway/server.h
Expand Up @@ -133,6 +133,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;
Expand Down
32 changes: 23 additions & 9 deletions sway/desktop/output.c
Expand Up @@ -362,6 +362,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;

Expand All @@ -385,9 +405,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) {
Expand Down Expand Up @@ -521,11 +539,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,
Expand Down Expand Up @@ -677,5 +691,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);
}

0 comments on commit 1d6009a

Please sign in to comment.