From b42c5902938f5bad7c8634714d8e0b39e02793a1 Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Tue, 3 Mar 2009 19:55:05 +0000 Subject: [PATCH] commit properly the previous ConsoleKit patch. 2009-03-03 Cosimo Cecchi * src/nautilus-application.c (nautilus_application_finalize), (ck_session_active_changed_cb), (ck_call_is_active_cb), (ck_get_current_session_cb), (do_initialize_consolekit), (finish_startup), (mount_added_callback): * src/nautilus-application.h: commit properly the previous ConsoleKit patch. svn path=/trunk/; revision=15050 --- ChangeLog | 9 +++ src/nautilus-application.c | 112 +++++++++++++++++++++++++++++++++++++ src/nautilus-application.h | 3 + 3 files changed, 124 insertions(+) diff --git a/ChangeLog b/ChangeLog index 7c54823f9..c108eb100 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-03-03 Cosimo Cecchi + + * src/nautilus-application.c (nautilus_application_finalize), + (ck_session_active_changed_cb), (ck_call_is_active_cb), + (ck_get_current_session_cb), (do_initialize_consolekit), + (finish_startup), (mount_added_callback): + * src/nautilus-application.h: commit properly the previous + ConsoleKit patch. + 2009-03-03 A. Walton * src/nautilus-application.c (nautilus_application_finalize), diff --git a/src/nautilus-application.c b/src/nautilus-application.c index 52ac32a33..e559abd61 100644 --- a/src/nautilus-application.c +++ b/src/nautilus-application.c @@ -60,6 +60,7 @@ #include #include #include +#include #include #include #include @@ -123,6 +124,10 @@ static void drive_listen_for_eject_button (GDrive *drive, static gboolean is_kdesktop_present (void); static void nautilus_application_load_session (NautilusApplication *application); static char * nautilus_application_get_session_data (void); +static void ck_session_active_changed_cb (DBusGProxy *proxy, + gboolean is_active, + void *user_data); + G_DEFINE_TYPE (NautilusApplication, nautilus_application, G_TYPE_OBJECT); @@ -346,6 +351,13 @@ nautilus_application_finalize (GObject *object) application->automount_idle_id = 0; } + if (application->ck_session_proxy != NULL) { + dbus_g_proxy_disconnect_signal (application->ck_session_proxy, "ActiveChanged", + G_CALLBACK (ck_session_active_changed_cb), NULL); + g_object_unref (application->ck_session_proxy); + application->ck_session_proxy = NULL; + } + G_OBJECT_CLASS (nautilus_application_parent_class)->finalize (object); } @@ -511,6 +523,99 @@ mark_desktop_files_trusted (void) g_free (do_once_file); } +#define CK_NAME "org.freedesktop.ConsoleKit" +#define CK_PATH "/org/freedesktop/ConsoleKit" + +static void +ck_session_active_changed_cb (DBusGProxy *proxy, + gboolean is_active, + void *user_data) +{ + NautilusApplication *application = user_data; + + application->session_is_active = is_active; +} + +static void +ck_call_is_active_cb (DBusGProxy *proxy, + DBusGProxyCall *call_id, + void *user_data) +{ + gboolean res, is_active; + NautilusApplication *application; + + application = user_data; + + res = dbus_g_proxy_end_call (proxy, call_id, NULL, + G_TYPE_BOOLEAN, &is_active, + G_TYPE_INVALID); + if (!res) { + g_object_unref (proxy); + + application->session_is_active = TRUE; + return; + } + + application->session_is_active = is_active; + + dbus_g_proxy_add_signal (proxy, "ActiveChanged", G_TYPE_BOOLEAN, G_TYPE_INVALID); + dbus_g_proxy_connect_signal (proxy, "ActiveChanged", + G_CALLBACK (ck_session_active_changed_cb), application, + NULL); +} + +static void +ck_get_current_session_cb (DBusGProxy *proxy, + DBusGProxyCall *call_id, + void *user_data) +{ + gboolean res; + char *session_id; + NautilusApplication *application; + + application = user_data; + + res = dbus_g_proxy_end_call (proxy, call_id, NULL, + DBUS_TYPE_G_OBJECT_PATH, &session_id, G_TYPE_INVALID); + if (!res) { + g_object_unref (proxy); + + application->session_is_active = TRUE; + return; + } + + application->ck_session_proxy = dbus_g_proxy_new_from_proxy (proxy, CK_NAME ".Session", + session_id); + dbus_g_proxy_begin_call (application->ck_session_proxy, "IsActive", ck_call_is_active_cb, + application, NULL, G_TYPE_INVALID); + + g_object_unref (proxy); +} + + +static void +do_initialize_consolekit (NautilusApplication *application) +{ + DBusGConnection *conn; + DBusGProxy *proxy; + GError *error = NULL; + + conn = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + if (error) { + g_error_free (error); + + application->session_is_active = TRUE; + + return; + } + + proxy = dbus_g_proxy_new_for_name (conn, CK_NAME, CK_PATH "/Manager", + CK_NAME ".Manager"); + dbus_g_proxy_begin_call (proxy, "GetCurrentSession", + ck_get_current_session_cb, application, + NULL, G_TYPE_INVALID); +} + static void do_upgrades_once (NautilusApplication *application, gboolean no_desktop) @@ -538,6 +643,9 @@ finish_startup (NautilusApplication *application, /* Initialize the desktop link monitor singleton */ nautilus_desktop_link_monitor_get (); + /* Initialize the ConsoleKit listener for active session */ + do_initialize_consolekit (application); + /* Watch for mounts so we can restore open windows This used * to be for showing new window on mount, but is not used * anymore */ @@ -1386,6 +1494,10 @@ mount_added_callback (GVolumeMonitor *monitor, { NautilusDirectory *directory; GFile *root; + + if (!application->session_is_active) { + return; + } root = g_mount_get_root (mount); directory = nautilus_directory_get_existing (root); diff --git a/src/nautilus-application.h b/src/nautilus-application.h index ed3fd33d1..fc54469ef 100644 --- a/src/nautilus-application.h +++ b/src/nautilus-application.h @@ -31,6 +31,7 @@ #include #include #include +#include #include #define NAUTILUS_DESKTOP_ICON_VIEW_IID "OAFIID:Nautilus_File_Manager_Desktop_Icon_View" @@ -60,6 +61,8 @@ typedef struct { NautilusUndoManager *undo_manager; GVolumeMonitor *volume_monitor; unsigned int automount_idle_id; + DBusGProxy *ck_session_proxy; + gboolean session_is_active; } NautilusApplication; typedef struct { -- GitLab