uint32_t crtc_allocator;
uint32_t connector_allocator;
struct tty *tty;
+
+ uint32_t prev_state;
};
struct drm_mode {
case TTY_ENTER_VT:
compositor->focus = 1;
drmSetMaster(ec->drm.fd);
- compositor->state = WLSC_COMPOSITOR_ACTIVE;
+ compositor->state = ec->prev_state;
wlsc_compositor_damage_all(compositor);
break;
case TTY_LEAVE_VT:
compositor->focus = 0;
+ ec->prev_state = compositor->state;
compositor->state = WLSC_COMPOSITOR_SLEEPING;
wl_list_for_each(output, &ec->base.output_list, link)
ec->base.focus = 1;
+ ec->prev_state = WLSC_COMPOSITOR_ACTIVE;
+
glGenFramebuffers(1, &ec->base.fbo);
glBindFramebuffer(GL_FRAMEBUFFER, ec->base.fbo);
WL_EXPORT void
wlsc_compositor_activity(struct wlsc_compositor *compositor)
{
- if (compositor->state != WLSC_COMPOSITOR_SLEEPING) {
+ if (compositor->state == WLSC_COMPOSITOR_ACTIVE) {
wlsc_compositor_wake(compositor);
} else {
compositor->shell->unlock(compositor->shell);
enum {
WLSC_COMPOSITOR_ACTIVE,
- WLSC_COMPOSITOR_SLEEPING
+ WLSC_COMPOSITOR_IDLE, /* shell->unlock called on activity */
+ WLSC_COMPOSITOR_SLEEPING /* no rendering, no frame events */
};
struct wlsc_compositor {
wl_list_for_each(shsurf, &shell->screensaver.surfaces, link)
show_screensaver(shell, shsurf);
- if (!wl_list_empty(&shell->screensaver.surfaces))
+ if (!wl_list_empty(&shell->screensaver.surfaces)) {
wlsc_compositor_wake(shell->compositor);
+ shell->compositor->state = WLSC_COMPOSITOR_IDLE;
+ }
/* reset pointer foci */
wlsc_compositor_repick(shell->compositor);
if (shell->locked) {
show_screensaver(shell, shsurf);
wlsc_compositor_wake(compositor);
+ if (!shell->lock_surface)
+ compositor->state = WLSC_COMPOSITOR_IDLE;
}
do_configure = 0;
break;