diff options
-rw-r--r-- | include/sway/output.h | 1 | ||||
-rw-r--r-- | sway/desktop/output.c | 16 |
2 files changed, 15 insertions, 2 deletions
diff --git a/include/sway/output.h b/include/sway/output.h index 62d866bc..43cbccd2 100644 --- a/include/sway/output.h +++ b/include/sway/output.h | |||
@@ -39,6 +39,7 @@ struct sway_output { | |||
39 | 39 | ||
40 | struct sway_output_state current; | 40 | struct sway_output_state current; |
41 | 41 | ||
42 | struct wl_listener layout_destroy; | ||
42 | struct wl_listener destroy; | 43 | struct wl_listener destroy; |
43 | struct wl_listener commit; | 44 | struct wl_listener commit; |
44 | struct wl_listener present; | 45 | struct wl_listener present; |
diff --git a/sway/desktop/output.c b/sway/desktop/output.c index d9328701..d525b2b4 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) { | |||
892 | ipc_event_output(); | 892 | ipc_event_output(); |
893 | } | 893 | } |
894 | 894 | ||
895 | static void handle_destroy(struct wl_listener *listener, void *data) { | 895 | static void begin_destroy(struct sway_output *output) { |
896 | struct sway_output *output = wl_container_of(listener, output, destroy); | ||
897 | struct sway_server *server = output->server; | 896 | struct sway_server *server = output->server; |
898 | 897 | ||
899 | if (output->enabled) { | 898 | if (output->enabled) { |
@@ -904,6 +903,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) { | |||
904 | 903 | ||
905 | wl_list_remove(&output->link); | 904 | wl_list_remove(&output->link); |
906 | 905 | ||
906 | wl_list_remove(&output->layout_destroy.link); | ||
907 | wl_list_remove(&output->destroy.link); | 907 | wl_list_remove(&output->destroy.link); |
908 | wl_list_remove(&output->commit.link); | 908 | wl_list_remove(&output->commit.link); |
909 | wl_list_remove(&output->present.link); | 909 | wl_list_remove(&output->present.link); |
@@ -922,6 +922,16 @@ static void handle_destroy(struct wl_listener *listener, void *data) { | |||
922 | update_output_manager_config(server); | 922 | update_output_manager_config(server); |
923 | } | 923 | } |
924 | 924 | ||
925 | static void handle_destroy(struct wl_listener *listener, void *data) { | ||
926 | struct sway_output *output = wl_container_of(listener, output, destroy); | ||
927 | begin_destroy(output); | ||
928 | } | ||
929 | |||
930 | static void handle_layout_destroy(struct wl_listener *listener, void *data) { | ||
931 | struct sway_output *output = wl_container_of(listener, output, layout_destroy); | ||
932 | begin_destroy(output); | ||
933 | } | ||
934 | |||
925 | static void update_textures(struct sway_container *con, void *data) { | 935 | static void update_textures(struct sway_container *con, void *data) { |
926 | container_update_title_textures(con); | 936 | container_update_title_textures(con); |
927 | container_update_marks_textures(con); | 937 | container_update_marks_textures(con); |
@@ -1036,6 +1046,8 @@ void handle_new_output(struct wl_listener *listener, void *data) { | |||
1036 | output->server = server; | 1046 | output->server = server; |
1037 | wlr_damage_ring_init(&output->damage_ring); | 1047 | wlr_damage_ring_init(&output->damage_ring); |
1038 | 1048 | ||
1049 | wl_signal_add(&root->output_layout->events.destroy, &output->layout_destroy); | ||
1050 | output->layout_destroy.notify = handle_layout_destroy; | ||
1039 | wl_signal_add(&wlr_output->events.destroy, &output->destroy); | 1051 | wl_signal_add(&wlr_output->events.destroy, &output->destroy); |
1040 | output->destroy.notify = handle_destroy; | 1052 | output->destroy.notify = handle_destroy; |
1041 | wl_signal_add(&wlr_output->events.commit, &output->commit); | 1053 | wl_signal_add(&wlr_output->events.commit, &output->commit); |