[gnome-session] consolekit: fix SessionIsActive



commit 7fcc0f0b21d4ab03e9d12e4f820eed0530576ac2
Author: Antoine Jacoutot <ajacoutot gnome org>
Date:   Fri May 24 07:57:35 2013 +0200

    consolekit: fix SessionIsActive
    
    IsActive is handled by the Session interface and not the Manager one.
    This fixes querying for the IsActive property.

 gnome-session/gsm-consolekit.c |   59 +++++++++++++++++++++++++++++++++------
 1 files changed, 50 insertions(+), 9 deletions(-)
---
diff --git a/gnome-session/gsm-consolekit.c b/gnome-session/gsm-consolekit.c
index 99a34a6..c4b7e4c 100644
--- a/gnome-session/gsm-consolekit.c
+++ b/gnome-session/gsm-consolekit.c
@@ -39,7 +39,6 @@
 
 #define CK_NAME      "org.freedesktop.ConsoleKit"
 #define CK_PATH      "/org/freedesktop/ConsoleKit"
-#define CK_INTERFACE "org.freedesktop.ConsoleKit"
 
 #define CK_MANAGER_PATH      "/org/freedesktop/ConsoleKit/Manager"
 #define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager"
@@ -56,10 +55,13 @@ struct _GsmConsolekitPrivate
         DBusGConnection *dbus_connection;
         DBusGProxy      *bus_proxy;
         DBusGProxy      *ck_proxy;
+        DBusGProxy      *session_proxy;
         UpClient        *up_client;
 
         gboolean         is_active;
         gboolean         restarting;
+
+        gchar            *session_id;
 };
 
 enum {
@@ -172,7 +174,7 @@ is_active_cb (DBusGProxy     *proxy,
         if (!dbus_g_proxy_end_call (proxy, call, &local_error,
                                     G_TYPE_BOOLEAN, &is_active,
                                     G_TYPE_INVALID)) {
-                g_warning ("Failed isActive call to ConsoleKit: %s",
+                g_warning ("Failed IsActive call to ConsoleKit: %s",
                            local_error->message);
                 g_clear_error (&local_error);
                 return;
@@ -201,8 +203,12 @@ gsm_consolekit_ensure_ck_connection (GsmConsolekit  *manager,
 {
         GError  *connection_error;
         gboolean is_connected;
+        gboolean ret;
+        guint32 pid;
 
         connection_error = NULL;
+        manager->priv->session_id = NULL;
+        is_connected = FALSE;
 
         if (manager->priv->dbus_connection == NULL) {
                 DBusConnection *connection;
@@ -253,9 +259,9 @@ gsm_consolekit_ensure_ck_connection (GsmConsolekit  *manager,
         if (manager->priv->ck_proxy == NULL) {
                 manager->priv->ck_proxy =
                         dbus_g_proxy_new_for_name_owner (manager->priv->dbus_connection,
-                                                         "org.freedesktop.ConsoleKit",
-                                                         "/org/freedesktop/ConsoleKit/Manager",
-                                                         "org.freedesktop.ConsoleKit.Manager",
+                                                         CK_NAME,
+                                                         CK_MANAGER_PATH,
+                                                         CK_MANAGER_INTERFACE,
                                                          &connection_error);
 
                 if (manager->priv->ck_proxy == NULL) {
@@ -263,14 +269,40 @@ gsm_consolekit_ensure_ck_connection (GsmConsolekit  *manager,
                         is_connected = FALSE;
                         goto out;
                 }
-                
-                dbus_g_proxy_begin_call (manager->priv->ck_proxy,
+       }
+
+        pid = getpid ();
+        ret = dbus_g_proxy_call (manager->priv->ck_proxy, "GetSessionForUnixProcess", &connection_error,
+                                 G_TYPE_UINT, pid,
+                                 G_TYPE_INVALID,
+                                 DBUS_TYPE_G_OBJECT_PATH, &manager->priv->session_id,
+                                 G_TYPE_INVALID);
+        if (!ret) {
+                g_propagate_error (error, connection_error);
+                goto out;
+        }
+
+        if (manager->priv->session_proxy == NULL) {
+                manager->priv->session_proxy =
+                        dbus_g_proxy_new_for_name_owner (manager->priv->dbus_connection,
+                                                         CK_NAME,
+                                                         manager->priv->session_id,
+                                                         CK_SESSION_INTERFACE,
+                                                         &connection_error);
+
+                if (manager->priv->session_proxy == NULL) {
+                        g_propagate_error (error, connection_error);
+                        is_connected = FALSE;
+                        goto out;
+                }
+
+                dbus_g_proxy_begin_call (manager->priv->session_proxy,
                                          "IsActive",
                                          is_active_cb, g_object_ref (manager),
                                          (GDestroyNotify)g_object_unref,
                                          G_TYPE_INVALID);
-                dbus_g_proxy_add_signal (manager->priv->ck_proxy, "ActiveChanged", G_TYPE_BOOLEAN, 
G_TYPE_INVALID);
-                dbus_g_proxy_connect_signal (manager->priv->ck_proxy, "ActiveChanged",
+                dbus_g_proxy_add_signal (manager->priv->session_proxy, "ActiveChanged", G_TYPE_BOOLEAN, 
G_TYPE_INVALID);
+                dbus_g_proxy_connect_signal (manager->priv->session_proxy, "ActiveChanged",
                                              G_CALLBACK (on_active_changed), manager, NULL);
         }
 
@@ -291,11 +323,17 @@ gsm_consolekit_ensure_ck_connection (GsmConsolekit  *manager,
                                 g_object_unref (manager->priv->ck_proxy);
                                 manager->priv->ck_proxy = NULL;
                         }
+
+                        g_clear_object (&manager->priv->session_proxy);
+                        g_clear_object (&manager->priv->session_id);
                 } else if (manager->priv->bus_proxy == NULL) {
                         if (manager->priv->ck_proxy != NULL) {
                                 g_object_unref (manager->priv->ck_proxy);
                                 manager->priv->ck_proxy = NULL;
                         }
+
+                        g_clear_object (&manager->priv->session_proxy);
+                        g_clear_object (&manager->priv->session_id);
                 }
         }
 
@@ -314,6 +352,7 @@ gsm_consolekit_on_name_owner_changed (DBusGProxy    *bus_proxy,
         }
 
         g_clear_object (&manager->priv->ck_proxy);
+        g_clear_object (&manager->priv->session_proxy);
 
         gsm_consolekit_ensure_ck_connection (manager, NULL);
 
@@ -340,6 +379,8 @@ gsm_consolekit_free_dbus (GsmConsolekit *manager)
 {
         g_clear_object (&manager->priv->bus_proxy);
         g_clear_object (&manager->priv->ck_proxy);
+        g_clear_object (&manager->priv->session_proxy);
+        g_clear_object (&manager->priv->session_id);
         g_clear_object (&manager->priv->up_client);
 
         if (manager->priv->dbus_connection != NULL) {


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