summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2011-03-12 21:26:21 -0500
committerKristian Høgsberg <krh@bitplanet.net>2011-03-12 22:09:30 -0500
commit6d22c1bdc7720d70655d773a979e8d056be5baf1 (patch)
tree1eb2856fe2e672644fc5395c5e5984e9c12f24bd
parent5acf6b4b03a4cb06ef27f0f1055b60717af1c7eb (diff)
Fix double remove from surface destroy_listener_list
We remove the listener when a device loses its pointer focus, but doesn't insert it in another destroy_listener list if surface is NULL. When we set another pointer focus surface, we remove it again. Tracked down and tested by Iskren Chernev.
-rw-r--r--wayland/wayland-server.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/wayland/wayland-server.c b/wayland/wayland-server.c
index 036958f..2316949 100644
--- a/wayland/wayland-server.c
+++ b/wayland/wayland-server.c
@@ -360,19 +360,21 @@ wl_input_device_set_pointer_focus(struct wl_input_device *device,
&device->object,
WL_INPUT_DEVICE_POINTER_FOCUS,
time, NULL, 0, 0, 0, 0);
- if (surface)
+ if (device->pointer_focus)
+ wl_list_remove(&device->pointer_focus_listener.link);
+
+ if (surface) {
wl_client_post_event(surface->client,
&device->object,
WL_INPUT_DEVICE_POINTER_FOCUS,
time, surface, x, y, sx, sy);
+ wl_list_insert(surface->destroy_listener_list.prev,
+ &device->pointer_focus_listener.link);
+ }
device->pointer_focus = surface;
device->pointer_focus_time = time;
- wl_list_remove(&device->pointer_focus_listener.link);
- if (surface)
- wl_list_insert(surface->destroy_listener_list.prev,
- &device->pointer_focus_listener.link);
}
WL_EXPORT void
@@ -389,20 +391,20 @@ wl_input_device_set_keyboard_focus(struct wl_input_device *device,
&device->object,
WL_INPUT_DEVICE_KEYBOARD_FOCUS,
time, NULL, &device->keys);
+ if (device->keyboard_focus)
+ wl_list_remove(&device->keyboard_focus_listener.link);
- if (surface)
+ if (surface) {
wl_client_post_event(surface->client,
&device->object,
WL_INPUT_DEVICE_KEYBOARD_FOCUS,
time, surface, &device->keys);
+ wl_list_insert(surface->destroy_listener_list.prev,
+ &device->keyboard_focus_listener.link);
+ }
device->keyboard_focus = surface;
device->keyboard_focus_time = time;
-
- wl_list_remove(&device->keyboard_focus_listener.link);
- if (surface)
- wl_list_insert(surface->destroy_listener_list.prev,
- &device->keyboard_focus_listener.link);
}
WL_EXPORT void