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).
dev
Philipp Brüschweiler 12 years ago committed by Kristian Høgsberg
parent cee79e91f3
commit 57edf7f49e
  1. 4
      src/compositor-drm.c
  2. 4
      src/compositor-fbdev.c
  3. 4
      src/compositor-rpi.c
  4. 22
      src/compositor.c
  5. 6
      src/compositor.h

@ -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. */

@ -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);

@ -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);

Loading…
Cancel
Save