[PATCH weston 2/2] input: Update to-be-restored focus when unfocused

Quentin Glidic sardemff7+wayland at sardemff7.net
Thu Aug 2 08:29:53 UTC 2018


From: Quentin Glidic <sardemff7+git at sardemff7.net>

If we start a special (grabbing) client when Weston is unfocused, it
would lose focus when coming back to Weston.

A first attempt to fix this was 85d55540cb64bf97a08b40f79dc66843f8295d3b
but it messed with VT switching.

This fix just updates the saved focus, so when Weston gets focused back,
it will focus the correct client.

Signed-off-by: Quentin Glidic <sardemff7+git at sardemff7.net>
---

Sorry for the delay, I hoped I could make a Gitlab MR but sadly it
didn’t happen yet. :-)

I think this patch won’t conflict with VT switching, and it does fix the
issue I had initially.

Cheers,

 libweston/input.c | 38 +++++++++++++++++++++++++-------------
 1 file changed, 25 insertions(+), 13 deletions(-)

diff --git a/libweston/input.c b/libweston/input.c
index f1017dc1b..6a7f584fd 100644
--- a/libweston/input.c
+++ b/libweston/input.c
@@ -1507,6 +1507,17 @@ weston_pointer_set_focus(struct weston_pointer *pointer,
 	wl_signal_emit(&pointer->focus_signal, pointer);
 }
 
+static void
+destroy_device_saved_kbd_focus(struct wl_listener *listener, void *data)
+{
+	struct weston_seat *ws;
+
+	ws = container_of(listener, struct weston_seat,
+			  saved_kbd_focus_listener);
+
+	ws->saved_kbd_focus = NULL;
+}
+
 static void
 send_enter_to_resource_list(struct wl_list *list,
 			    struct weston_keyboard *keyboard,
@@ -1528,7 +1539,8 @@ weston_keyboard_set_focus(struct weston_keyboard *keyboard,
 			  struct weston_surface *surface)
 {
 	struct wl_resource *resource;
-	struct wl_display *display = keyboard->seat->compositor->wl_display;
+	struct weston_seat *seat = keyboard->seat;
+	struct wl_display *display = seat->compositor->wl_display;
 	uint32_t serial;
 	struct wl_list *focus_resource_list;
 
@@ -1540,6 +1552,17 @@ weston_keyboard_set_focus(struct weston_keyboard *keyboard,
 	if (surface && !surface->resource)
 		surface = NULL;
 
+	/* If we have a saved focus, this means Weston itself is unfocused.
+	 * In this case, we just want to update our to-be-restored focus.
+	 */
+	if (seat->saved_kbd_focus != NULL && surface != NULL) {
+		wl_list_remove(&seat->saved_kbd_focus_listener.link);
+		seat->saved_kbd_focus = surface;
+		wl_signal_add(&surface->destroy_signal,
+			      &seat->saved_kbd_focus_listener);
+		return;
+	}
+
 	focus_resource_list = &keyboard->focus_resource_list;
 
 	if (!wl_list_empty(focus_resource_list) && keyboard->focus != surface) {
@@ -2229,17 +2252,6 @@ notify_pointer_focus(struct weston_seat *seat, struct weston_output *output,
 	}
 }
 
-static void
-destroy_device_saved_kbd_focus(struct wl_listener *listener, void *data)
-{
-	struct weston_seat *ws;
-
-	ws = container_of(listener, struct weston_seat,
-			  saved_kbd_focus_listener);
-
-	ws->saved_kbd_focus = NULL;
-}
-
 WL_EXPORT void
 notify_keyboard_focus_in(struct weston_seat *seat, struct wl_array *keys,
 			 enum weston_key_state_update update_state)
@@ -2262,8 +2274,8 @@ notify_keyboard_focus_in(struct weston_seat *seat, struct wl_array *keys,
 
 	if (surface) {
 		wl_list_remove(&seat->saved_kbd_focus_listener.link);
-		weston_keyboard_set_focus(keyboard, surface);
 		seat->saved_kbd_focus = NULL;
+		weston_keyboard_set_focus(keyboard, surface);
 	}
 }
 
-- 
2.18.0



More information about the wayland-devel mailing list