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 <daniels@collabora.com>
This commit is contained in:
Daniel Stone 2023-07-12 10:53:14 +01:00 committed by Marius Vlad
parent a168dc0659
commit 42334db41e
1 changed files with 22 additions and 28 deletions

View File

@ -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;
}