[PATCH 13/17] shell: Remove weston_view_restack()

Philip Withnall philip at tecnocode.co.uk
Mon Nov 25 10:01:42 PST 2013


From: Philip Withnall <philip.withnall at collabora.co.uk>

It’s tied too deeply into the shell’s window stacking and ordering code
to legitimately be split out into compositor.c. Inline it in the shell,
and refactor some code around it a little, tidying up the stacking
behaviour for fullscreen surfaces.
---
 src/compositor.c |  9 ---------
 src/compositor.h |  3 ---
 src/shell.c      | 31 ++++++++++++++++++++++---------
 3 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index cfcb273..042c0ef 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1432,15 +1432,6 @@ weston_surface_attach(struct weston_surface *surface,
 }
 
 WL_EXPORT void
-weston_view_restack(struct weston_view *view, struct wl_list *below)
-{
-	wl_list_remove(&view->layer_link);
-	wl_list_insert(below, &view->layer_link);
-	weston_view_damage_below(view);
-	weston_surface_damage(view->surface);
-}
-
-WL_EXPORT void
 weston_compositor_damage_all(struct weston_compositor *compositor)
 {
 	struct weston_output *output;
diff --git a/src/compositor.h b/src/compositor.h
index 526f3d1..b6616a5 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1123,9 +1123,6 @@ weston_view_configure(struct weston_view *view,
 		      float x, float y, int width, int height);
 
 void
-weston_view_restack(struct weston_view *surface, struct wl_list *below);
-
-void
 weston_view_set_position(struct weston_view *view,
 			 float x, float y);
 
diff --git a/src/shell.c b/src/shell.c
index 25e00d9..96bfea0 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -3693,7 +3693,12 @@ alt_tab_binding(struct weston_seat *seat, uint32_t time, uint32_t key,
 
 		preview->view = v = weston_view_create(view->surface);
 		v->output = view->output;
-		weston_view_restack(v, &ws->layer.view_list);
+
+		wl_list_remove(&v->layer_link);
+		wl_list_insert(&ws->layer.view_list, &v->layer_link);
+		weston_view_damage_below(v);
+		weston_surface_damage(v->surface);
+
 		weston_view_configure(v, x, y, view->geometry.width, view->geometry.height);
 
 		preview->listener.notify = alt_tab_handle_surface_destroy;
@@ -3885,6 +3890,9 @@ rotate_binding(struct weston_seat *seat, uint32_t time, uint32_t button,
 	surface_rotate(surface, seat);
 }
 
+/* Move all fullscreen layers down to the current workspace in a non-reversible
+ * manner. This should be used when implementing shell-wide overlays, such as
+ * the alt-tab switcher, which need to de-promote fullscreen layers. */
 static void
 lower_fullscreen_layer(struct desktop_shell *shell)
 {
@@ -3894,8 +3902,12 @@ lower_fullscreen_layer(struct desktop_shell *shell)
 	ws = get_current_workspace(shell);
 	wl_list_for_each_reverse_safe(view, prev,
 				      &shell->fullscreen_layer.view_list,
-				      layer_link)
-		weston_view_restack(view, &ws->layer.view_list);
+				      layer_link) {
+		wl_list_remove(&view->layer_link);
+		wl_list_insert(&ws->layer.view_list, &view->layer_link);
+		weston_view_damage_below(view);
+		weston_surface_damage(view->surface);
+	}
 }
 
 static void
@@ -3903,7 +3915,6 @@ activate(struct desktop_shell *shell, struct weston_surface *es,
 	 struct weston_seat *seat)
 {
 	struct weston_surface *main_surface;
-	struct weston_view *main_view;
 	struct focus_state *state;
 	struct workspace *ws;
 	struct weston_surface *old_es;
@@ -3935,15 +3946,17 @@ activate(struct desktop_shell *shell, struct weston_surface *es,
 	case SHELL_SURFACE_NONE:
 	default:
 		restore_all_output_modes(shell->compositor);
-		ws = get_current_workspace(shell);
-		main_view = get_default_view(main_surface);
-		if (main_view)
-			weston_view_restack(main_view, &ws->layer.view_list);
 		break;
 	}
 
-	if (shell->focus_animation_type != ANIMATION_NONE)
+	if (shell->focus_animation_type != ANIMATION_NONE) {
+		ws = get_current_workspace(shell);
 		animate_focus_change(shell, ws, get_default_view(old_es), get_default_view(es));
+	}
+
+	/* Update the surface’s layer. This brings it to the top of the stacking
+	 * order as appropriate. */
+	shell_surface_update_layer(get_shell_surface(main_surface));
 }
 
 /* no-op func for checking black surface */
-- 
1.8.3.1



More information about the wayland-devel mailing list