summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2011-10-07 14:34:31 +0200
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2011-10-07 14:41:23 +0200
commit5b156c4392d6d511f82b308d40e7238a4df45f5b (patch)
tree8f387130afbbd71b2f3bcd76d35d1ca4e43a4b3c
parent34b26802d710d36224db25a4bb1e9ac5ff1e9843 (diff)
server: Add destroy listener for input focus resourcesfixes
To avoid sending updates to already destroyed resources. Fixes segfault in compositor when closing the terminal.
-rw-r--r--src/wayland-server.c38
-rw-r--r--src/wayland-server.h2
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;