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.

Signed-off-by: Bryce Harrington <[email protected]>
---
 desktop-shell/shell.c  | 34 ++++++++++++++++++++++++++++++++++
 libweston/compositor.c |  5 ++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index bd84b83..ecc3568 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_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_drop_idle_inhibitor(desktop_surface, shell);
+
        wl_signal_emit(&shsurf->destroy_signal, shsurf);
 
        if (shsurf->fullscreen.black_view)
@@ -2800,6 +2824,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,
+       .drop_idle_inhibitor = desktop_drop_idle_inhibitor,
        .committed = desktop_surface_committed,
        .move = desktop_surface_move,
        .resize = desktop_surface_resize,
@@ -3849,6 +3874,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:
@@ -3863,6 +3889,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) {
@@ -3958,12 +3987,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;
diff --git a/libweston/compositor.c b/libweston/compositor.c
index 62533ca..91ed72c 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -3930,7 +3930,10 @@ bind_subcompositor(struct wl_client *client,
                                       compositor, NULL);
 }
 
-/** Set a DPMS mode on all of the compositor's outputs
+/** Apply a DPMS mode to the compositor's outputs.
+ *
+ * Outputs may skip setting the DPMS state if they are being used to
+ * display an surface that is requesting idle behaviors be inhibited.
  *
  * \param compositor The compositor instance
  * \param state The DPMS state the outputs will be set to
-- 
1.9.1

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to