compositor: add WESTON_COMPOSITOR_OFFSCREEN state
This state is used when the user switches the vt. It turns of rendering and frame events, but doesn't set the DPMS state to off. As a part of this change, also turn off the idle timer when entering the SLEEPING or OFFSCREEN states, which fixes https://bugs.freedesktop.org/show_bug.cgi?id=61910 (rpi backend untested).
This commit is contained in:
committed by
Kristian Høgsberg
parent
cee79e91f3
commit
57edf7f49e
@@ -2020,12 +2020,12 @@ vt_func(struct weston_compositor *compositor, int event)
|
|||||||
|
|
||||||
compositor->focus = 0;
|
compositor->focus = 0;
|
||||||
ec->prev_state = compositor->state;
|
ec->prev_state = compositor->state;
|
||||||
compositor->state = WESTON_COMPOSITOR_SLEEPING;
|
weston_compositor_offscreen(compositor);
|
||||||
|
|
||||||
/* If we have a repaint scheduled (either from a
|
/* If we have a repaint scheduled (either from a
|
||||||
* pending pageflip or the idle handler), make sure we
|
* pending pageflip or the idle handler), make sure we
|
||||||
* cancel that so we don't try to pageflip when we're
|
* cancel that so we don't try to pageflip when we're
|
||||||
* vt switched away. The SLEEPING state will prevent
|
* vt switched away. The OFFSCREEN state will prevent
|
||||||
* further attemps at repainting. When we switch
|
* further attemps at repainting. When we switch
|
||||||
* back, we schedule a repaint, which will process
|
* back, we schedule a repaint, which will process
|
||||||
* pending frame callbacks. */
|
* pending frame callbacks. */
|
||||||
|
|||||||
@@ -791,11 +791,11 @@ vt_func(struct weston_compositor *base, int event)
|
|||||||
|
|
||||||
compositor->base.focus = 0;
|
compositor->base.focus = 0;
|
||||||
compositor->prev_state = compositor->base.state;
|
compositor->prev_state = compositor->base.state;
|
||||||
compositor->base.state = WESTON_COMPOSITOR_SLEEPING;
|
weston_compositor_offscreen(&compositor->base);
|
||||||
|
|
||||||
/* If we have a repaint scheduled (from the idle handler), make
|
/* If we have a repaint scheduled (from the idle handler), make
|
||||||
* sure we cancel that so we don't try to pageflip when we're
|
* sure we cancel that so we don't try to pageflip when we're
|
||||||
* vt switched away. The SLEEPING state will prevent
|
* vt switched away. The OFFSCREEN state will prevent
|
||||||
* further attemps at repainting. When we switch
|
* further attemps at repainting. When we switch
|
||||||
* back, we schedule a repaint, which will process
|
* back, we schedule a repaint, which will process
|
||||||
* pending frame callbacks. */
|
* pending frame callbacks. */
|
||||||
|
|||||||
@@ -1381,12 +1381,12 @@ vt_func(struct weston_compositor *base, int event)
|
|||||||
|
|
||||||
compositor->base.focus = 0;
|
compositor->base.focus = 0;
|
||||||
compositor->prev_state = compositor->base.state;
|
compositor->prev_state = compositor->base.state;
|
||||||
compositor->base.state = WESTON_COMPOSITOR_SLEEPING;
|
weston_compositor_offscreen(&compositor->base);
|
||||||
|
|
||||||
/* If we have a repaint scheduled (either from a
|
/* If we have a repaint scheduled (either from a
|
||||||
* pending pageflip or the idle handler), make sure we
|
* pending pageflip or the idle handler), make sure we
|
||||||
* cancel that so we don't try to pageflip when we're
|
* cancel that so we don't try to pageflip when we're
|
||||||
* vt switched away. The SLEEPING state will prevent
|
* vt switched away. The OFFSCREEN state will prevent
|
||||||
* further attemps at repainting. When we switch
|
* further attemps at repainting. When we switch
|
||||||
* back, we schedule a repaint, which will process
|
* back, we schedule a repaint, which will process
|
||||||
* pending frame callbacks. */
|
* pending frame callbacks. */
|
||||||
|
|||||||
+20
-2
@@ -1325,7 +1325,8 @@ weston_output_schedule_repaint(struct weston_output *output)
|
|||||||
struct weston_compositor *compositor = output->compositor;
|
struct weston_compositor *compositor = output->compositor;
|
||||||
struct wl_event_loop *loop;
|
struct wl_event_loop *loop;
|
||||||
|
|
||||||
if (compositor->state == WESTON_COMPOSITOR_SLEEPING)
|
if (compositor->state == WESTON_COMPOSITOR_SLEEPING ||
|
||||||
|
compositor->state == WESTON_COMPOSITOR_OFFSCREEN)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
loop = wl_display_get_event_loop(compositor->wl_display);
|
loop = wl_display_get_event_loop(compositor->wl_display);
|
||||||
@@ -1670,6 +1671,7 @@ weston_compositor_wake(struct weston_compositor *compositor)
|
|||||||
weston_compositor_dpms(compositor, WESTON_DPMS_ON);
|
weston_compositor_dpms(compositor, WESTON_DPMS_ON);
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case WESTON_COMPOSITOR_IDLE:
|
case WESTON_COMPOSITOR_IDLE:
|
||||||
|
case WESTON_COMPOSITOR_OFFSCREEN:
|
||||||
wl_signal_emit(&compositor->wake_signal, compositor);
|
wl_signal_emit(&compositor->wake_signal, compositor);
|
||||||
/* fall through */
|
/* fall through */
|
||||||
default:
|
default:
|
||||||
@@ -1679,12 +1681,28 @@ weston_compositor_wake(struct weston_compositor *compositor)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WL_EXPORT void
|
||||||
|
weston_compositor_offscreen(struct weston_compositor *compositor)
|
||||||
|
{
|
||||||
|
switch (compositor->state) {
|
||||||
|
case WESTON_COMPOSITOR_OFFSCREEN:
|
||||||
|
return;
|
||||||
|
case WESTON_COMPOSITOR_SLEEPING:
|
||||||
|
weston_compositor_dpms(compositor, WESTON_DPMS_ON);
|
||||||
|
/* fall through */
|
||||||
|
default:
|
||||||
|
compositor->state = WESTON_COMPOSITOR_OFFSCREEN;
|
||||||
|
wl_event_source_timer_update(compositor->idle_source, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
weston_compositor_sleep(struct weston_compositor *compositor)
|
weston_compositor_sleep(struct weston_compositor *compositor)
|
||||||
{
|
{
|
||||||
if (compositor->state == WESTON_COMPOSITOR_SLEEPING)
|
if (compositor->state == WESTON_COMPOSITOR_SLEEPING)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
wl_event_source_timer_update(compositor->idle_source, 0);
|
||||||
compositor->state = WESTON_COMPOSITOR_SLEEPING;
|
compositor->state = WESTON_COMPOSITOR_SLEEPING;
|
||||||
weston_compositor_dpms(compositor, WESTON_DPMS_OFF);
|
weston_compositor_dpms(compositor, WESTON_DPMS_OFF);
|
||||||
}
|
}
|
||||||
@@ -3619,7 +3637,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
out:
|
out:
|
||||||
/* prevent further rendering while shutting down */
|
/* prevent further rendering while shutting down */
|
||||||
ec->state = WESTON_COMPOSITOR_SLEEPING;
|
ec->state = WESTON_COMPOSITOR_OFFSCREEN;
|
||||||
|
|
||||||
wl_signal_emit(&ec->destroy_signal, ec);
|
wl_signal_emit(&ec->destroy_signal, ec);
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -262,7 +262,9 @@ struct weston_seat {
|
|||||||
enum {
|
enum {
|
||||||
WESTON_COMPOSITOR_ACTIVE,
|
WESTON_COMPOSITOR_ACTIVE,
|
||||||
WESTON_COMPOSITOR_IDLE, /* shell->unlock called on activity */
|
WESTON_COMPOSITOR_IDLE, /* shell->unlock called on activity */
|
||||||
WESTON_COMPOSITOR_SLEEPING /* no rendering, no frame events */
|
WESTON_COMPOSITOR_OFFSCREEN, /* no rendering, no frame events */
|
||||||
|
WESTON_COMPOSITOR_SLEEPING /* same as offscreen, but also set dmps
|
||||||
|
* to off */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct weston_layer {
|
struct weston_layer {
|
||||||
@@ -621,6 +623,8 @@ weston_compositor_unlock(struct weston_compositor *compositor);
|
|||||||
void
|
void
|
||||||
weston_compositor_wake(struct weston_compositor *compositor);
|
weston_compositor_wake(struct weston_compositor *compositor);
|
||||||
void
|
void
|
||||||
|
weston_compositor_offscreen(struct weston_compositor *compositor);
|
||||||
|
void
|
||||||
weston_compositor_sleep(struct weston_compositor *compositor);
|
weston_compositor_sleep(struct weston_compositor *compositor);
|
||||||
void
|
void
|
||||||
weston_compositor_update_drag_surfaces(struct weston_compositor *compositor);
|
weston_compositor_update_drag_surfaces(struct weston_compositor *compositor);
|
||||||
|
|||||||
Reference in New Issue
Block a user