summaryrefslogtreecommitdiff
path: root/desktop-shell
diff options
context:
space:
mode:
authorBryce Harrington <bryce@osg.samsung.com>2016-08-29 18:11:26 -0700
committerBryce Harrington <bryce@osg.samsung.com>2016-08-29 18:36:13 -0700
commit9be807c69b1249390bb213e5403b9183738777f4 (patch)
treed71ad91740a93172f1f9f754ea2afd2bbff0b42c /desktop-shell
parente7069bcf93b2ffcf04b4128cb468fe83dc18baea (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.c34
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;