diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2011-03-12 21:26:21 -0500 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2011-03-12 22:09:30 -0500 |
commit | 6d22c1bdc7720d70655d773a979e8d056be5baf1 (patch) | |
tree | 1eb2856fe2e672644fc5395c5e5984e9c12f24bd | |
parent | 5acf6b4b03a4cb06ef27f0f1055b60717af1c7eb (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.c | 24 |
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 |