[PATCH weston 2/2] input: Update to-be-restored focus when unfocused
Peter Hutterer
peter.hutterer at who-t.net
Thu Aug 16 03:24:38 UTC 2018
On Fri, Aug 10, 2018 at 12:55:42PM -0500, Derek Foreman wrote:
> On 2018-08-02 03:32 AM, Quentin Glidic wrote:
> > 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.
>
> I'm a bit confused as to where we're at with this.
>
> How did the reverted patch "mess with" or "conflict with" VT switching?
it ended up always setting the keyboard focus to NULL on VT switch (due to
how libinput devices are handled), so on vt switch back you had no focus.
> Is it intended that these two patches be applied, and then Jamey's patch
> (marked as "superseded" in patchwork) be applied on top to resolve the
> loss of focus on VT switch away/back?
AIUI, these two need supersede Jamey's patchl but I'm not 100% sure on that,
sorry.
Cheers,
Peter
>
> Thought this might be important to land before the release, but it's not
> terribly clear what it actually fixes. I'd assumed it was the VT switch
> thing, but that remains unresolved.
>
> Help? :)
>
> Thanks,
> Derek
>
> >> 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);
> >> }
> >> }
> >>
> >
> >
>
More information about the wayland-devel
mailing list