diff --git a/include/sway/output.h b/include/sway/output.h index 62d866bc2..43cbccd26 100644 --- a/include/sway/output.h +++ b/include/sway/output.h @@ -39,6 +39,7 @@ struct sway_output { struct sway_output_state current; + struct wl_listener layout_destroy; struct wl_listener destroy; struct wl_listener commit; struct wl_listener present; diff --git a/sway/desktop/output.c b/sway/desktop/output.c index d9328701c..d525b2b4b 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -892,8 +892,7 @@ static void update_output_manager_config(struct sway_server *server) { ipc_event_output(); } -static void handle_destroy(struct wl_listener *listener, void *data) { - struct sway_output *output = wl_container_of(listener, output, destroy); +static void begin_destroy(struct sway_output *output) { struct sway_server *server = output->server; if (output->enabled) { @@ -904,6 +903,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) { wl_list_remove(&output->link); + wl_list_remove(&output->layout_destroy.link); wl_list_remove(&output->destroy.link); wl_list_remove(&output->commit.link); wl_list_remove(&output->present.link); @@ -922,6 +922,16 @@ static void handle_destroy(struct wl_listener *listener, void *data) { update_output_manager_config(server); } +static void handle_destroy(struct wl_listener *listener, void *data) { + struct sway_output *output = wl_container_of(listener, output, destroy); + begin_destroy(output); +} + +static void handle_layout_destroy(struct wl_listener *listener, void *data) { + struct sway_output *output = wl_container_of(listener, output, layout_destroy); + begin_destroy(output); +} + static void update_textures(struct sway_container *con, void *data) { container_update_title_textures(con); container_update_marks_textures(con); @@ -1036,6 +1046,8 @@ void handle_new_output(struct wl_listener *listener, void *data) { output->server = server; wlr_damage_ring_init(&output->damage_ring); + wl_signal_add(&root->output_layout->events.destroy, &output->layout_destroy); + output->layout_destroy.notify = handle_layout_destroy; wl_signal_add(&wlr_output->events.destroy, &output->destroy); output->destroy.notify = handle_destroy; wl_signal_add(&wlr_output->events.commit, &output->commit);