[weston,v6,5/6] shell: Inhibit idle fade-out behavior

Submitted by Bryce Harrington on Sept. 9, 2016, 2:31 a.m.

Details

Message ID 1473388304-13231-6-git-send-email-bryce@osg.samsung.com
State New
Headers show
Series "Implement screensaver/idle inhibition" ( rev: 5 4 ) in Wayland

Not browsing as part of any series.

Commit Message

Bryce Harrington Sept. 9, 2016, 2:31 a.m.
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 <bryce@osg.samsung.com>
---
 desktop-shell/shell.c  | 34 ++++++++++++++++++++++++++++++++++
 libweston/compositor.c |  5 ++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

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