@@ -64,16 +64,12 @@ struct CsmPresencePrivate
6464
6565enum {
6666 PROP_0 ,
67- PROP_STATUS ,
68- PROP_STATUS_TEXT ,
6967 PROP_IDLE_ENABLED ,
7068 PROP_IDLE_TIMEOUT ,
7169};
7270
73-
7471enum {
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+
102102static gboolean
103103csm_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
132134csm_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
146147static 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
188198static void
189199reset_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
261302static 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}
0 commit comments