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

Derek Foreman derek.foreman.samsung at gmail.com
Fri Aug 10 17:55:42 UTC 2018


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?

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?

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