4343
4444#include "gpm-common.h"
4545#include "gpm-phone.h"
46- #include "gpm-idletime.h"
46+ #include <libcinnamon-desktop/gnome-idle-monitor.h>
4747#include "cinnamon-settings-profile.h"
4848#include "cinnamon-settings-session.h"
4949#include "csd-enums.h"
9494
9595#define XSCREENSAVER_WATCHDOG_TIMEOUT 120 /* seconds */
9696
97- enum {
98- CSD_POWER_IDLETIME_NULL_ID ,
99- CSD_POWER_IDLETIME_DIM_ID ,
100- CSD_POWER_IDLETIME_LOCK_ID ,
101- CSD_POWER_IDLETIME_BLANK_ID ,
102- CSD_POWER_IDLETIME_SLEEP_ID
103- };
104-
10597/* on ACPI machines we have 4-16 levels, on others it's ~150 */
10698#define BRIGHTNESS_STEP_AMOUNT (max ) ((max) < 20 ? 1 : (max) / 20)
10799
@@ -178,8 +170,16 @@ struct CsdPowerManagerPrivate
178170 GDBusProxy * screensaver_proxy ;
179171 GDBusProxy * session_proxy ;
180172 GDBusProxy * session_presence_proxy ;
181- GpmIdletime * idletime ;
173+
174+ /* Idle monitoring */
175+ GnomeIdleMonitor * idle_monitor ;
176+ guint idle_dim_id ;
177+ guint idle_lock_id ;
178+ guint idle_blank_id ;
179+ guint idle_sleep_id ;
180+ guint user_active_id ;
182181 CsdPowerIdleMode current_idle_mode ;
182+
183183 guint lid_close_safety_timer_id ;
184184 guint xscreensaver_watchdog_timer_id ;
185185 gboolean is_virtual_machine ;
@@ -227,6 +227,9 @@ static void connect_power_iface (CsdPowerManager *manager);
227227static void connect_screen_iface (CsdPowerManager * manager );
228228static void connect_keyboard_iface (CsdPowerManager * manager );
229229
230+ static void idle_triggered_idle_cb (GnomeIdleMonitor * monitor , guint watch_id , gpointer user_data );
231+ static void idle_became_active_cb (GnomeIdleMonitor * monitor , guint watch_id , gpointer user_data );
232+
230233G_DEFINE_TYPE (CsdPowerManager , csd_power_manager , G_TYPE_OBJECT )
231234
232235static gpointer manager_object = NULL ;
@@ -3172,6 +3175,15 @@ idle_adjust_timeout (guint idle_time, guint timeout)
31723175 return timeout ;
31733176}
31743177
3178+ static void
3179+ clear_idle_watch (GnomeIdleMonitor * monitor , guint * id )
3180+ {
3181+ if (* id == 0 )
3182+ return ;
3183+ gnome_idle_monitor_remove_watch (monitor , * id );
3184+ * id = 0 ;
3185+ }
3186+
31753187/**
31763188 * @timeout: The new timeout we want to set, in seconds
31773189 **/
@@ -3188,23 +3200,24 @@ idle_set_timeout_dim (CsdPowerManager *manager, guint timeout)
31883200 g_debug ("inhibited, so using normal state" );
31893201 idle_set_mode (manager , CSD_POWER_IDLE_MODE_NORMAL );
31903202
3191- gpm_idletime_alarm_remove (manager -> priv -> idletime ,
3192- CSD_POWER_IDLETIME_DIM_ID );
3203+ clear_idle_watch (manager -> priv -> idle_monitor ,
3204+ & manager -> priv -> idle_dim_id );
31933205 return ;
31943206 }
31953207
3196- idle_time = gpm_idletime_get_time (manager -> priv -> idletime ) / 1000 ;
3208+ idle_time = gnome_idle_monitor_get_idletime (manager -> priv -> idle_monitor ) / 1000 ;
31973209
31983210 g_debug ("Setting dim idle timeout: %ds" , timeout );
3211+ clear_idle_watch (manager -> priv -> idle_monitor ,
3212+ & manager -> priv -> idle_dim_id );
31993213 if (timeout > 0 ) {
3200- gpm_idletime_alarm_set ( manager -> priv -> idletime ,
3201- CSD_POWER_IDLETIME_DIM_ID ,
3202- idle_adjust_timeout (idle_time , timeout ) * 1000 );
3203- } else {
3204- gpm_idletime_alarm_remove ( manager -> priv -> idletime ,
3205- CSD_POWER_IDLETIME_DIM_ID );
3214+ manager -> priv -> idle_dim_id =
3215+ gnome_idle_monitor_add_idle_watch ( manager -> priv -> idle_monitor ,
3216+ idle_adjust_timeout (idle_time , timeout ) * 1000 ,
3217+ idle_triggered_idle_cb ,
3218+ manager ,
3219+ NULL );
32063220 }
3207- return ;
32083221}
32093222
32103223static void
@@ -3250,18 +3263,18 @@ idle_configure (CsdPowerManager *manager)
32503263 g_debug ("inhibited, so using normal state" );
32513264 idle_set_mode (manager , CSD_POWER_IDLE_MODE_NORMAL );
32523265
3253- gpm_idletime_alarm_remove (manager -> priv -> idletime ,
3254- CSD_POWER_IDLETIME_LOCK_ID );
3255- gpm_idletime_alarm_remove (manager -> priv -> idletime ,
3256- CSD_POWER_IDLETIME_BLANK_ID );
3257- gpm_idletime_alarm_remove (manager -> priv -> idletime ,
3258- CSD_POWER_IDLETIME_SLEEP_ID );
3266+ clear_idle_watch (manager -> priv -> idle_monitor ,
3267+ & manager -> priv -> idle_lock_id );
3268+ clear_idle_watch (manager -> priv -> idle_monitor ,
3269+ & manager -> priv -> idle_blank_id );
3270+ clear_idle_watch (manager -> priv -> idle_monitor ,
3271+ & manager -> priv -> idle_sleep_id );
32593272
32603273 refresh_idle_dim_settings (manager );
32613274 return ;
32623275 }
32633276
3264- current_idle_time = gpm_idletime_get_time (manager -> priv -> idletime ) / 1000 ;
3277+ current_idle_time = gnome_idle_monitor_get_idletime (manager -> priv -> idle_monitor ) / 1000 ;
32653278
32663279 /* set up blank callback even when session is not idle,
32673280 * but only if we actually want to blank. */
@@ -3277,30 +3290,34 @@ idle_configure (CsdPowerManager *manager)
32773290 /* set up custom screensaver lock after idle time trigger */
32783291 timeout_lock = g_settings_get_uint (manager -> priv -> settings_desktop_session ,
32793292 "idle-delay" );
3293+ clear_idle_watch (manager -> priv -> idle_monitor ,
3294+ & manager -> priv -> idle_lock_id );
32803295 if (timeout_lock != 0 ) {
32813296 if (timeout_blank != 0 && timeout_lock > timeout_blank ) {
32823297 g_debug ("reducing lock timeout to match blank timeout" );
32833298 timeout_lock = timeout_blank ;
32843299 }
32853300 g_debug ("setting up lock callback for %is" , timeout_lock );
32863301
3287- gpm_idletime_alarm_set ( manager -> priv -> idletime ,
3288- CSD_POWER_IDLETIME_LOCK_ID ,
3289- idle_adjust_timeout (current_idle_time , timeout_lock ) * 1000 );
3290- } else {
3291- gpm_idletime_alarm_remove ( manager -> priv -> idletime ,
3292- CSD_POWER_IDLETIME_LOCK_ID );
3302+ manager -> priv -> idle_lock_id =
3303+ gnome_idle_monitor_add_idle_watch ( manager -> priv -> idle_monitor ,
3304+ idle_adjust_timeout (current_idle_time , timeout_lock ) * 1000 ,
3305+ idle_triggered_idle_cb ,
3306+ manager ,
3307+ NULL );
32933308 }
32943309
3310+ clear_idle_watch (manager -> priv -> idle_monitor ,
3311+ & manager -> priv -> idle_blank_id );
32953312 if (timeout_blank != 0 ) {
32963313 g_debug ("setting up blank callback for %is" , timeout_blank );
32973314
3298- gpm_idletime_alarm_set ( manager -> priv -> idletime ,
3299- CSD_POWER_IDLETIME_BLANK_ID ,
3300- idle_adjust_timeout_blank (current_idle_time , timeout_blank ) * 1000 );
3301- } else {
3302- gpm_idletime_alarm_remove ( manager -> priv -> idletime ,
3303- CSD_POWER_IDLETIME_BLANK_ID );
3315+ manager -> priv -> idle_blank_id =
3316+ gnome_idle_monitor_add_idle_watch ( manager -> priv -> idle_monitor ,
3317+ idle_adjust_timeout_blank (current_idle_time , timeout_blank ) * 1000 ,
3318+ idle_triggered_idle_cb ,
3319+ manager ,
3320+ NULL );
33043321 }
33053322
33063323 gboolean is_sleep_inhibited = idle_is_session_inhibited (manager ,
@@ -3314,15 +3331,17 @@ idle_configure (CsdPowerManager *manager)
33143331 timeout_sleep = g_settings_get_int (manager -> priv -> settings ,
33153332 "sleep-inactive-ac-timeout" );
33163333 }
3334+ clear_idle_watch (manager -> priv -> idle_monitor ,
3335+ & manager -> priv -> idle_sleep_id );
33173336 if (!is_sleep_inhibited && timeout_sleep != 0 ) {
33183337 g_debug ("setting up sleep callback %is" , timeout_sleep );
33193338
3320- gpm_idletime_alarm_set ( manager -> priv -> idletime ,
3321- CSD_POWER_IDLETIME_SLEEP_ID ,
3322- idle_adjust_timeout (current_idle_time , timeout_sleep ) * 1000 );
3323- } else {
3324- gpm_idletime_alarm_remove ( manager -> priv -> idletime ,
3325- CSD_POWER_IDLETIME_SLEEP_ID );
3339+ manager -> priv -> idle_sleep_id =
3340+ gnome_idle_monitor_add_idle_watch ( manager -> priv -> idle_monitor ,
3341+ idle_adjust_timeout (current_idle_time , timeout_sleep ) * 1000 ,
3342+ idle_triggered_idle_cb ,
3343+ manager ,
3344+ NULL );
33263345 }
33273346
33283347 refresh_idle_dim_settings (manager );
@@ -3613,48 +3632,54 @@ power_keyboard_proxy_ready_cb (GObject *source_object,
36133632}
36143633
36153634static void
3616- idle_idletime_alarm_expired_cb ( GpmIdletime * idletime ,
3617- guint alarm_id ,
3618- CsdPowerManager * manager )
3635+ idle_triggered_idle_cb ( GnomeIdleMonitor * monitor ,
3636+ guint watch_id ,
3637+ gpointer user_data )
36193638{
3620- g_debug ( "idletime alarm: %i" , alarm_id );
3639+ CsdPowerManager * manager = CSD_POWER_MANAGER ( user_data );
36213640
3622- switch (alarm_id ) {
3623- case CSD_POWER_IDLETIME_DIM_ID :
3641+ g_debug ("idletime watch: %i" , watch_id );
3642+
3643+ if (watch_id == manager -> priv -> idle_dim_id ) {
36243644 idle_set_mode (manager , CSD_POWER_IDLE_MODE_DIM );
3625- break ;
3626- case CSD_POWER_IDLETIME_LOCK_ID :
3627- ; /* empty statement, because C does not allow a declaration to
3628- * follow a label */
3645+ } else if (watch_id == manager -> priv -> idle_lock_id ) {
36293646 gchar * custom_saver = g_settings_get_string (manager -> priv -> settings_screensaver ,
36303647 "custom-screensaver-command" );
36313648 if (custom_saver && g_strcmp0 (custom_saver , "" ) != 0 ) {
36323649 lock_screen_with_custom_saver (manager ,
36333650 custom_saver ,
36343651 TRUE);
36353652 } else {
3636- activate_screensaver (manager , FALSE);
3653+ activate_screensaver (manager , FALSE);
36373654 }
3638-
36393655 g_free (custom_saver );
3640-
3641- break ;
3642- case CSD_POWER_IDLETIME_BLANK_ID :
3656+ } else if (watch_id == manager -> priv -> idle_blank_id ) {
36433657 idle_set_mode (manager , CSD_POWER_IDLE_MODE_BLANK );
3644- break ;
3645- case CSD_POWER_IDLETIME_SLEEP_ID :
3658+ } else if (watch_id == manager -> priv -> idle_sleep_id ) {
36463659 idle_set_mode (manager , CSD_POWER_IDLE_MODE_SLEEP );
3647- break ;
3660+ }
3661+
3662+ /* Add user-active watch to detect when user returns */
3663+ if (manager -> priv -> user_active_id == 0 ) {
3664+ manager -> priv -> user_active_id =
3665+ gnome_idle_monitor_add_user_active_watch (manager -> priv -> idle_monitor ,
3666+ idle_became_active_cb ,
3667+ manager ,
3668+ NULL );
36483669 }
36493670}
36503671
36513672static void
3652- idle_idletime_reset_cb (GpmIdletime * idletime ,
3653- CsdPowerManager * manager )
3673+ idle_became_active_cb (GnomeIdleMonitor * monitor ,
3674+ guint watch_id ,
3675+ gpointer user_data )
36543676{
3677+ CsdPowerManager * manager = CSD_POWER_MANAGER (user_data );
3678+
36553679 g_debug ("idletime reset" );
36563680
36573681 idle_set_mode (manager , CSD_POWER_IDLE_MODE_NORMAL );
3682+ manager -> priv -> user_active_id = 0 ;
36583683}
36593684
36603685static void
@@ -4186,12 +4211,8 @@ on_rr_screen_acquired (GObject *object,
41864211
41874212 refresh_notification_settings (manager );
41884213
4189- /* create IDLETIME watcher */
4190- manager -> priv -> idletime = gpm_idletime_new ();
4191- g_signal_connect (manager -> priv -> idletime , "reset" ,
4192- G_CALLBACK (idle_idletime_reset_cb ), manager );
4193- g_signal_connect (manager -> priv -> idletime , "alarm-expired" ,
4194- G_CALLBACK (idle_idletime_alarm_expired_cb ), manager );
4214+ /* create idle monitor */
4215+ manager -> priv -> idle_monitor = gnome_idle_monitor_new ();
41954216
41964217 /* set up the screens */
41974218 g_signal_connect (manager -> priv -> x11_screen , "changed" , G_CALLBACK (on_randr_event ), manager );
@@ -4372,17 +4393,8 @@ csd_power_manager_stop (CsdPowerManager *manager)
43724393 g_source_remove (manager -> priv -> critical_alert_timeout_id );
43734394 manager -> priv -> critical_alert_timeout_id = 0 ;
43744395 }
4375- g_signal_handlers_disconnect_by_func (manager -> priv -> idletime ,
4376- idle_idletime_reset_cb ,
4377- manager );
4378- g_signal_handlers_disconnect_by_func (manager -> priv -> idletime ,
4379- idle_idletime_alarm_expired_cb ,
4380- manager );
43814396
4382- if (manager -> priv -> idletime != NULL ) {
4383- g_object_unref (manager -> priv -> idletime );
4384- manager -> priv -> idletime = NULL ;
4385- }
4397+ g_clear_object (& manager -> priv -> idle_monitor );
43864398
43874399 if (manager -> priv -> xscreensaver_watchdog_timer_id > 0 ) {
43884400 g_source_remove (manager -> priv -> xscreensaver_watchdog_timer_id );
0 commit comments