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.
dev
Bryce Harrington 8 years ago
parent e7069bcf93
commit 9be807c69b
  1. 34
      desktop-shell/shell.c
  2. 5
      libweston/compositor.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 * struct shell_surface *
get_shell_surface(struct weston_surface *surface) get_shell_surface(struct weston_surface *surface)
{ {
@ -2294,6 +2295,26 @@ get_shell_surface(struct weston_surface *surface)
* libweston-desktop * libweston-desktop
*/ */
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 static void
desktop_surface_added(struct weston_desktop_surface *desktop_surface, desktop_surface_added(struct weston_desktop_surface *desktop_surface,
void *shell) void *shell)
@ -2358,6 +2379,9 @@ desktop_surface_removed(struct weston_desktop_surface *desktop_surface,
if (!shsurf) if (!shsurf)
return; return;
if (surface->inhibit_idling)
desktop_surface_drop_idle_inhibitor(desktop_surface, shell);
wl_signal_emit(&shsurf->destroy_signal, shsurf); wl_signal_emit(&shsurf->destroy_signal, shsurf);
if (shsurf->fullscreen.black_view) 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), .struct_size = sizeof(struct weston_desktop_api),
.surface_added = desktop_surface_added, .surface_added = desktop_surface_added,
.surface_removed = desktop_surface_removed, .surface_removed = desktop_surface_removed,
.surface_drop_idle_inhibitor = desktop_surface_drop_idle_inhibitor,
.committed = desktop_surface_committed, .committed = desktop_surface_committed,
.move = desktop_surface_move, .move = desktop_surface_move,
.resize = desktop_surface_resize, .resize = desktop_surface_resize,
@ -3823,6 +3848,7 @@ shell_fade(struct desktop_shell *shell, enum fade_type type)
{ {
float tint; float tint;
struct shell_output *shell_output; struct shell_output *shell_output;
uint32_t inhibit_mask = weston_compositor_inhibited_outputs(shell->compositor);
switch (type) { switch (type) {
case FADE_IN: 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 */ /* Create a separate fade surface for each output */
wl_list_for_each(shell_output, &shell->output_list, link) { wl_list_for_each(shell_output, &shell->output_list, link) {
if (inhibit_mask & (1 << shell_output->output->id))
continue;
shell_output->fade.type = type; shell_output->fade.type = type;
if (shell_output->fade.view == NULL) { if (shell_output->fade.view == NULL) {
@ -3932,12 +3961,17 @@ shell_fade_init(struct desktop_shell *shell)
return; return;
wl_list_for_each(shell_output, &shell->output_list, link) { 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) { if (shell_output->fade.view != NULL) {
weston_log("%s: warning: fade surface already exists\n", weston_log("%s: warning: fade surface already exists\n",
__func__); __func__);
continue; continue;
} }
if (inhibit_mask & (1 << shell_output->output->id))
continue;
shell_output->fade.view = shell_fade_create_surface_for_output(shell, shell_output); shell_output->fade.view = shell_fade_create_surface_for_output(shell, shell_output);
if (!shell_output->fade.view) if (!shell_output->fade.view)
return; return;

@ -3930,7 +3930,10 @@ bind_subcompositor(struct wl_client *client,
compositor, NULL); 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 compositor The compositor instance
* \param state The DPMS state the outputs will be set to * \param state The DPMS state the outputs will be set to

Loading…
Cancel
Save