From df980461899ecf1c0daf214a26b97689b1429004 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Wed, 28 Nov 2012 21:55:50 +0100 Subject: [PATCH] seat: activate displays only when being in foreground We shouldn't activate displays when we are active but in background. In these moments, the uterm-video device might not be initialized, yet. Signed-off-by: David Herrmann --- src/kmscon_seat.c | 79 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/src/kmscon_seat.c b/src/kmscon_seat.c index f24c56d..11328a7 100644 --- a/src/kmscon_seat.c +++ b/src/kmscon_seat.c @@ -131,9 +131,43 @@ static void session_call_display_gone(struct kmscon_session *sess, session_call(sess, KMSCON_SESSION_DISPLAY_GONE, disp); } +static void activate_display(struct kmscon_display *d) +{ + int ret; + struct shl_dlist *iter, *tmp; + struct kmscon_session *s; + struct kmscon_seat *seat = d->seat; + + if (d->activated || !d->seat->awake || !d->seat->foreground) + return; + + /* TODO: We always use the default mode for new displays but we should + * rather allow the user to specify different modes in the configuration + * files. */ + if (uterm_display_get_state(d->disp) == UTERM_DISPLAY_INACTIVE) { + ret = uterm_display_activate(d->disp, NULL); + if (ret) + return; + + d->activated = true; + + shl_dlist_for_each_safe(iter, tmp, &seat->sessions) { + s = shl_dlist_entry(iter, struct kmscon_session, list); + session_call_display_new(s, d->disp); + } + + ret = uterm_display_set_dpms(d->disp, UTERM_DPMS_ON); + if (ret) + log_warning("cannot set DPMS state to on for display: %d", + ret); + } +} + static int seat_go_foreground(struct kmscon_seat *seat, bool force) { int ret; + struct shl_dlist *iter; + struct kmscon_display *d; if (seat->foreground) return 0; @@ -150,6 +184,12 @@ static int seat_go_foreground(struct kmscon_seat *seat, bool force) } seat->foreground = true; + + shl_dlist_for_each(iter, &seat->displays) { + d = shl_dlist_entry(iter, struct kmscon_display, list); + activate_display(d); + } + return 0; } @@ -207,43 +247,9 @@ static int seat_go_asleep(struct kmscon_seat *seat, bool force) return err; } -static void activate_display(struct kmscon_display *d) -{ - int ret; - struct shl_dlist *iter, *tmp; - struct kmscon_session *s; - struct kmscon_seat *seat = d->seat; - - if (d->activated) - return; - - /* TODO: We always use the default mode for new displays but we should - * rather allow the user to specify different modes in the configuration - * files. */ - if (uterm_display_get_state(d->disp) == UTERM_DISPLAY_INACTIVE) { - ret = uterm_display_activate(d->disp, NULL); - if (ret) - return; - - d->activated = true; - - shl_dlist_for_each_safe(iter, tmp, &seat->sessions) { - s = shl_dlist_entry(iter, struct kmscon_session, list); - session_call_display_new(s, d->disp); - } - - ret = uterm_display_set_dpms(d->disp, UTERM_DPMS_ON); - if (ret) - log_warning("cannot set DPMS state to on for display: %d", - ret); - } -} - static int seat_go_awake(struct kmscon_seat *seat) { int ret; - struct shl_dlist *iter; - struct kmscon_display *d; if (seat->awake) return 0; @@ -260,11 +266,6 @@ static int seat_go_awake(struct kmscon_seat *seat) seat->awake = true; uterm_input_wake_up(seat->input); - shl_dlist_for_each(iter, &seat->displays) { - d = shl_dlist_entry(iter, struct kmscon_display, list); - activate_display(d); - } - return 0; } -- 2.7.4