From 5b156c4392d6d511f82b308d40e7238a4df45f5b Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Fri, 7 Oct 2011 14:34:31 +0200 Subject: server: Add destroy listener for input focus resources To avoid sending updates to already destroyed resources. Fixes segfault in compositor when closing the terminal. --- src/wayland-server.c | 38 ++++++++++++++++++++++++++++++++++++-- src/wayland-server.h | 2 ++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/wayland-server.c b/src/wayland-server.c index 4ee7796..2e948ed 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -356,6 +356,28 @@ lose_keyboard_focus(struct wl_listener *listener, wl_input_device_set_keyboard_focus(device, NULL, time); } +static void +pointer_focus_resource_destroyed(struct wl_listener *listener, + struct wl_resource *resource, uint32_t time) +{ + struct wl_input_device *device = + container_of(listener, struct wl_input_device, + pointer_focus_resource_listener); + + device->pointer_focus_resource = NULL; +} + +static void +keyboard_focus_resource_destroyed(struct wl_listener *listener, + struct wl_resource *resource, uint32_t time) +{ + struct wl_input_device *device = + container_of(listener, struct wl_input_device, + keyboard_focus_resource_listener); + + device->keyboard_focus_resource = NULL; +} + WL_EXPORT void wl_input_device_init(struct wl_input_device *device, struct wl_compositor *compositor) @@ -363,7 +385,11 @@ wl_input_device_init(struct wl_input_device *device, memset(device, 0, sizeof *device); wl_list_init(&device->resource_list); device->pointer_focus_listener.func = lose_pointer_focus; + device->pointer_focus_resource_listener.func = + pointer_focus_resource_destroyed; device->keyboard_focus_listener.func = lose_keyboard_focus; + device->keyboard_focus_resource_listener.func = + keyboard_focus_resource_destroyed; device->x = 100; device->y = 100; @@ -404,8 +430,10 @@ wl_input_device_set_pointer_focus(struct wl_input_device *device, wl_resource_post_event(device->pointer_focus_resource, WL_INPUT_DEVICE_POINTER_FOCUS, time, NULL, 0, 0, 0, 0); - if (device->pointer_focus_resource) + if (device->pointer_focus) wl_list_remove(&device->pointer_focus_listener.link); + if (device->pointer_focus_resource) + wl_list_remove(&device->pointer_focus_resource_listener.link); resource = find_resource_for_surface(&device->resource_list, surface); if (resource) { @@ -414,6 +442,8 @@ wl_input_device_set_pointer_focus(struct wl_input_device *device, time, surface, x, y, sx, sy); wl_list_insert(surface->resource.destroy_listener_list.prev, &device->pointer_focus_listener.link); + wl_list_insert(resource->destroy_listener_list.prev, + &device->pointer_focus_resource_listener.link); } device->pointer_focus_resource = resource; @@ -437,8 +467,10 @@ wl_input_device_set_keyboard_focus(struct wl_input_device *device, wl_resource_post_event(device->keyboard_focus_resource, WL_INPUT_DEVICE_KEYBOARD_FOCUS, time, NULL, &device->keys); - if (device->keyboard_focus_resource) + if (device->keyboard_focus) wl_list_remove(&device->keyboard_focus_listener.link); + if (device->keyboard_focus_resource) + wl_list_remove(&device->keyboard_focus_resource_listener.link); resource = find_resource_for_surface(&device->resource_list, surface); if (resource) { @@ -447,6 +479,8 @@ wl_input_device_set_keyboard_focus(struct wl_input_device *device, time, surface, &device->keys); wl_list_insert(surface->resource.destroy_listener_list.prev, &device->keyboard_focus_listener.link); + wl_list_insert(resource->destroy_listener_list.prev, + &device->keyboard_focus_resource_listener.link); } device->keyboard_focus_resource = resource; diff --git a/src/wayland-server.h b/src/wayland-server.h index 9f5e8c3..6e7a347 100644 --- a/src/wayland-server.h +++ b/src/wayland-server.h @@ -171,6 +171,8 @@ struct wl_input_device { uint32_t keyboard_focus_time; struct wl_listener pointer_focus_listener; struct wl_listener keyboard_focus_listener; + struct wl_listener pointer_focus_resource_listener; + struct wl_listener keyboard_focus_resource_listener; int32_t x, y; struct wl_grab *grab; -- cgit v1.2.3