diff options
author | emersion <contact@emersion.fr> | 2017-12-07 01:12:04 +0100 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2017-12-07 01:12:04 +0100 |
commit | 0e066f0d7634b051981fbfb2fb75b2f8a4fe8594 (patch) | |
tree | b8c38fe2bbccbbe0a59969a0025a09aa258064ac | |
parent | cbf5763c226661765fb87dcf30d60b04999c126b (diff) |
Listen to display destroy in output
-rw-r--r-- | include/wlr/types/wlr_output.h | 2 | ||||
-rw-r--r-- | types/wlr_output.c | 11 |
2 files changed, 13 insertions, 0 deletions
diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 42c46233..04662820 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -74,6 +74,8 @@ struct wlr_output { // the output position in layout space reported to clients int32_t lx, ly; + struct wl_listener display_destroy; + void *data; }; diff --git a/types/wlr_output.c b/types/wlr_output.c index ed74004d..dda63181 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -112,6 +112,12 @@ static void wl_output_bind(struct wl_client *wl_client, void *data, wl_output_send_to_resource(wl_resource); } +static void handle_display_destroy(struct wl_listener *listener, void *data) { + struct wlr_output *output = + wl_container_of(listener, output, display_destroy); + wlr_output_destroy_global(output); +} + struct wl_global *wlr_output_create_global(struct wlr_output *wlr_output, struct wl_display *display) { if (wlr_output->wl_global != NULL) { @@ -120,6 +126,10 @@ struct wl_global *wlr_output_create_global(struct wlr_output *wlr_output, struct wl_global *wl_global = wl_global_create(display, &wl_output_interface, 3, wlr_output, wl_output_bind); wlr_output->wl_global = wl_global; + + wlr_output->display_destroy.notify = handle_display_destroy; + wl_display_add_destroy_listener(display, &wlr_output->display_destroy); + return wl_global; } @@ -127,6 +137,7 @@ void wlr_output_destroy_global(struct wlr_output *wlr_output) { if (wlr_output->wl_global == NULL) { return; } + wl_list_remove(&wlr_output->display_destroy.link); struct wl_resource *resource, *tmp; wl_resource_for_each_safe(resource, tmp, &wlr_output->wl_resources) { struct wl_list *link = wl_resource_get_link(resource); |