[PATCH weston 2/2] Reset the keyboard focus on all seats when the compositor is locked

Neil Roberts neil at linux.intel.com
Wed Apr 9 08:33:32 PDT 2014


Before commit 2f5faff7f9142 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
---
 desktop-shell/shell.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index fa081f3..b19965f 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -4498,6 +4498,19 @@ touch_to_activate_binding(struct weston_seat *seat, uint32_t time, void *data)
 }
 
 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)
 {
 	struct workspace *ws = get_current_workspace(shell);
@@ -4523,6 +4536,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(). */
-- 
1.8.5.3



More information about the wayland-devel mailing list