On Mon, 16 Feb 2015 11:52:47 +0100
Manuel Bachmann <[email protected]> wrote:

> From: Manuel Bachmann <[email protected]>
> 
> 2 things were wrong with the minimization code :
> - if the minimized surface was fullscreen, the shell would keep
>   its fullscreen mode on and only display a black background ;
> - keyboard focus was unset, but pointer focus was not.
> 
> On the other hand, make sure a fullscreen surface gets centered
> again when refocused with Mod+Tab.
> 
> Author: Manuel Bachmann <[email protected]>
> Author: Nicolas Guyomard <[email protected]>
> Signed-off-by: Manuel Bachmann <[email protected]>
> ---
>  desktop-shell/shell.c |   16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
> 
> diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
> index 5900c4d..830c25d 100644
> --- a/desktop-shell/shell.c
> +++ b/desktop-shell/shell.c
> @@ -2657,13 +2657,20 @@ set_minimized(struct weston_surface *surface)
>       weston_layer_entry_remove(&view->layer_link);
>       weston_layer_entry_insert(&shsurf->shell->minimized_layer.view_list, 
> &view->layer_link);
>  
> +     if (shsurf->state.fullscreen)
> +             unset_fullscreen(shsurf);
> +
>       drop_focus_state(shsurf->shell, current_ws, view->surface);
>       wl_list_for_each(seat, &shsurf->shell->compositor->seat_list, link) {
>               if (!seat->keyboard)
>                       continue;
>               focus = weston_surface_get_main_surface(seat->keyboard->focus);
> -             if (focus == view->surface)
> +             if (focus == view->surface) {
>                       weston_keyboard_set_focus(seat->keyboard, NULL);
> +                     weston_pointer_set_focus(seat->pointer, NULL,
> +                                              wl_fixed_from_int(0),
> +                                              wl_fixed_from_int(0));
> +             }
>       }

Hi,

I'm not so sure about the pointer_set_focus here. Shuffling surfaces is
supposed to trigger a repick, which will reassign the pointer focus.
However, it seems something is off. The keyboards focus is different to
pointer focus, because keyboard focus is "sticky" and needs to be
explicitly managed. Pointer focus generally follows picking unless the
pointer is grabbed.

With this patch applied:

[2030091.702]  -> [email protected]_minimized()
[2030091.737]  -> [email protected]()
[2030091.768]  -> [email protected]()
[2030091.805]  -> [email protected]()
[2030091.892]  -> [email protected]()
[2030092.413] [email protected]_id(21)
[2030092.469] [email protected]_id(25)
[2030092.503] [email protected]_id(29)
[2030092.537] [email protected]_id(28)
[2030092.570] [email protected](315, wl_surface@14)
[2030092.633] [email protected](1024, 600, array, 316)
[2030092.722]  -> [email protected]_configure(316)
[2030092.762]  -> [email protected]_title("pq@erebos:~/git/weston")
[2030092.798] [email protected](317, nil)
[2030092.853] [email protected](318, 0, 0, 0, 0)
[2030093.019] [email protected](318, nil, 69.000000, 109.000000)
[2030093.154] [email protected](319)
[2030093.195]  -> [email protected](319)
[2030093.265] [email protected](320, nil)
[2030093.322]  -> [email protected]_region(new id wl_region@28)
[2030093.372]  -> [email protected]_title("pq@erebos:~/git/weston")
[2030093.409]  -> [email protected]_region(new id wl_region@29)
[2030093.455]  -> [email protected](0, 0, 1024, 600)
[2030093.553]  -> [email protected](0, 0, 1024, 600)
[2030093.642]  -> [email protected](new id wl_callback@25)
[2030098.044]  -> [email protected]_opaque_region(wl_region@28)
[2030098.142]  -> [email protected]()
[2030098.170]  -> [email protected]_input_region(wl_region@29)
[2030098.208]  -> [email protected]()
[2030098.291]  -> [email protected](wl_buffer@24, 0, 0)
[2030098.379]  -> [email protected](0, 0, 1024, 600)
[2030098.436]  -> [email protected]()
[2030103.646] [email protected]_id(28)
[2030103.727] [email protected]_id(29)

This was made with weston-terminal patched to have a "minimize" option
in the context menu. I just pushed that patch to master, btw. so
everyone can test.

I assume the first wl_pointer.leave(nil) is for the popup surface, so
that's ok. The enter for nil looks very suspicious though. Maybe that
is caused by this patch?

My opinion is that this looks okay apart from the pointer focus.

>  
>       shell_surface_update_child_surface_layers(shsurf);
> @@ -5937,8 +5944,11 @@ switcher_next(struct switcher *switcher)
>               view->alpha = 1.0;
>  
>       shsurf = get_shell_surface(switcher->current);
> -     if (shsurf && shsurf->state.fullscreen)
> -             shsurf->fullscreen.black_view->alpha = 1.0;
> +     if (shsurf && shsurf->state.fullscreen) {
> +             center_on_output(shsurf->view, shsurf->fullscreen_output);
> +             if (shsurf->fullscreen.black_view)
> +                     shsurf->fullscreen.black_view->alpha = 1.0;

Just curious, how can the surface go off-center? Some output
hot-unplugging involved?

When wouldn't there be a black_view?

> +     }
>  }
>  
>  static void

Thanks,
pq

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to