Skip to content

Commit 55e9291

Browse files
committed
cs-presence.c: Fix CsmPresence idle handling.
Idle detection was broken since 5.4, as gnome-idle-monitor (in libcinnamon-desktop) was looking for the wrong muffin interface names. This file was also adapted incompletely to the new idle-monitor API. requires: linuxmint/cinnamon-desktop@d0f8c74a7864786cf04
1 parent bab8748 commit 55e9291

File tree

2 files changed

+77
-59
lines changed

2 files changed

+77
-59
lines changed

cinnamon-session/csm-presence.c

Lines changed: 77 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,12 @@ struct CsmPresencePrivate
6464

6565
enum {
6666
PROP_0,
67-
PROP_STATUS,
68-
PROP_STATUS_TEXT,
6967
PROP_IDLE_ENABLED,
7068
PROP_IDLE_TIMEOUT,
7169
};
7270

73-
7471
enum {
7572
STATUS_CHANGED,
76-
STATUS_TEXT_CHANGED,
7773
LAST_SIGNAL
7874
};
7975

@@ -99,6 +95,10 @@ csm_presence_error_quark (void)
9995
return quark_volatile;
10096
}
10197

98+
static void idle_became_active_cb (GnomeIdleMonitor *idle_monitor,
99+
guint id,
100+
gpointer user_data);
101+
102102
static gboolean
103103
csm_presence_set_status_text (CsmPresence *presence,
104104
const char *status_text,
@@ -120,6 +120,8 @@ csm_presence_set_status_text (CsmPresence *presence,
120120

121121
if (status_text != NULL) {
122122
presence->priv->status_text = g_strdup (status_text);
123+
} else {
124+
presence->priv->status_text = g_strdup ("");
123125
}
124126

125127
csm_exported_presence_set_status_text (presence->priv->skeleton, presence->priv->status_text);
@@ -128,19 +130,18 @@ csm_presence_set_status_text (CsmPresence *presence,
128130
return TRUE;
129131
}
130132

131-
static gboolean
133+
static void
132134
csm_presence_set_status (CsmPresence *presence,
133135
guint status)
134136
{
135-
g_return_val_if_fail (CSM_IS_PRESENCE (presence), FALSE);
137+
g_return_if_fail (CSM_IS_PRESENCE (presence));
136138

137139
if (status != presence->priv->status) {
138140
presence->priv->status = status;
139141
csm_exported_presence_set_status (presence->priv->skeleton, status);
140142
csm_exported_presence_emit_status_changed (presence->priv->skeleton, presence->priv->status);
141143
g_signal_emit (presence, signals[STATUS_CHANGED], 0, presence->priv->status);
142144
}
143-
return TRUE;
144145
}
145146

146147
static void
@@ -158,6 +159,11 @@ set_session_idle (CsmPresence *presence,
158159
/* save current status */
159160
presence->priv->saved_status = presence->priv->status;
160161
csm_presence_set_status (presence, CSM_PRESENCE_STATUS_IDLE);
162+
163+
gnome_idle_monitor_add_user_active_watch (presence->priv->idle_monitor,
164+
idle_became_active_cb,
165+
presence,
166+
NULL);
161167
} else {
162168
if (presence->priv->status != CSM_PRESENCE_STATUS_IDLE) {
163169
g_debug ("CsmPresence: already not idle, ignoring");
@@ -171,40 +177,39 @@ set_session_idle (CsmPresence *presence,
171177
}
172178
}
173179

174-
static gboolean
175-
on_idle_timeout (GnomeIdleMonitor *monitor,
176-
guint id,
177-
gboolean condition,
178-
CsmPresence *presence)
180+
static void
181+
idle_became_idle_cb (GnomeIdleMonitor *idle_monitor,
182+
guint id,
183+
gpointer user_data)
179184
{
180-
gboolean handled;
181-
182-
handled = TRUE;
183-
set_session_idle (presence, condition);
185+
CsmPresence *presence = user_data;
186+
set_session_idle (presence, TRUE);
187+
}
184188

185-
return handled;
189+
static void
190+
idle_became_active_cb (GnomeIdleMonitor *idle_monitor,
191+
guint id,
192+
gpointer user_data)
193+
{
194+
CsmPresence *presence = user_data;
195+
set_session_idle (presence, FALSE);
186196
}
187197

188198
static void
189199
reset_idle_watch (CsmPresence *presence)
190200
{
191-
if (presence->priv->idle_monitor == NULL) {
192-
return;
193-
}
194-
195201
if (presence->priv->idle_watch_id > 0) {
196202
g_debug ("CsmPresence: removing idle watch (%i)", presence->priv->idle_watch_id);
197203
gnome_idle_monitor_remove_watch (presence->priv->idle_monitor,
198204
presence->priv->idle_watch_id);
199205
presence->priv->idle_watch_id = 0;
200206
}
201207

202-
if (! presence->priv->screensaver_active
203-
&& presence->priv->idle_enabled
208+
if (presence->priv->idle_enabled
204209
&& presence->priv->idle_timeout > 0) {
205210
presence->priv->idle_watch_id = gnome_idle_monitor_add_idle_watch (presence->priv->idle_monitor,
206211
presence->priv->idle_timeout,
207-
(GnomeIdleMonitorWatchFunc) on_idle_timeout,
212+
idle_became_idle_cb,
208213
presence,
209214
NULL);
210215
g_debug ("CsmPresence: adding idle watch (%i) for %d secs",
@@ -229,11 +234,36 @@ on_screensaver_g_signal (GDBusProxy *proxy,
229234
g_variant_get (parameters,
230235
"(b)", &is_active);
231236

232-
g_debug ("screensaver status changed: %d", is_active);
237+
if (presence->priv->screensaver_active != is_active) {
238+
presence->priv->screensaver_active = is_active;
239+
set_session_idle (presence, is_active);
240+
}
241+
}
242+
243+
static void
244+
screensaver_get_active_cb (GDBusProxy *screensaver_proxy,
245+
GAsyncResult *res,
246+
CsmPresence *presence)
247+
{
248+
g_autoptr(GVariant) data = NULL;
249+
g_autoptr(GError) error = NULL;
250+
gboolean is_active;
233251

252+
data = g_dbus_proxy_call_finish (screensaver_proxy, res, &error);
253+
if (!data) {
254+
if (error) {
255+
g_warning ("Could not retrieve current screensaver active state: %s",
256+
error->message);
257+
} else {
258+
g_warning ("Could not retrieve current screensaver active state!");
259+
}
260+
261+
return;
262+
}
263+
264+
g_variant_get (data, "(b)", &is_active);
234265
if (presence->priv->screensaver_active != is_active) {
235266
presence->priv->screensaver_active = is_active;
236-
reset_idle_watch (presence);
237267
set_session_idle (presence, is_active);
238268
}
239269
}
@@ -248,14 +278,25 @@ on_screensaver_name_owner_changed (GDBusProxy *proxy,
248278

249279
presence = CSM_PRESENCE (user_data);
250280
name_owner = g_dbus_proxy_get_name_owner (proxy);
281+
if (name_owner == NULL) {
282+
g_debug ("Detected that screensaver has left the bus");
251283

252-
if (name_owner && g_strcmp0 (name_owner, CS_NAME)) {
253-
g_warning ("Detected that screensaver has appeared on the bus");
254-
} else {
255-
g_warning ("Detected that screensaver has left the bus");
284+
presence->priv->screensaver_active = FALSE;
256285
set_session_idle (presence, FALSE);
257-
reset_idle_watch (presence);
286+
} else {
287+
g_debug ("Detected that screensaver has aquired the bus");
288+
289+
g_dbus_proxy_call (presence->priv->screensaver_proxy,
290+
"GetActive",
291+
NULL,
292+
G_DBUS_CALL_FLAGS_NO_AUTO_START,
293+
1000,
294+
NULL,
295+
(GAsyncReadyCallback) screensaver_get_active_cb,
296+
presence);
258297
}
298+
299+
g_free (name_owner);
259300
}
260301

261302
static gboolean
@@ -352,7 +393,8 @@ csm_presence_constructor (GType type,
352393
}
353394

354395
presence->priv->screensaver_proxy = g_dbus_proxy_new_sync (presence->priv->connection,
355-
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
396+
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START |
397+
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
356398
NULL,
357399
CS_NAME,
358400
CS_PATH,
@@ -424,12 +466,6 @@ csm_presence_set_property (GObject *object,
424466
self = CSM_PRESENCE (object);
425467

426468
switch (prop_id) {
427-
case PROP_STATUS:
428-
csm_presence_set_status (self, g_value_get_uint (value));
429-
break;
430-
case PROP_STATUS_TEXT:
431-
csm_presence_set_status_text (self, g_value_get_string (value), NULL);
432-
break;
433469
case PROP_IDLE_ENABLED:
434470
csm_presence_set_idle_enabled (self, g_value_get_boolean (value));
435471
break;
@@ -453,12 +489,6 @@ csm_presence_get_property (GObject *object,
453489
self = CSM_PRESENCE (object);
454490

455491
switch (prop_id) {
456-
case PROP_STATUS:
457-
g_value_set_uint (value, self->priv->status);
458-
break;
459-
case PROP_STATUS_TEXT:
460-
g_value_set_string (value, self->priv->status_text ? self->priv->status_text : "");
461-
break;
462492
case PROP_IDLE_ENABLED:
463493
g_value_set_boolean (value, self->priv->idle_enabled);
464494
break;
@@ -482,15 +512,9 @@ csm_presence_finalize (GObject *object)
482512
presence->priv->idle_watch_id = 0;
483513
}
484514

485-
if (presence->priv->status_text != NULL) {
486-
g_free (presence->priv->status_text);
487-
presence->priv->status_text = NULL;
488-
}
489-
490-
if (presence->priv->idle_monitor != NULL) {
491-
g_object_unref (presence->priv->idle_monitor);
492-
presence->priv->idle_monitor = NULL;
493-
}
515+
g_clear_pointer (&presence->priv->status_text, g_free);
516+
g_clear_object (&presence->priv->idle_monitor);
517+
g_clear_object (&presence->priv->screensaver_proxy);
494518

495519
G_OBJECT_CLASS (csm_presence_parent_class)->finalize (object);
496520
}

cinnamon-session/csm-presence.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,6 @@ struct _CsmPresenceClass
5050

5151
void (* status_changed) (CsmPresence *presence,
5252
guint status);
53-
void (* status_text_changed) (CsmPresence *presence,
54-
const char *status_text);
55-
5653
};
5754

5855
typedef enum {
@@ -69,9 +66,6 @@ typedef enum
6966
} CsmPresenceError;
7067

7168
#define CSM_PRESENCE_ERROR csm_presence_error_quark ()
72-
GType csm_presence_error_get_type (void);
73-
#define CSM_PRESENCE_TYPE_ERROR (csm_presence_error_get_type ())
74-
7569
GQuark csm_presence_error_quark (void);
7670

7771
GType csm_presence_get_type (void) G_GNUC_CONST;

0 commit comments

Comments
 (0)