From 83ffd9d17bdf42a7b564642a64c4745ab801a72f Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Mon, 25 Nov 2013 18:01:42 +0000 Subject: [PATCH] shell: Remove weston_view_restack() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 96f83f114..32e72b198 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1422,15 +1422,6 @@ weston_surface_attach(struct weston_surface *surface, surface->compositor->renderer->attach(surface, buffer); } -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) { diff --git a/src/compositor.h b/src/compositor.h index e31d7db29..9e1a82579 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -1126,9 +1126,6 @@ void 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 f8fae8449..ecd9de4ca 100644 --- a/src/shell.c +++ b/src/shell.c @@ -3698,7 +3698,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; @@ -3890,6 +3895,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) { @@ -3899,8 +3907,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 @@ -3908,7 +3920,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; @@ -3940,15 +3951,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 */