[PATCH weston] shell: fix various interactions with the minimized state

Manuel Bachmann manuel.bachmann at open.eurogiciel.org
Fri Sep 5 09:09:39 PDT 2014


Hi Giulio,

Sorry for the late answer, I happen to be very busy lately.

> How do you test that? Did you have to craft an ad-hoc client?

Yes ;  you will find the client I use at this URL :
http://www.tarnyko.net/repo/wayland-9b-xdg_shell_150.zip (run "./build.sh"
to compile).
If you then start the client, go fullscreen with the last upper-right
square (black) and then minimize with the upper-left square (light gray),
you will notice the client disappears and screen goes totally black. The
patch fixes that (in a good manner, hopefully).

> There seems to be a bug still. If I mod+tab away from a fullscreen client
into a windowed one and release the mod key, then pressing
mod+tab again doesn't go back to the fullscreen client, i have to  press
tab two times.

Oops ; I definitely have to try this. Thanks for letting me know !

Regards,
Manuel


2014-09-03 20:45 GMT+02:00 Giulio Camuffo <giuliocamuffo at gmail.com>:

> 2014-07-31 16:36 GMT+03:00 Manuel Bachmann
> <manuel.bachmann at open.eurogiciel.org>:
> > This fixes the following :
> > - if a surface was set fullscreen, and then minimized,
> > the fullscreen compositor state would stay on and display
> > a black screen ;
>
> How do you test that? Did you have to craft an ad-hoc client?
>
> > - if a surface was set fullscreen, and we would then
> > cycle between surfaces (with Mod+Tab e.g.), the fullscreen
> > compositor state would stay on, and the fullscreen layer
> > would sometimes hide surfaces positioned behind it ;
>
> There seems to be a bug still. If I mod+tab away from a fullscreen
> client into a windowed one and release the mod key, then pressing
> mod+tab again doesn't go back to the fullscreen client, i have to
> press tab two times.
>
> > - style and functional polishing, remove dead code.
>
> The rest looks good to me.
>
>
> --
> Giulio
>
>
> >
> > Signed-off-by: Manuel Bachmann <manuel.bachmann at open.eurogiciel.org>
> > ---
> >  desktop-shell/shell.c |   67
> ++++++++++++++++++++++++++++---------------------
> >  1 file changed, 38 insertions(+), 29 deletions(-)
> >
> > diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
> > index 3c3649c..60639cc 100644
> > --- a/desktop-shell/shell.c
> > +++ b/desktop-shell/shell.c
> > @@ -2510,13 +2510,14 @@ unset_maximized(struct shell_surface *shsurf)
> >  }
> >
> >  static void
> > -set_minimized(struct weston_surface *surface, uint32_t is_true)
> > +set_minimized(struct weston_surface *surface)
> >  {
> > +       struct weston_view *view;
> >         struct shell_surface *shsurf;
> > -       struct workspace *current_ws;
> > +       struct workspace *ws;
> >         struct weston_seat *seat;
> >         struct weston_surface *focus;
> > -       struct weston_view *view;
> > +       float x,y;
> >
> >         view = get_default_view(surface);
> >         if (!view)
> > @@ -2525,34 +2526,31 @@ set_minimized(struct weston_surface *surface,
> uint32_t is_true)
> >         assert(weston_surface_get_main_surface(view->surface) ==
> view->surface);
> >
> >         shsurf = get_shell_surface(surface);
> > -       current_ws = get_current_workspace(shsurf->shell);
> > +       ws = get_current_workspace(shsurf->shell);
> >
> > -       weston_layer_entry_remove(&view->layer_link);
> > -        /* hide or show, depending on the state */
> > -       if (is_true) {
> > -
>  weston_layer_entry_insert(&shsurf->shell->minimized_layer.view_list,
> &view->layer_link);
> > -
> > -               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)
> > -
>  weston_keyboard_set_focus(seat->keyboard, NULL);
> > -               }
> > +       /* if the surface is fullscreen, unset the global fullscreen
> state,
> > +        * but keep the surface centered on its previous output.
> > +        */
> > +       if (shsurf->state.fullscreen) {
> > +               x = shsurf->view->geometry.x;
> > +               y = shsurf->view->geometry.y;
> > +               unset_fullscreen(shsurf);
> > +               weston_view_set_position(shsurf->view, x, y);
> >         }
> > -       else {
> > -               weston_layer_entry_insert(&current_ws->layer.view_list,
> &view->layer_link);
> >
> > -               wl_list_for_each(seat,
> &shsurf->shell->compositor->seat_list, link) {
> > -                       if (!seat->keyboard)
> > -                               continue;
> > -                       activate(shsurf->shell, view->surface, seat,
> true);
> > -               }
> > +       weston_layer_entry_remove(&view->layer_link);
> > +
>  weston_layer_entry_insert(&shsurf->shell->minimized_layer.view_list,
> &view->layer_link);
> > +
> > +       drop_focus_state(shsurf->shell, 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)
> > +                       weston_keyboard_set_focus(seat->keyboard, NULL);
> >         }
> >
> >         shell_surface_update_child_surface_layers(shsurf);
> > -
> >         weston_view_damage_below(view);
> >  }
> >
> > @@ -3534,8 +3532,7 @@ xdg_surface_set_minimized(struct wl_client *client,
> >         if (shsurf->type != SHELL_SURFACE_TOPLEVEL)
> >                 return;
> >
> > -        /* apply compositor's own minimization logic (hide) */
> > -       set_minimized(shsurf->surface, 1);
> > +       set_minimized(shsurf->surface);
> >  }
> >
> >  static const struct xdg_surface_interface xdg_surface_implementation = {
> > @@ -5444,12 +5441,24 @@ struct switcher {
> >  static void
> >  switcher_next(struct switcher *switcher)
> >  {
> > +       struct focus_state *state;
> > +       struct weston_surface *surface;
> >         struct weston_view *view;
> >         struct weston_surface *first = NULL, *prev = NULL, *next = NULL;
> >         struct shell_surface *shsurf;
> >         struct workspace *ws = get_current_workspace(switcher->shell);
> >
> > -        /* temporary re-display minimized surfaces */
> > +       /* if the focused surface is fullscreen, minimize it */
> > +       wl_list_for_each(state, &ws->focus_list, link) {
> > +               if (state->keyboard_focus) {
> > +                       surface =
> weston_surface_get_main_surface(state->keyboard_focus);
> > +                       shsurf = get_shell_surface(surface);
> > +                       if (shsurf->state.fullscreen)
> > +                               set_minimized(surface);
> > +               }
> > +       }
> > +
> > +       /* temporarily display minimized surfaces again */
> >         struct weston_view *tmp;
> >         struct weston_view **minimized;
> >         wl_list_for_each_safe(view, tmp,
> &switcher->shell->minimized_layer.view_list.link, layer_link.link) {
> > @@ -5495,7 +5504,7 @@ switcher_next(struct switcher *switcher)
> >                 view->alpha = 1.0;
> >
> >         shsurf = get_shell_surface(switcher->current);
> > -       if (shsurf && shsurf->state.fullscreen)
> > +       if (shsurf && shsurf->state.fullscreen &&
> shsurf->fullscreen.black_view)
> >                 shsurf->fullscreen.black_view->alpha = 1.0;
> >  }
> >
> > --
> > 1.7.10.4
> >
> > _______________________________________________
> > wayland-devel mailing list
> > wayland-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>



-- 
Regards,



*Manuel BACHMANN Tizen Project VANNES-FR*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20140905/9083b330/attachment.html>


More information about the wayland-devel mailing list