[Xfce4-commits] <xfce4-session:aliov/hal-deprecation> Use ConsoleKit if runnin to open a consolekit session, so consolekit knows that there is a active session running.
Ali Abdallah
noreply at xfce.org
Sun Jan 31 15:00:03 CET 2010
Updating branch refs/heads/aliov/hal-deprecation
to a1db78f89b0c13c25fa291178304694e55689baa (commit)
from 6d195b333182f6c0342c55f552b12e1a917e5a59 (commit)
commit a1db78f89b0c13c25fa291178304694e55689baa
Author: Ali Abdallah <aliov at xfce.org>
Date: Fri Jan 29 19:57:10 2010 +0100
Use ConsoleKit if runnin to open a consolekit session, so consolekit knows that there is
a active session running.
xfce4-session/xfsm-global.c | 29 +++++++++++
xfce4-session/xfsm-global.h | 4 ++
xfce4-session/xfsm-manager.c | 109 ++++++++++++++++++++++++++++++++++++++----
3 files changed, 132 insertions(+), 10 deletions(-)
diff --git a/xfce4-session/xfsm-global.c b/xfce4-session/xfsm-global.c
index e582403..649535a 100644
--- a/xfce4-session/xfsm-global.c
+++ b/xfce4-session/xfsm-global.c
@@ -186,3 +186,32 @@ xfsm_g_value_free (GValue *value)
g_free (value);
}
}
+
+/**
+ * xfsm_dbus_name_has_owner:
+ * @bus: a #DBusConnection of type DBUS_BUS_SYSTEM to ask the system bus
+ * or DBUS_BUS_SESSION to ask the session bus of a name.
+ * @name: a valid bus name
+ *
+ *
+ * Returns: FALSE if no owner was found, TRUE otherwise
+ **/
+gboolean
+xfsm_dbus_name_has_owner (DBusConnection *bus, const gchar *name)
+{
+ DBusError error;
+ gboolean ret;
+
+ dbus_error_init (&error);
+
+ ret = dbus_bus_name_has_owner (bus, name, &error);
+
+ if ( dbus_error_is_set (&error) )
+ {
+ g_warning ("dbus_bus_name_has_owner failed : %s", error.message);
+ dbus_error_free (&error);
+ return FALSE;
+ }
+
+ return ret;
+}
diff --git a/xfce4-session/xfsm-global.h b/xfce4-session/xfsm-global.h
index 8be189a..5e4609c 100644
--- a/xfce4-session/xfsm-global.h
+++ b/xfce4-session/xfsm-global.h
@@ -27,6 +27,7 @@
#include <X11/SM/SMlib.h>
#include <xfce4-session/xfsm-splash-screen.h>
+#include <dbus/dbus.h>
typedef enum
{
@@ -83,4 +84,7 @@ GdkPixbuf *xfsm_load_session_preview (const gchar *name);
GValue *xfsm_g_value_new (GType gtype);
void xfsm_g_value_free (GValue *value);
+gboolean xfsm_dbus_name_has_owner (DBusConnection *bus,
+ const gchar *name);
+
#endif /* !__XFSM_GLOBAL_H__ */
diff --git a/xfce4-session/xfsm-manager.c b/xfce4-session/xfsm-manager.c
index f34b5de..517538f 100644
--- a/xfce4-session/xfsm-manager.c
+++ b/xfce4-session/xfsm-manager.c
@@ -117,7 +117,11 @@ struct _XfsmManager
guint die_timeout_id;
- DBusGConnection *dbus_conn;
+ DBusGConnection *session_bus;
+ DBusGConnection *system_bus;
+
+ DBusGProxy *consolekit_proxy;
+ gchar *consolekit_cookie;
};
typedef struct _XfsmManagerClass
@@ -173,6 +177,8 @@ static void xfsm_manager_dbus_class_init (XfsmManagerClass *klass);
static void xfsm_manager_dbus_init (XfsmManager *manager);
static void xfsm_manager_dbus_cleanup (XfsmManager *manager);
+static void xfsm_manager_consolekit_init (XfsmManager *manager);
+static void xfsm_manager_consolekit_cleanup (XfsmManager *manager);
static guint signals[N_SIGS] = { 0, };
@@ -223,18 +229,34 @@ xfsm_manager_class_init (XfsmManagerClass *klass)
static void
xfsm_manager_init (XfsmManager *manager)
{
+ GError *error = NULL;
+
manager->state = XFSM_MANAGER_STARTUP;
manager->session_chooser = FALSE;
manager->failsafe_mode = TRUE;
manager->shutdown_type = XFSM_SHUTDOWN_LOGOUT;
+ manager->consolekit_proxy = NULL;
+ manager->consolekit_cookie = NULL;
+
manager->pending_properties = g_queue_new ();
manager->starting_properties = g_queue_new ();
manager->restart_properties = g_queue_new ();
manager->running_clients = g_queue_new ();
manager->failsafe_clients = g_queue_new ();
-}
+ manager->system_bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+
+ if ( manager->system_bus == NULL )
+ {
+ g_warning ("Failed to connect to the system bus : %s", error->message);
+ g_error_free (error);
+ }
+ else
+ {
+ xfsm_manager_consolekit_init (manager);
+ }
+}
static void
xfsm_manager_finalize (GObject *obj)
@@ -243,6 +265,11 @@ xfsm_manager_finalize (GObject *obj)
xfsm_manager_dbus_cleanup (manager);
+ xfsm_manager_consolekit_cleanup (manager);
+
+ if ( manager->system_bus )
+ dbus_g_connection_unref (manager->system_bus);
+
if (manager->die_timeout_id != 0)
g_source_remove (manager->die_timeout_id);
@@ -302,6 +329,68 @@ xfsm_manager_new (void)
return manager;
}
+static void xfsm_manager_consolekit_init (XfsmManager *manager)
+{
+ GError *error = NULL;
+ gboolean ret;
+
+ /* Make sure that consolekit is running*/
+ if ( !xfsm_dbus_name_has_owner (dbus_g_connection_get_connection (manager->system_bus),
+ "org.freedesktop.ConsoleKit") )
+ {
+
+ g_message (G_STRLOC "ConsoleKit is not running or not installed");
+ return;
+ }
+
+
+ manager->consolekit_proxy = dbus_g_proxy_new_for_name (manager->system_bus,
+ "org.freedesktop.ConsoleKit",
+ "/org/freedesktop/ConsoleKit/Manager",
+ "org.freedesktop.ConsoleKit.Manager");
+
+
+ if ( G_UNLIKELY (!manager->consolekit_proxy) )
+ {
+ g_warning ("Failed to create proxy for 'org.freedesktop.ConsoleKit'");
+ }
+
+ ret = dbus_g_proxy_call (manager->consolekit_proxy, "OpenSession", &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &manager->consolekit_cookie,
+ G_TYPE_INVALID);
+
+ if ( !ret )
+ {
+ g_warning ("OpenSession on 'org.freedesktop.ConsoleKit' failed with %s", error->message);
+ g_error_free (error);
+ }
+}
+
+static void xfsm_manager_consolekit_cleanup (XfsmManager *manager)
+{
+ if ( manager->consolekit_proxy )
+ {
+ if (manager->consolekit_cookie)
+ {
+ GError *error = NULL;
+ gboolean ret, result;
+
+ ret = dbus_g_proxy_call (manager->consolekit_proxy, "CloseSession", &error,
+ G_TYPE_STRING, manager->consolekit_cookie,
+ G_TYPE_INVALID,
+ G_TYPE_BOOLEAN, &result,
+ G_TYPE_INVALID);
+ if ( !ret )
+ {
+ g_warning ("CloseSession on 'org.freedesktop.ConsoleKit' failed with %s", error->message);
+ g_error_free (error);
+ }
+ g_free (manager->consolekit_cookie);
+ }
+ g_object_unref (manager->consolekit_proxy);
+ }
+}
static gboolean
xfsm_manager_startup (XfsmManager *manager)
@@ -1817,9 +1906,9 @@ xfsm_manager_dbus_init (XfsmManager *manager)
{
GError *error = NULL;
- manager->dbus_conn = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+ manager->session_bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
- if (G_UNLIKELY (!manager->dbus_conn))
+ if (G_UNLIKELY (!manager->session_bus))
{
g_critical ("Unable to contact D-Bus session bus: %s", error ? error->message : "Unknown error");
if (error)
@@ -1827,11 +1916,11 @@ xfsm_manager_dbus_init (XfsmManager *manager)
return;
}
- dbus_g_connection_register_g_object (manager->dbus_conn,
+ dbus_g_connection_register_g_object (manager->session_bus,
"/org/xfce/SessionManager",
G_OBJECT (manager));
- dbus_connection_add_filter (dbus_g_connection_get_connection (manager->dbus_conn),
+ dbus_connection_add_filter (dbus_g_connection_get_connection (manager->session_bus),
xfsm_manager_watch_dbus_disconnect,
manager, NULL);
}
@@ -1840,13 +1929,13 @@ xfsm_manager_dbus_init (XfsmManager *manager)
static void
xfsm_manager_dbus_cleanup (XfsmManager *manager)
{
- if (G_LIKELY (manager->dbus_conn))
+ if (G_LIKELY (manager->session_bus))
{
- dbus_connection_remove_filter (dbus_g_connection_get_connection (manager->dbus_conn),
+ dbus_connection_remove_filter (dbus_g_connection_get_connection (manager->session_bus),
xfsm_manager_watch_dbus_disconnect,
manager);
- dbus_g_connection_unref (manager->dbus_conn);
- manager->dbus_conn = NULL;
+ dbus_g_connection_unref (manager->session_bus);
+ manager->session_bus = NULL;
}
}
More information about the Xfce4-commits
mailing list