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.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user