shell: Remove SHELL_SURFACE_TRANSIENT.
authorRafael Antognolli <rafael.antognolli@intel.com>
Tue, 3 Dec 2013 17:35:43 +0000 (15:35 -0200)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 3 Dec 2013 19:35:25 +0000 (11:35 -0800)
src/shell.c

index 9071727..d346b4c 100644 (file)
@@ -239,7 +239,6 @@ struct desktop_shell {
 enum shell_surface_type {
        SHELL_SURFACE_NONE,
        SHELL_SURFACE_TOPLEVEL,
-       SHELL_SURFACE_TRANSIENT,
        SHELL_SURFACE_POPUP,
        SHELL_SURFACE_XWAYLAND
 };
@@ -344,6 +343,7 @@ struct shell_surface {
        struct {
                bool maximized;
                bool fullscreen;
+               bool relative;
        } state, next_state; /* surface states */
        bool state_changed;
 };
@@ -2121,25 +2121,23 @@ shell_surface_calculate_layer_link (struct shell_surface *shsurf)
                break;
        }
 
-       case SHELL_SURFACE_TRANSIENT: {
-               /* Move the surface to its parent layer so that surfaces which
-                * are transient for fullscreen surfaces don't get hidden by the
-                * fullscreen surfaces. However, unlike popups, transient
-                * surfaces are stacked in front of their parent but not in
-                * front of other surfaces of the same type. */
-               struct weston_view *parent;
-
-               /* TODO: Handle a parent with multiple views */
-               parent = get_default_view(shsurf->parent);
-               if (parent)
-                       return parent->layer_link.prev;
-
-               break;
-       }
-
        case SHELL_SURFACE_TOPLEVEL: {
-               if (shsurf->state.fullscreen)
+               if (shsurf->state.fullscreen) {
                        return &shsurf->shell->fullscreen_layer.view_list;
+               } else if (shsurf->parent) {
+                       /* Move the surface to its parent layer so that
+                        * surfaces which are transient for fullscreen surfaces
+                        * don't get hidden by the fullscreen surfaces.
+                        * However, unlike popups, transient surfaces are
+                        * stacked in front of their parent but not in front of
+                        * other surfaces of the same type. */
+                       struct weston_view *parent;
+
+                       /* TODO: Handle a parent with multiple views */
+                       parent = get_default_view(shsurf->parent);
+                       if (parent)
+                               return parent->layer_link.prev;
+               }
                break;
        }
 
@@ -2284,7 +2282,7 @@ set_transient(struct shell_surface *shsurf,
 
        shell_surface_set_parent(shsurf, parent);
 
-       shsurf->next_type = SHELL_SURFACE_TRANSIENT;
+       shsurf->next_state.relative = true;
 
        /* The layer_link is updated in set_surface_type(),
         * called from configure. */
@@ -2520,15 +2518,13 @@ set_surface_type(struct shell_surface *shsurf)
 
        switch (shsurf->type) {
        case SHELL_SURFACE_TOPLEVEL:
-               if (shsurf->state.maximized || shsurf->state.fullscreen)
+               if (shsurf->state.maximized || shsurf->state.fullscreen) {
                        set_full_output(shsurf);
-               break;
-       case SHELL_SURFACE_TRANSIENT:
-               if (pev)
+               } else if (shsurf->state.relative && pev) {
                        weston_view_set_position(shsurf->view,
                                                 pev->geometry.x + shsurf->transient.x,
                                                 pev->geometry.y + shsurf->transient.y);
-               break;
+               }
 
        case SHELL_SURFACE_XWAYLAND:
                weston_view_set_position(shsurf->view, shsurf->transient.x,
@@ -3738,10 +3734,11 @@ static const struct weston_keyboard_grab_interface alt_tab_grab = {
 static int
 view_for_alt_tab(struct weston_view *view)
 {
-       if (!get_shell_surface(view->surface))
+       struct shell_surface *shsurf = get_shell_surface(view->surface);
+       if (!shsurf)
                return 0;
 
-       if (get_shell_surface_type(view->surface) == SHELL_SURFACE_TRANSIENT)
+       if (shsurf->parent)
                return 0;
 
        if (view != get_default_view(view->surface))
@@ -4505,6 +4502,7 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf,
 
        /* initial positioning, see also configure() */
        switch (shsurf->type) {
+       case SHELL_SURFACE_TOPLEVEL:
                if (shsurf->state.fullscreen) {
                        center_on_output(shsurf->view, shsurf->fullscreen_output);
                        shell_map_fullscreen(shsurf);
@@ -4517,7 +4515,7 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf,
                                                 shsurf->output->x - surf_x,
                                                 shsurf->output->y +
                                                 panel_height - surf_y);
-               } else {
+               } else if (!shsurf->state.relative) {
                        weston_view_set_initial_position(shsurf->view, shell);
                }
                break;
@@ -4529,7 +4527,6 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf,
                                         shsurf->view->geometry.x + sx,
                                         shsurf->view->geometry.y + sy);
                break;
-       case SHELL_SURFACE_TRANSIENT:
        case SHELL_SURFACE_XWAYLAND:
        default:
                ;
@@ -4546,18 +4543,24 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf,
                }
        }
 
+       if ((shsurf->type == SHELL_SURFACE_XWAYLAND || shsurf->state.relative) &&
+           shsurf->transient.flags == WL_SHELL_SURFACE_TRANSIENT_INACTIVE) {
+       }
+
        switch (shsurf->type) {
        /* XXX: xwayland's using the same fields for transient type */
        case SHELL_SURFACE_XWAYLAND:
-       case SHELL_SURFACE_TRANSIENT:
                if (shsurf->transient.flags ==
                                WL_SHELL_SURFACE_TRANSIENT_INACTIVE)
                        break;
        case SHELL_SURFACE_TOPLEVEL:
-               if (!shell->locked) {
-                       wl_list_for_each(seat, &compositor->seat_list, link)
-                               activate(shell, shsurf->surface, seat);
-               }
+               if (shsurf->state.relative &&
+                   shsurf->transient.flags == WL_SHELL_SURFACE_TRANSIENT_INACTIVE)
+                       break;
+               if (!shell->locked)
+                       break;
+               wl_list_for_each(seat, &compositor->seat_list, link)
+                       activate(shell, shsurf->surface, seat);
                break;
        case SHELL_SURFACE_POPUP:
        case SHELL_SURFACE_NONE:
@@ -5070,8 +5073,11 @@ switcher_next(struct switcher *switcher)
        struct workspace *ws = get_current_workspace(switcher->shell);
 
        wl_list_for_each(view, &ws->layer.view_list, layer_link) {
-               switch (get_shell_surface_type(view->surface)) {
+               shsurf = get_shell_surface(view->surface);
+               switch (shsurf->type) {
                case SHELL_SURFACE_TOPLEVEL:
+                       if (shsurf->parent)
+                               break;
                        if (first == NULL)
                                first = view->surface;
                        if (prev == switcher->current)
@@ -5081,7 +5087,6 @@ switcher_next(struct switcher *switcher)
                        weston_view_geometry_dirty(view);
                        weston_surface_damage(view->surface);
                        break;
-               case SHELL_SURFACE_TRANSIENT:
                case SHELL_SURFACE_POPUP:
                case SHELL_SURFACE_XWAYLAND:
                case SHELL_SURFACE_NONE: