From 42334db41e0ce96a2d0cf3431846cbc0c62ab574 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Wed, 12 Jul 2023 10:53:14 +0100 Subject: [PATCH] desktop-shell: Create focus surfaces for animation up front Rather than creating them the first time we need to switch focus, just create them at startup if we're going to be needing them at some point. Signed-off-by: Daniel Stone --- desktop-shell/shell.c | 50 +++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index d8dc9053d..177cf0e16 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -854,29 +854,12 @@ static void animate_focus_change(struct desktop_shell *shell, struct workspace *ws, struct weston_view *from, struct weston_view *to) { - struct weston_output *output; - bool focus_surface_created = false; - /* FIXME: Only support dim animation using two layers */ if (from == to || shell->focus_animation_type != ANIMATION_DIM_LAYER) return; - output = weston_shell_utils_get_default_output(shell->compositor); - if (ws->fsurf_front == NULL) { - ws->fsurf_front = create_focus_surface(shell->compositor, output); - if (ws->fsurf_front == NULL) - return; - - ws->fsurf_back = create_focus_surface(shell->compositor, output); - if (ws->fsurf_back == NULL) { - focus_surface_destroy(ws->fsurf_front); - return; - } - focus_surface_created = true; - } else { - weston_view_move_to_layer(ws->fsurf_front->curtain->view, NULL); - weston_view_move_to_layer(ws->fsurf_back->curtain->view, NULL); - } + weston_view_move_to_layer(ws->fsurf_front->curtain->view, NULL); + weston_view_move_to_layer(ws->fsurf_back->curtain->view, NULL); if (ws->focus_animation) { weston_view_animation_destroy(ws->focus_animation); @@ -886,17 +869,12 @@ animate_focus_change(struct desktop_shell *shell, struct workspace *ws, if (to) { weston_view_move_to_layer(ws->fsurf_front->curtain->view, &to->layer_link); - } else if (from) { + } else { weston_view_move_to_layer(ws->fsurf_front->curtain->view, &ws->layer.view_list); } - if (focus_surface_created) { - ws->focus_animation = weston_fade_run( - ws->fsurf_front->curtain->view, - ws->fsurf_front->curtain->view->alpha, 0.4, 300, - focus_animation_done, ws); - } else if (from) { + if (from) { weston_view_move_to_layer(ws->fsurf_back->curtain->view, &from->layer_link); ws->focus_animation = weston_stable_fade_run( @@ -910,6 +888,11 @@ animate_focus_change(struct desktop_shell *shell, struct workspace *ws, ws->fsurf_front->curtain->view, 0.0, ws->fsurf_back->curtain->view, 0.4, focus_animation_done, ws); + } else { + ws->focus_animation = weston_fade_run( + ws->fsurf_front->curtain->view, + ws->fsurf_front->curtain->view->alpha, 0.0, 300, + focus_animation_done, ws); } } @@ -957,8 +940,19 @@ workspace_create(struct desktop_shell *shell) wl_list_init(&ws->focus_list); wl_list_init(&ws->seat_destroyed_listener.link); ws->seat_destroyed_listener.notify = seat_destroyed; - ws->fsurf_front = NULL; - ws->fsurf_back = NULL; + + if (shell->focus_animation_type == ANIMATION_DIM_LAYER) { + struct weston_output *output = + weston_shell_utils_get_default_output(shell->compositor); + + ws->fsurf_front = create_focus_surface(shell->compositor, output); + assert(ws->fsurf_front); + ws->fsurf_back = create_focus_surface(shell->compositor, output); + assert(ws->fsurf_back); + } else { + ws->fsurf_front = NULL; + ws->fsurf_back = NULL; + } ws->focus_animation = NULL; }