diff options
author | Philipp Brüschweiler <blei42@gmail.com> | 2013-03-29 13:01:56 +0100 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-03-29 14:05:27 -0400 |
commit | 57edf7f49ec9349f65b0e8cc330f9e6aa94f8a38 (patch) | |
tree | 17d686ad63fc624dc092b1baf4fe8d400ece5b75 | |
parent | cee79e91f3efaecc8fb1982dfd70c9aa6dcf4a24 (diff) |
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).
-rw-r--r-- | src/compositor-drm.c | 4 | ||||
-rw-r--r-- | src/compositor-fbdev.c | 4 | ||||
-rw-r--r-- | src/compositor-rpi.c | 4 | ||||
-rw-r--r-- | src/compositor.c | 22 | ||||
-rw-r--r-- | src/compositor.h | 6 |
5 files changed, 31 insertions, 9 deletions
diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 3d200ddd..6e0a126d 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -2020,12 +2020,12 @@ vt_func(struct weston_compositor *compositor, int event) compositor->focus = 0; ec->prev_state = compositor->state; - compositor->state = WESTON_COMPOSITOR_SLEEPING; + weston_compositor_offscreen(compositor); /* If we have a repaint scheduled (either from a * pending pageflip or the idle handler), make 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 * back, we schedule a repaint, which will process * pending frame callbacks. */ diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c index 070d187c..61cacc79 100644 --- a/src/compositor-fbdev.c +++ b/src/compositor-fbdev.c @@ -791,11 +791,11 @@ vt_func(struct weston_compositor *base, int event) compositor->base.focus = 0; 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 * 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 * back, we schedule a repaint, which will process * pending frame callbacks. */ diff --git a/src/compositor-rpi.c b/src/compositor-rpi.c index 30bbceae..cae6f7b9 100644 --- a/src/compositor-rpi.c +++ b/src/compositor-rpi.c @@ -1381,12 +1381,12 @@ vt_func(struct weston_compositor *base, int event) compositor->base.focus = 0; 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 * pending pageflip or the idle handler), make 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 * back, we schedule a repaint, which will process * pending frame callbacks. */ diff --git a/src/compositor.c b/src/compositor.c index 52d6f90f..1617d964 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1325,7 +1325,8 @@ weston_output_schedule_repaint(struct weston_output *output) struct weston_compositor *compositor = output->compositor; struct wl_event_loop *loop; - if (compositor->state == WESTON_COMPOSITOR_SLEEPING) + if (compositor->state == WESTON_COMPOSITOR_SLEEPING || + compositor->state == WESTON_COMPOSITOR_OFFSCREEN) return; 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); /* fall through */ case WESTON_COMPOSITOR_IDLE: + case WESTON_COMPOSITOR_OFFSCREEN: wl_signal_emit(&compositor->wake_signal, compositor); /* fall through */ default: @@ -1680,11 +1682,27 @@ 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 weston_compositor_sleep(struct weston_compositor *compositor) { if (compositor->state == WESTON_COMPOSITOR_SLEEPING) return; + wl_event_source_timer_update(compositor->idle_source, 0); compositor->state = WESTON_COMPOSITOR_SLEEPING; weston_compositor_dpms(compositor, WESTON_DPMS_OFF); } @@ -3619,7 +3637,7 @@ int main(int argc, char *argv[]) out: /* prevent further rendering while shutting down */ - ec->state = WESTON_COMPOSITOR_SLEEPING; + ec->state = WESTON_COMPOSITOR_OFFSCREEN; wl_signal_emit(&ec->destroy_signal, ec); diff --git a/src/compositor.h b/src/compositor.h index 0ad60ef9..7d1d68e4 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -262,7 +262,9 @@ struct weston_seat { enum { WESTON_COMPOSITOR_ACTIVE, 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 { @@ -621,6 +623,8 @@ weston_compositor_unlock(struct weston_compositor *compositor); void weston_compositor_wake(struct weston_compositor *compositor); void +weston_compositor_offscreen(struct weston_compositor *compositor); +void weston_compositor_sleep(struct weston_compositor *compositor); void weston_compositor_update_drag_surfaces(struct weston_compositor *compositor); |