Reset the keyboard focus on all seats when the compositor is locked

Before commit 2f5faff7f9 when the compositor is locked it would
reset the keyboard focus on all of the seats as part of pushing the
focus_state. This was removed because it now always keeps track of the
focus_state in the workspace instead of waiting until the state is
pushed. However this had the side effect that the active surface would
retain focus when the compositor is locked. This patch just makes it
explicitly set the keyboard focus to NULL on all of the seats when
locking. This will be restored based on the workspace's state when
unlocking.

https://bugs.freedesktop.org/show_bug.cgi?id=73905
This commit is contained in:
Neil Roberts 2014-04-09 16:33:32 +01:00 committed by Kristian Høgsberg
parent 4237f50e11
commit b4a91708e3

View file

@ -4500,6 +4500,19 @@ touch_to_activate_binding(struct weston_seat *seat, uint32_t time, void *data)
activate_binding(seat, data, seat->touch->focus->surface);
}
static void
unfocus_all_seats(struct desktop_shell *shell)
{
struct weston_seat *seat, *next;
wl_list_for_each_safe(seat, next, &shell->compositor->seat_list, link) {
if (seat->keyboard == NULL)
continue;
weston_keyboard_set_focus(seat->keyboard, NULL);
}
}
static void
lock(struct desktop_shell *shell)
{
@ -4526,6 +4539,11 @@ lock(struct desktop_shell *shell)
launch_screensaver(shell);
/* Remove the keyboard focus on all seats. This will be
* restored to the workspace's saved state via
* restore_focus_state when the compositor is unlocked */
unfocus_all_seats(shell);
/* TODO: disable bindings that should not work while locked. */
/* All this must be undone in resume_desktop(). */