Skip to content

Commit bb4287d

Browse files
authored
power: Remove GpmIdleTime, use libcinnamon-desktop IdleMonitor. (#436)
GnomeIdleMonitor is used in cinnamon-session already and will be used in cinnamon's screensaver implementation. It interfaces with muffin's MetaIdleMonitor over dbus and will allow user activity to be noticed in wayland sessions also. Fixes linuxmint/wayland#157. Fixes linuxmint/wayland#62.
1 parent 1846634 commit bb4287d

4 files changed

Lines changed: 93 additions & 630 deletions

File tree

plugins/power/csd-power-manager.c

Lines changed: 93 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
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"
@@ -94,14 +94,6 @@
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);
227227
static void connect_screen_iface (CsdPowerManager *manager);
228228
static 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+
230233
G_DEFINE_TYPE (CsdPowerManager, csd_power_manager, G_TYPE_OBJECT)
231234

232235
static 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

32103223
static 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

36153634
static 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

36513672
static 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

36603685
static 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

Comments
 (0)