Skip to content

Commit 3298eae

Browse files
authored
csd-power-manager.c: Don't turn monitors off before suspend/hibernate. (#442)
* csd-power-manager.c: Don't turn monitors off before suspend/hibernate. This happens automatically anyhow, and doing it here, pre-emptively, can interfere with proper hiding of the desktop by the screensaver. Put a small delay before turning monitors off during the 'BLANK' action (like when "Lock Screen" is the close-lid action), to allow the screensaver to be fully effective. * Increase delay in blanking, track source ID so it can be cancelled if state changes early.
1 parent bb4287d commit 3298eae

1 file changed

Lines changed: 17 additions & 18 deletions

File tree

plugins/power/csd-power-manager.c

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ struct CsdPowerManagerPrivate
182182

183183
guint lid_close_safety_timer_id;
184184
guint xscreensaver_watchdog_timer_id;
185+
guint turn_monitors_off_id;
185186
gboolean is_virtual_machine;
186187
gint fd_close_loop_end;
187188

@@ -1889,12 +1890,14 @@ cinnamon_session_shutdown (void)
18891890
g_object_unref (proxy);
18901891
}
18911892

1892-
static void
1893+
static gboolean
18931894
turn_monitors_off (CsdPowerManager *manager)
18941895
{
18951896
gboolean ret;
18961897
GError *error = NULL;
18971898

1899+
manager->priv->turn_monitors_off_id = 0;
1900+
18981901
ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
18991902
GNOME_RR_DPMS_OFF,
19001903
&error);
@@ -1903,6 +1906,14 @@ turn_monitors_off (CsdPowerManager *manager)
19031906
error->message);
19041907
g_error_free (error);
19051908
}
1909+
1910+
return G_SOURCE_REMOVE;
1911+
}
1912+
1913+
static void
1914+
cancel_turn_monitors_off (CsdPowerManager *manager)
1915+
{
1916+
g_clear_handle_id (&manager->priv->turn_monitors_off_id, g_source_remove);
19061917
}
19071918

19081919
static void
@@ -1915,8 +1926,6 @@ do_power_action_type (CsdPowerManager *manager,
19151926
activate_screensaver (manager, TRUE);
19161927
}
19171928

1918-
turn_monitors_off (manager);
1919-
19201929
gboolean hybrid = g_settings_get_boolean (manager->priv->settings_cinnamon_session,
19211930
"prefer-hybrid-sleep");
19221931
gboolean suspend_then_hibernate = g_settings_get_boolean (manager->priv->settings_cinnamon_session,
@@ -1932,7 +1941,6 @@ do_power_action_type (CsdPowerManager *manager,
19321941
activate_screensaver (manager, TRUE);
19331942
}
19341943

1935-
turn_monitors_off (manager);
19361944
csd_power_hibernate ();
19371945
break;
19381946
case CSD_POWER_ACTION_SHUTDOWN:
@@ -1945,7 +1953,7 @@ do_power_action_type (CsdPowerManager *manager,
19451953
/* Lock first or else xrandr might reconfigure stuff and the ss's coverage
19461954
* may be incorrect upon return. */
19471955
activate_screensaver (manager, FALSE);
1948-
turn_monitors_off (manager);
1956+
manager->priv->turn_monitors_off_id = g_timeout_add_seconds (2, (GSourceFunc) turn_monitors_off, manager);
19491957
break;
19501958
case CSD_POWER_ACTION_NOTHING:
19511959
break;
@@ -2182,6 +2190,8 @@ do_lid_open_action (CsdPowerManager *manager)
21822190
gboolean ret;
21832191
GError *error = NULL;
21842192

2193+
cancel_turn_monitors_off (manager);
2194+
21852195
/* play a sound, using sounds from the naming spec */
21862196
ca_context_play (manager->priv->canberra_context, 0,
21872197
CA_PROP_EVENT_ID, "lid-open",
@@ -3058,6 +3068,8 @@ idle_set_mode (CsdPowerManager *manager, CsdPowerIdleMode mode)
30583068
/* turn on screen and restore user-selected brightness level */
30593069
} else if (mode == CSD_POWER_IDLE_MODE_NORMAL) {
30603070

3071+
cancel_turn_monitors_off (manager);
3072+
30613073
ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
30623074
GNOME_RR_DPMS_ON,
30633075
&error);
@@ -3966,9 +3978,6 @@ handle_suspend_actions (CsdPowerManager *manager)
39663978
static void
39673979
handle_resume_actions (CsdPowerManager *manager)
39683980
{
3969-
gboolean ret;
3970-
GError *error = NULL;
3971-
39723981
/* this displays the unlock dialogue so the user doesn't have
39733982
* to move the mouse or press any key before the window comes up */
39743983
g_dbus_connection_call (manager->priv->connection,
@@ -3985,16 +3994,6 @@ handle_resume_actions (CsdPowerManager *manager)
39853994
notify_close_if_showing (manager->priv->notification_low);
39863995
notify_close_if_showing (manager->priv->notification_discharging);
39873996

3988-
/* ensure we turn the panel back on after resume */
3989-
ret = gnome_rr_screen_set_dpms_mode (manager->priv->x11_screen,
3990-
GNOME_RR_DPMS_ON,
3991-
&error);
3992-
if (!ret) {
3993-
g_warning ("failed to turn the panel on after resume: %s",
3994-
error->message);
3995-
g_error_free (error);
3996-
}
3997-
39983997
/* set up the delay again */
39993998
inhibit_suspend (manager);
40003999
}

0 commit comments

Comments
 (0)