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

Quentin Glidic sardemff7+wayland at sardemff7.net
Thu Aug 2 08:32:24 UTC 2018


On 8/2/18 10:29 AM, Quentin Glidic wrote:
> 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,

Forgot to CC everyone.

>   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);
>   	}
>   }
>   
> 


-- 

Quentin “Sardem FF7” Glidic


More information about the wayland-devel mailing list