@@ -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
18931894turn_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
19081919static 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)
39663978static void
39673979handle_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