gnome-session r5210 - in trunk: . gnome-session



Author: mccann
Date: Mon Jan 19 00:32:25 2009
New Revision: 5210
URL: http://svn.gnome.org/viewvc/gnome-session?rev=5210&view=rev

Log:
2009-01-18  William Jon McCann  <jmccann redhat com>

	* gnome-session/gsm-manager.c (load_from_gconf),
	(on_gconf_key_changed):
	* gnome-session/gsm-presence.c (set_session_idle),
	(on_idle_timeout), (reset_idle_watch),
	(on_screensaver_active_changed), (on_screensaver_proxy_destroy),
	(on_bus_name_owner_changed), (register_presence),
	(gsm_presence_constructor):
	Fix timeout scale.  Disable idle detection while screensaver
	is active.



Modified:
   trunk/ChangeLog
   trunk/gnome-session/gsm-manager.c
   trunk/gnome-session/gsm-presence.c

Modified: trunk/gnome-session/gsm-manager.c
==============================================================================
--- trunk/gnome-session/gsm-manager.c	(original)
+++ trunk/gnome-session/gsm-manager.c	Mon Jan 19 00:32:25 2009
@@ -1964,7 +1964,7 @@
                                       KEY_IDLE_DELAY,
                                       &error);
         if (error == NULL) {
-                gsm_presence_set_idle_timeout (manager->priv->presence, value * 60);
+                gsm_presence_set_idle_timeout (manager->priv->presence, value * 60000);
         } else {
                 g_warning ("Error retrieving configuration key '%s': %s",
                            KEY_IDLE_DELAY,
@@ -1998,7 +1998,7 @@
 
                         delay = gconf_value_get_int (value);
 
-                        gsm_presence_set_idle_timeout (manager->priv->presence, delay * 60);
+                        gsm_presence_set_idle_timeout (manager->priv->presence, delay * 60000);
                 } else {
                         invalid_type_warning (key);
                 }

Modified: trunk/gnome-session/gsm-presence.c
==============================================================================
--- trunk/gnome-session/gsm-presence.c	(original)
+++ trunk/gnome-session/gsm-presence.c	Mon Jan 19 00:32:25 2009
@@ -35,6 +35,10 @@
 
 #define GSM_PRESENCE_DBUS_PATH "/org/gnome/SessionManager/Presence"
 
+#define GS_NAME      "org.gnome.ScreenSaver"
+#define GS_PATH      "/org/gnome/ScreenSaver"
+#define GS_INTERFACE "org.gnome.ScreenSaver"
+
 #define MAX_STATUS_TEXT 140
 
 #define IS_STRING_EMPTY(x) ((x)==NULL||(x)[0]=='\0')
@@ -43,13 +47,17 @@
 
 struct GsmPresencePrivate
 {
-        guint          status;
-        guint          saved_status;
-        char          *status_text;
-        gboolean       idle_enabled;
-        GSIdleMonitor *idle_monitor;
-        guint          idle_watch_id;
-        guint          idle_timeout;
+        guint            status;
+        guint            saved_status;
+        char            *status_text;
+        gboolean         idle_enabled;
+        GSIdleMonitor   *idle_monitor;
+        guint            idle_watch_id;
+        guint            idle_timeout;
+        gboolean         screensaver_active;
+        DBusGConnection *bus_connection;
+        DBusGProxy      *bus_proxy;
+        DBusGProxy      *screensaver_proxy;
 };
 
 enum {
@@ -103,15 +111,146 @@
         return etype;
 }
 
+static void
+set_session_idle (GsmPresence   *presence,
+                  gboolean       is_idle)
+{
+        g_debug ("GsmPresence: setting idle: %d", is_idle);
+
+        if (is_idle) {
+                if (presence->priv->status == GSM_PRESENCE_STATUS_IDLE) {
+                        g_debug ("GsmPresence: already idle, ignoring");
+                        return;
+                }
+
+                /* save current status */
+                presence->priv->saved_status = presence->priv->status;
+                gsm_presence_set_status (presence, GSM_PRESENCE_STATUS_IDLE, NULL);
+        } else {
+                if (presence->priv->status != GSM_PRESENCE_STATUS_IDLE) {
+                        g_debug ("GsmPresence: already not idle, ignoring");
+                        return;
+                }
+
+                /* restore saved status */
+                gsm_presence_set_status (presence, presence->priv->saved_status, NULL);
+                presence->priv->saved_status = GSM_PRESENCE_STATUS_AVAILABLE;
+        }
+}
+
+static gboolean
+on_idle_timeout (GSIdleMonitor *monitor,
+                 guint          id,
+                 gboolean       condition,
+                 GsmPresence   *presence)
+{
+        gboolean handled;
+
+        handled = TRUE;
+        set_session_idle (presence, condition);
+
+        return handled;
+}
+
+static void
+reset_idle_watch (GsmPresence  *presence)
+{
+        if (presence->priv->idle_watch_id > 0) {
+                g_debug ("GsmPresence: removing idle watch");
+                gs_idle_monitor_remove_watch (presence->priv->idle_monitor,
+                                              presence->priv->idle_watch_id);
+                presence->priv->idle_watch_id = 0;
+        }
+
+        if (! presence->priv->screensaver_active
+            && presence->priv->idle_enabled) {
+                g_debug ("GsmPresence: adding idle watch");
+
+                presence->priv->idle_watch_id = gs_idle_monitor_add_watch (presence->priv->idle_monitor,
+                                                                           presence->priv->idle_timeout,
+                                                                           (GSIdleMonitorWatchFunc)on_idle_timeout,
+                                                                           presence);
+        }
+}
+
+static void
+on_screensaver_active_changed (DBusGProxy  *proxy,
+                               gboolean     is_active,
+                               GsmPresence *presence)
+{
+        g_debug ("screensaver status changed: %d", is_active);
+        if (presence->priv->screensaver_active != is_active) {
+                presence->priv->screensaver_active = is_active;
+                reset_idle_watch (presence);
+                set_session_idle (presence, is_active);
+        }
+}
+
+static void
+on_screensaver_proxy_destroy (GObject     *proxy,
+                              GsmPresence *presence)
+{
+        g_warning ("Detected that screensaver has left the bus");
+
+        presence->priv->screensaver_proxy = NULL;
+        presence->priv->screensaver_active = FALSE;
+        set_session_idle (presence, FALSE);
+        reset_idle_watch (presence);
+}
+
+static void
+on_bus_name_owner_changed (DBusGProxy  *bus_proxy,
+                           const char  *service_name,
+                           const char  *old_service_name,
+                           const char  *new_service_name,
+                           GsmPresence *presence)
+{
+        GError *error;
+
+        if (strlen (new_service_name) == 0
+            && strlen (old_service_name) > 0) {
+                /* service removed */
+                /* let destroy signal handle this? */
+        } else if (strlen (old_service_name) == 0
+                   && strlen (new_service_name) > 0) {
+                /* service added */
+                if (strcmp (new_service_name, GS_NAME) == 0) {
+                        error = NULL;
+                        presence->priv->screensaver_proxy = dbus_g_proxy_new_for_name_owner (presence->priv->bus_connection,
+                                                                                             GS_NAME,
+                                                                                             GS_PATH,
+                                                                                             GS_INTERFACE,
+                                                                                             &error);
+                        if (presence->priv->screensaver_proxy != NULL) {
+                                g_signal_connect (presence->priv->screensaver_proxy,
+                                                  "destroy",
+                                                  G_CALLBACK (on_screensaver_proxy_destroy),
+                                                  presence);
+                                dbus_g_proxy_add_signal (presence->priv->screensaver_proxy,
+                                                         "ActiveChanged",
+                                                         G_TYPE_BOOLEAN,
+                                                         G_TYPE_INVALID);
+                                dbus_g_proxy_connect_signal (presence->priv->screensaver_proxy,
+                                                             "ActiveChanged",
+                                                             G_CALLBACK (on_screensaver_active_changed),
+                                                             presence,
+                                                             NULL);
+                        } else {
+                                g_warning ("Unable to get screensaver proxy: %s", error->message);
+                                g_error_free (error);
+                        }
+                }
+        }
+}
+
 static gboolean
 register_presence (GsmPresence *presence)
 {
-        GError          *error;
-        DBusGConnection *connection;
+        GError *error;
 
         error = NULL;
-        connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-        if (connection == NULL) {
+        presence->priv->bus_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+        if (presence->priv->bus_connection == NULL) {
                 if (error != NULL) {
                         g_critical ("error getting session bus: %s", error->message);
                         g_error_free (error);
@@ -119,7 +258,7 @@
                 return FALSE;
         }
 
-        dbus_g_connection_register_g_object (connection, GSM_PRESENCE_DBUS_PATH, G_OBJECT (presence));
+        dbus_g_connection_register_g_object (presence->priv->bus_connection, GSM_PRESENCE_DBUS_PATH, G_OBJECT (presence));
 
         return TRUE;
 }
@@ -141,6 +280,24 @@
                 g_warning ("Unable to register presence with session bus");
         }
 
+        presence->priv->bus_proxy = dbus_g_proxy_new_for_name (presence->priv->bus_connection,
+                                                               DBUS_SERVICE_DBUS,
+                                                               DBUS_PATH_DBUS,
+                                                               DBUS_INTERFACE_DBUS);
+        if (presence->priv->bus_proxy != NULL) {
+                dbus_g_proxy_add_signal (presence->priv->bus_proxy,
+                                         "NameOwnerChanged",
+                                         G_TYPE_STRING,
+                                         G_TYPE_STRING,
+                                         G_TYPE_STRING,
+                                         G_TYPE_INVALID);
+                dbus_g_proxy_connect_signal (presence->priv->bus_proxy,
+                                             "NameOwnerChanged",
+                                             G_CALLBACK (on_bus_name_owner_changed),
+                                             presence,
+                                             NULL);
+        }
+
         return G_OBJECT (presence);
 }
 
@@ -152,50 +309,6 @@
         presence->priv->idle_monitor = gs_idle_monitor_new ();
 }
 
-static gboolean
-on_idle_timeout (GSIdleMonitor *monitor,
-                 guint          id,
-                 gboolean       condition,
-                 GsmPresence   *presence)
-{
-        gboolean handled;
-
-        g_debug ("GsmPresence: idle timeout condition: %d", condition);
-        if (condition) {
-                /* save current status */
-                presence->priv->saved_status = presence->priv->status;
-                gsm_presence_set_status (presence, GSM_PRESENCE_STATUS_IDLE, NULL);
-        } else {
-                /* restore saved status */
-                gsm_presence_set_status (presence, presence->priv->saved_status, NULL);
-                presence->priv->saved_status = GSM_PRESENCE_STATUS_AVAILABLE;
-        }
-
-        handled = TRUE;
-
-        return handled;
-}
-
-static void
-reset_idle_watch (GsmPresence  *presence)
-{
-        if (presence->priv->idle_watch_id > 0) {
-                g_debug ("GsmPresence: removing idle watch");
-                gs_idle_monitor_remove_watch (presence->priv->idle_monitor,
-                                              presence->priv->idle_watch_id);
-                presence->priv->idle_watch_id = 0;
-        }
-
-        if (presence->priv->idle_enabled) {
-                g_debug ("GsmPresence: adding idle watch");
-
-                presence->priv->idle_watch_id = gs_idle_monitor_add_watch (presence->priv->idle_monitor,
-                                                                           presence->priv->idle_timeout,
-                                                                           (GSIdleMonitorWatchFunc)on_idle_timeout,
-                                                                           presence);
-        }
-}
-
 void
 gsm_presence_set_idle_enabled (GsmPresence  *presence,
                                gboolean      enabled)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]