From: Philip Withnall <philip.withn...@collabora.co.uk> This will be used more extensively in the next few commits, where shsurf layering is handled more explicitly when changing the type of a surface.
This commit introduces the minor functional change that map() will now always add the new surface to a layer list, as shell_surface_calculate_layer_link() always returns a non-NULL link element. This affects fullscreen and ‘none’ surfaces (which are now added to the fullscreen and current workspace’s layer list, respectively). --- src/shell.c | 78 ++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/src/shell.c b/src/shell.c index c503d4b..084d02c 100644 --- a/src/shell.c +++ b/src/shell.c @@ -2037,6 +2037,49 @@ get_output_panel_height(struct desktop_shell *shell, return panel_height; } +/* The surface will be inserted into the list immediately after the link + * returned by this function (i.e. will be stacked immediately above the + * returned link). */ +static struct wl_list * +shell_surface_calculate_layer_link (struct shell_surface *shsurf) +{ + struct workspace *ws; + + switch (shsurf->type) { + case SHELL_SURFACE_POPUP: + 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. */ + 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_FULLSCREEN: + return &shsurf->shell->fullscreen_layer.view_list; + + case SHELL_SURFACE_XWAYLAND: + case SHELL_SURFACE_TOPLEVEL: + case SHELL_SURFACE_MAXIMIZED: + case SHELL_SURFACE_NONE: + default: + /* Go to the fallback, below. */ + break; + } + + /* Move the surface to a normal workspace layer so that surfaces + * which were previously fullscreen or transient are no longer + * rendered on top. */ + ws = get_current_workspace(shsurf->shell); + return &ws->layer.view_list; +} + static void shell_surface_set_parent(struct shell_surface *shsurf, struct weston_surface *parent) @@ -4308,11 +4351,10 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf, int32_t width, int32_t height, int32_t sx, int32_t sy) { struct weston_compositor *compositor = shell->compositor; - struct weston_view *parent; struct weston_seat *seat; - struct workspace *ws; int panel_height = 0; int32_t surf_x, surf_y; + struct wl_list *new_layer_link; shsurf->view->geometry.width = width; shsurf->view->geometry.height = height; @@ -4350,30 +4392,14 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf, ; } - /* surface stacking order, see also activate() */ - switch (shsurf->type) { - case SHELL_SURFACE_POPUP: - case SHELL_SURFACE_TRANSIENT: - /* TODO: Handle a parent with multiple views */ - parent = get_default_view(shsurf->parent); - if (parent) { - wl_list_remove(&shsurf->view->layer_link); - wl_list_insert(parent->layer_link.prev, - &shsurf->view->layer_link); - } - break; - case SHELL_SURFACE_FULLSCREEN: - case SHELL_SURFACE_NONE: - break; - case SHELL_SURFACE_XWAYLAND: - case SHELL_SURFACE_TOPLEVEL: - case SHELL_SURFACE_MAXIMIZED: - default: - ws = get_current_workspace(shell); - wl_list_remove(&shsurf->view->layer_link); - wl_list_insert(&ws->layer.view_list, &shsurf->view->layer_link); - break; - } + /* Surface stacking order, see also activate(). + * + * If any child surfaces exist and are mapped, ensure they’re in the + * same layer as this surface. */ + new_layer_link = shell_surface_calculate_layer_link(shsurf); + wl_list_remove(&shsurf->view->layer_link); + wl_list_insert(new_layer_link, + &shsurf->view->layer_link); if (shsurf->type != SHELL_SURFACE_NONE) { weston_view_update_transform(shsurf->view); -- 1.8.3.1 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel