diff options
author | Quentin Glidic <sardemff7+git@sardemff7.net> | 2017-07-21 14:02:40 +0200 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2017-12-04 21:07:38 +0000 |
commit | 85d55540cb64bf97a08b40f79dc66843f8295d3b (patch) | |
tree | a53642169fe715dc7d13e50e85a10ec6a0a6dfe5 | |
parent | b9906aaeadabd3b7013b5984104ee42ee0c43195 (diff) |
input: Do not override keyboard focus on restore
If we start a special (grabbing) client when Weston is unfocused, it
would lose focus when coming back to Weston.
Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
Reviewed-by: Daniel Stone <daniels@collabora.com>
-rw-r--r-- | libweston/input.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/libweston/input.c b/libweston/input.c index 0a694d13..94a3423a 100644 --- a/libweston/input.c +++ b/libweston/input.c @@ -1336,6 +1336,7 @@ WL_EXPORT void weston_keyboard_set_focus(struct weston_keyboard *keyboard, struct weston_surface *surface) { + struct weston_seat *seat = keyboard->seat; struct wl_resource *resource; struct wl_display *display = keyboard->seat->compositor->wl_display; uint32_t serial; @@ -1369,6 +1370,11 @@ weston_keyboard_set_focus(struct weston_keyboard *keyboard, keyboard->focus_serial = serial; } + if (seat->saved_kbd_focus) { + wl_list_remove(&seat->saved_kbd_focus_listener.link); + seat->saved_kbd_focus = NULL; + } + wl_list_remove(&keyboard->focus_resource_listener.link); wl_list_init(&keyboard->focus_resource_listener.link); if (surface && surface->resource) @@ -2060,11 +2066,8 @@ notify_keyboard_focus_in(struct weston_seat *seat, struct wl_array *keys, } surface = seat->saved_kbd_focus; - if (surface) { - wl_list_remove(&seat->saved_kbd_focus_listener.link); weston_keyboard_set_focus(keyboard, surface); - seat->saved_kbd_focus = NULL; } } @@ -2074,6 +2077,7 @@ notify_keyboard_focus_out(struct weston_seat *seat) struct weston_compositor *compositor = seat->compositor; struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat); struct weston_pointer *pointer = weston_seat_get_pointer(seat); + struct weston_surface *focus = keyboard->focus; uint32_t *k, serial; serial = wl_display_next_serial(compositor->wl_display); @@ -2085,18 +2089,18 @@ notify_keyboard_focus_out(struct weston_seat *seat) seat->modifier_state = 0; - if (keyboard->focus) { - seat->saved_kbd_focus = keyboard->focus; - seat->saved_kbd_focus_listener.notify = - destroy_device_saved_kbd_focus; - wl_signal_add(&keyboard->focus->destroy_signal, - &seat->saved_kbd_focus_listener); - } - weston_keyboard_set_focus(keyboard, NULL); weston_keyboard_cancel_grab(keyboard); if (pointer) weston_pointer_cancel_grab(pointer); + + if (focus) { + seat->saved_kbd_focus = focus; + seat->saved_kbd_focus_listener.notify = + destroy_device_saved_kbd_focus; + wl_signal_add(&focus->destroy_signal, + &seat->saved_kbd_focus_listener); + } } WL_EXPORT void |