diff options
author | Bryce Harrington <bryce@osg.samsung.com> | 2016-08-29 18:11:26 -0700 |
---|---|---|
committer | Bryce Harrington <bryce@osg.samsung.com> | 2016-08-29 18:36:13 -0700 |
commit | 9be807c69b1249390bb213e5403b9183738777f4 (patch) | |
tree | d71ad91740a93172f1f9f754ea2afd2bbff0b42c /desktop-shell | |
parent | e7069bcf93b2ffcf04b4128cb468fe83dc18baea (diff) |
shell: Inhibit idle fade-out behavior
When a client has registered idle inhibition on a surface, don't trigger
the fade-out animation on the output(s) the surface is displayed on.
But when the surface is destroyed or the inhibitor itself is destroyed
by client request, re-queue the fade out animation.
Diffstat (limited to 'desktop-shell')
-rw-r--r-- | desktop-shell/shell.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index 9a965608..0336794e 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -2279,6 +2279,7 @@ fade_out_done(struct weston_view_animation *animation, void *data) } } +/** Re-queue the fade animation to be evaluated if client had been inhibiting */ struct shell_surface * get_shell_surface(struct weston_surface *surface) { @@ -2295,6 +2296,26 @@ get_shell_surface(struct weston_surface *surface) */ static void +desktop_surface_drop_idle_inhibitor(struct weston_desktop_surface *desktop_surface, + void *shell) +{ + struct shell_surface *shsurf = + weston_desktop_surface_get_user_data(desktop_surface); + struct weston_surface *surface = + weston_desktop_surface_get_surface(desktop_surface); + struct weston_compositor *compositor = + shsurf->shell->compositor; + + if (compositor->state == WESTON_COMPOSITOR_IDLE + || compositor->state == WESTON_COMPOSITOR_OFFSCREEN + || compositor->state == WESTON_COMPOSITOR_SLEEPING) + { + surface->inhibit_idling = false; + shell_fade(shsurf->shell, FADE_OUT); + } +} + +static void desktop_surface_added(struct weston_desktop_surface *desktop_surface, void *shell) { @@ -2358,6 +2379,9 @@ desktop_surface_removed(struct weston_desktop_surface *desktop_surface, if (!shsurf) return; + if (surface->inhibit_idling) + desktop_surface_drop_idle_inhibitor(desktop_surface, shell); + wl_signal_emit(&shsurf->destroy_signal, shsurf); if (shsurf->fullscreen.black_view) @@ -2774,6 +2798,7 @@ static const struct weston_desktop_api shell_desktop_api = { .struct_size = sizeof(struct weston_desktop_api), .surface_added = desktop_surface_added, .surface_removed = desktop_surface_removed, + .surface_drop_idle_inhibitor = desktop_surface_drop_idle_inhibitor, .committed = desktop_surface_committed, .move = desktop_surface_move, .resize = desktop_surface_resize, @@ -3823,6 +3848,7 @@ shell_fade(struct desktop_shell *shell, enum fade_type type) { float tint; struct shell_output *shell_output; + uint32_t inhibit_mask = weston_compositor_inhibited_outputs(shell->compositor); switch (type) { case FADE_IN: @@ -3837,6 +3863,9 @@ shell_fade(struct desktop_shell *shell, enum fade_type type) /* Create a separate fade surface for each output */ wl_list_for_each(shell_output, &shell->output_list, link) { + if (inhibit_mask & (1 << shell_output->output->id)) + continue; + shell_output->fade.type = type; if (shell_output->fade.view == NULL) { @@ -3932,12 +3961,17 @@ shell_fade_init(struct desktop_shell *shell) return; wl_list_for_each(shell_output, &shell->output_list, link) { + uint32_t inhibit_mask = weston_compositor_inhibited_outputs(shell->compositor); + if (shell_output->fade.view != NULL) { weston_log("%s: warning: fade surface already exists\n", __func__); continue; } + if (inhibit_mask & (1 << shell_output->output->id)) + continue; + shell_output->fade.view = shell_fade_create_surface_for_output(shell, shell_output); if (!shell_output->fade.view) return; |