mirror of
https://gitlab.gnome.org/GNOME/nautilus
synced 2024-10-03 06:25:36 +00:00
parent
6cba2c2bca
commit
8a58f4e298
|
@ -2,7 +2,7 @@ AC_PREREQ(2.54)
|
|||
|
||||
dnl ===========================================================================
|
||||
|
||||
m4_define(glib_minver, 2.24.0)
|
||||
m4_define(glib_minver, 2.25.5)
|
||||
m4_define(gnome_desktop_minver, 2.29.91)
|
||||
m4_define(pango_minver, 1.1.2)
|
||||
m4_define(gtk_minver, 2.20.0)
|
||||
|
@ -69,7 +69,6 @@ PKG_CHECK_MODULES(ALL, [
|
|||
libxml-2.0 >= xml_minver
|
||||
gail >= gail_minver
|
||||
unique-1.0
|
||||
dbus-glib-1
|
||||
])
|
||||
dnl ==========================================================================
|
||||
|
||||
|
@ -337,7 +336,7 @@ LIBNAUTILUS_EXTENSION_LIBS="`$PKG_CONFIG --libs $LIBNAUTILUS_EXTENSION_MODULES`"
|
|||
AC_SUBST(LIBNAUTILUS_EXTENSION_LIBS)
|
||||
|
||||
dnl core nautilus
|
||||
CORE_MODULES="glib-2.0 gnome-desktop-2.0 gthread-2.0 gio-2.0 gio-unix-2.0 unique-1.0 dbus-glib-1 gail gconf-2.0 libxml-2.0 $EXTRA_CORE_MODULES"
|
||||
CORE_MODULES="glib-2.0 gnome-desktop-2.0 gthread-2.0 gio-2.0 gio-unix-2.0 unique-1.0 gail gconf-2.0 libxml-2.0 $EXTRA_CORE_MODULES"
|
||||
CORE_CFLAGS="`$PKG_CONFIG --cflags $CORE_MODULES` $x_cflags"
|
||||
AC_SUBST(CORE_CFLAGS)
|
||||
CORE_LIBS="`$PKG_CONFIG --libs $CORE_MODULES` $x_libs"
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
#include <glib/gi18n.h>
|
||||
#include <glib/gstdio.h>
|
||||
#include <gio/gio.h>
|
||||
#include <dbus/dbus-glib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
@ -1004,48 +1003,13 @@ nautilus_is_file_roller_installed (void)
|
|||
|
||||
#define GSM_NAME "org.gnome.SessionManager"
|
||||
#define GSM_PATH "/org/gnome/SessionManager"
|
||||
#define GSM_INTERFACE "org.gnome.SessionManager"
|
||||
|
||||
/* The following values come from
|
||||
* http://www.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Inhibit
|
||||
*/
|
||||
#define INHIBIT_LOGOUT 1
|
||||
#define INHIBIT_SUSPEND 4
|
||||
|
||||
static DBusGProxy *_gsm_proxy = NULL;
|
||||
|
||||
static DBusGProxy *
|
||||
get_power_manager_proxy (void)
|
||||
{
|
||||
if (!_gsm_proxy)
|
||||
{
|
||||
DBusGConnection *bus;
|
||||
GError *error;
|
||||
|
||||
error = NULL;
|
||||
bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
|
||||
if (!bus)
|
||||
{
|
||||
g_warning ("Could not connect to session bus: %s",
|
||||
error->message);
|
||||
g_error_free (error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_gsm_proxy = dbus_g_proxy_new_for_name (bus,
|
||||
GSM_NAME,
|
||||
GSM_PATH,
|
||||
GSM_NAME);
|
||||
dbus_g_connection_unref (bus);
|
||||
|
||||
if (!_gsm_proxy)
|
||||
{
|
||||
g_warning ("Creating DBus proxy failed.");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return _gsm_proxy;
|
||||
}
|
||||
#define INHIBIT_LOGOUT (1U)
|
||||
#define INHIBIT_SUSPEND (4U)
|
||||
|
||||
/**
|
||||
* nautilus_inhibit_power_manager:
|
||||
|
@ -1062,31 +1026,44 @@ get_power_manager_proxy (void)
|
|||
int
|
||||
nautilus_inhibit_power_manager (const char *message)
|
||||
{
|
||||
DBusGProxy *proxy;
|
||||
GError *error;
|
||||
GDBusConnection *connection;
|
||||
GVariant *result;
|
||||
GError *error = NULL;
|
||||
int cookie;
|
||||
|
||||
proxy = get_power_manager_proxy ();
|
||||
g_return_val_if_fail (message != NULL, -1);
|
||||
|
||||
g_return_val_if_fail (proxy != NULL, -1);
|
||||
connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
|
||||
if (connection == NULL) {
|
||||
g_warning ("Could not connect to session bus: %s", error->message);
|
||||
return -1;
|
||||
}
|
||||
|
||||
error = NULL;
|
||||
cookie = -1;
|
||||
if (!dbus_g_proxy_call (proxy, "Inhibit", &error,
|
||||
G_TYPE_STRING, "Nautilus",
|
||||
G_TYPE_UINT, 0,
|
||||
G_TYPE_STRING, message,
|
||||
G_TYPE_UINT, INHIBIT_LOGOUT | INHIBIT_SUSPEND,
|
||||
G_TYPE_INVALID,
|
||||
G_TYPE_UINT, &cookie,
|
||||
G_TYPE_INVALID))
|
||||
{
|
||||
result = g_dbus_connection_call_sync (connection,
|
||||
GSM_NAME,
|
||||
GSM_PATH,
|
||||
GSM_INTERFACE,
|
||||
"Inhibit",
|
||||
g_variant_new ("(susu)",
|
||||
"Nautilus",
|
||||
(guint) 0,
|
||||
message,
|
||||
(guint) (INHIBIT_LOGOUT | INHIBIT_SUSPEND)),
|
||||
G_DBUS_CALL_FLAGS_NO_AUTO_START,
|
||||
-1 /* FIXME? */,
|
||||
NULL,
|
||||
&error);
|
||||
g_object_unref (connection);
|
||||
if (result == NULL) {
|
||||
g_warning ("Could not inhibit power management: %s", error->message);
|
||||
g_error_free (error);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return cookie;
|
||||
g_variant_get (result, "(u)", &cookie);
|
||||
g_variant_unref (result);
|
||||
|
||||
return (int) cookie;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1100,24 +1077,36 @@ nautilus_inhibit_power_manager (const char *message)
|
|||
void
|
||||
nautilus_uninhibit_power_manager (gint cookie)
|
||||
{
|
||||
DBusGProxy *proxy;
|
||||
GError *error;
|
||||
GDBusConnection *connection;
|
||||
GVariant *result;
|
||||
GError *error = NULL;
|
||||
|
||||
g_return_if_fail (cookie > 0);
|
||||
|
||||
proxy = get_power_manager_proxy ();
|
||||
connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
|
||||
if (connection == NULL) {
|
||||
g_warning ("Could not connect to session bus: %s", error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
g_return_if_fail (proxy != NULL);
|
||||
|
||||
error = NULL;
|
||||
|
||||
if (!dbus_g_proxy_call (proxy, "Uninhibit", &error,
|
||||
G_TYPE_UINT, cookie,
|
||||
G_TYPE_INVALID,
|
||||
G_TYPE_INVALID))
|
||||
{
|
||||
result = g_dbus_connection_call_sync (connection,
|
||||
GSM_NAME,
|
||||
GSM_PATH,
|
||||
GSM_INTERFACE,
|
||||
"Uninhibit",
|
||||
g_variant_new ("(u)", (guint) cookie),
|
||||
G_DBUS_CALL_FLAGS_NO_AUTO_START,
|
||||
-1 /* FIXME? */,
|
||||
NULL,
|
||||
&error);
|
||||
g_object_unref (connection);
|
||||
if (result == NULL) {
|
||||
g_warning ("Could not uninhibit power management: %s", error->message);
|
||||
g_error_free (error);
|
||||
return;
|
||||
}
|
||||
|
||||
g_variant_unref (result);
|
||||
}
|
||||
|
||||
/* Returns TRUE if the file is in XDG_DATA_DIRS or
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include <glib/gi18n.h>
|
||||
#include <glib/gstdio.h>
|
||||
#include <string.h>
|
||||
#include <dbus/dbus-glib.h>
|
||||
#include <gdk/gdkx.h>
|
||||
|
||||
#include "nautilus-file-attributes.h"
|
||||
|
@ -1140,6 +1139,7 @@ typedef struct {
|
|||
char *activation_directory;
|
||||
gboolean user_confirmation;
|
||||
char *uri;
|
||||
GDBusProxy *proxy; /* PackageKit proxy */
|
||||
} ActivateParametersInstall;
|
||||
|
||||
static void
|
||||
|
@ -1155,6 +1155,8 @@ activate_parameters_install_free (ActivateParametersInstall *parameters_install)
|
|||
nautilus_file_list_free (parameters_install->files);
|
||||
g_free (parameters_install->activation_directory);
|
||||
g_free (parameters_install->uri);
|
||||
if (parameters_install->proxy)
|
||||
g_object_unref (parameters_install->proxy);
|
||||
g_free (parameters_install);
|
||||
}
|
||||
|
||||
|
@ -1300,20 +1302,20 @@ show_unhandled_type_error (ActivateParametersInstall *parameters)
|
|||
}
|
||||
|
||||
static void
|
||||
search_for_application_dbus_call_notify_cb (DBusGProxy *proxy, DBusGProxyCall *call, ActivateParametersInstall *parameters_install)
|
||||
search_for_application_dbus_call_notify_cb (GDBusProxy *proxy,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
gboolean ret;
|
||||
ActivateParametersInstall *parameters_install = user_data;
|
||||
GVariant *variant;
|
||||
GError *error = NULL;
|
||||
char *message;
|
||||
const char *remote = NULL;
|
||||
|
||||
ret = dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
|
||||
if (!ret) {
|
||||
if (error->domain == DBUS_GERROR && error->code == DBUS_GERROR_REMOTE_EXCEPTION) {
|
||||
remote = dbus_g_error_get_name (error);
|
||||
}
|
||||
/* we already show an error in the installer if not found, just catch generic failure */
|
||||
if (remote == NULL || strcmp (remote, "org.freedesktop.PackageKit.Modify.Failed") == 0) {
|
||||
variant = g_dbus_proxy_call_finish (proxy, result, &error);
|
||||
if (variant == NULL) {
|
||||
if (!g_dbus_error_is_remote_error (error) ||
|
||||
g_strcmp0 (g_dbus_error_get_remote_error (error), "org.freedesktop.PackageKit.Modify.Failed") == 0) {
|
||||
char *message;
|
||||
|
||||
message = g_strdup_printf ("%s\n%s",
|
||||
_("There was an internal error trying to search for applications:"),
|
||||
error->message);
|
||||
|
@ -1321,10 +1323,13 @@ search_for_application_dbus_call_notify_cb (DBusGProxy *proxy, DBusGProxyCall *c
|
|||
parameters_install->parent_window);
|
||||
g_free (message);
|
||||
}
|
||||
|
||||
g_error_free (error);
|
||||
activate_parameters_install_free (parameters_install);
|
||||
return;
|
||||
}
|
||||
g_object_unref (proxy);
|
||||
|
||||
g_variant_unref (variant);
|
||||
|
||||
/* activate the file again */
|
||||
nautilus_mime_activate_files (parameters_install->parent_window,
|
||||
|
@ -1335,36 +1340,17 @@ search_for_application_dbus_call_notify_cb (DBusGProxy *proxy, DBusGProxyCall *c
|
|||
parameters_install->flags,
|
||||
parameters_install->user_confirmation);
|
||||
|
||||
/* parameters_install freed by destroy notify */
|
||||
activate_parameters_install_free (parameters_install);
|
||||
}
|
||||
|
||||
static void
|
||||
search_for_application_mime_type (ActivateParametersInstall *parameters_install, const gchar *mime_type)
|
||||
{
|
||||
DBusGConnection *connection;
|
||||
DBusGProxy *proxy = NULL;
|
||||
GdkWindow *window;
|
||||
guint xid = 0;
|
||||
GError *error = NULL;
|
||||
DBusGProxyCall *call = NULL;
|
||||
GtkWidget *dialog;
|
||||
GdkWindow *window;
|
||||
const char *mime_types[2];
|
||||
|
||||
/* get bus */
|
||||
connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
|
||||
if (connection == NULL) {
|
||||
g_error_free (error);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* get proxy - native clients for for KDE and GNOME */
|
||||
proxy = dbus_g_proxy_new_for_name (connection,
|
||||
"org.freedesktop.PackageKit",
|
||||
"/org/freedesktop/PackageKit",
|
||||
"org.freedesktop.PackageKit.Modify");
|
||||
if (proxy == NULL) {
|
||||
goto out;
|
||||
}
|
||||
g_assert (parameters_install->proxy != NULL);
|
||||
|
||||
/* get XID from parent window */
|
||||
window = gtk_widget_get_window (GTK_WIDGET (parameters_install->parent_window));
|
||||
|
@ -1372,40 +1358,23 @@ search_for_application_mime_type (ActivateParametersInstall *parameters_install,
|
|||
xid = GDK_WINDOW_XID (window);
|
||||
}
|
||||
|
||||
/* don't timeout, as dbus-glib sets the timeout ~25 seconds */
|
||||
dbus_g_proxy_set_default_timeout (proxy, INT_MAX);
|
||||
|
||||
/* invoke the method */
|
||||
mime_types[0] = mime_type;
|
||||
mime_types[1] = NULL;
|
||||
call = dbus_g_proxy_begin_call (proxy, "InstallMimeTypes",
|
||||
(DBusGProxyCallNotify) search_for_application_dbus_call_notify_cb,
|
||||
parameters_install,
|
||||
(GDestroyNotify) activate_parameters_install_free,
|
||||
G_TYPE_UINT, xid,
|
||||
G_TYPE_STRV, mime_types,
|
||||
G_TYPE_STRING, "hide-confirm-search",
|
||||
G_TYPE_INVALID);
|
||||
if (call == NULL) {
|
||||
dialog = gtk_message_dialog_new (NULL,
|
||||
GTK_DIALOG_MODAL,
|
||||
GTK_MESSAGE_ERROR,
|
||||
GTK_BUTTONS_OK,
|
||||
_("Could not use system package installer"));
|
||||
g_signal_connect (G_OBJECT (dialog), "response",
|
||||
G_CALLBACK (gtk_widget_destroy), NULL);
|
||||
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
|
||||
gtk_widget_show (dialog);
|
||||
goto out;
|
||||
}
|
||||
|
||||
g_dbus_proxy_call (parameters_install->proxy,
|
||||
"InstallMimeTypes",
|
||||
g_variant_new ("(u^ass)",
|
||||
xid,
|
||||
mime_types,
|
||||
"hide-confirm-search"),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
G_MAXINT /* no timeout */,
|
||||
NULL /* cancellable */,
|
||||
(GAsyncReadyCallback) search_for_application_dbus_call_notify_cb,
|
||||
parameters_install);
|
||||
|
||||
nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER,
|
||||
"InstallMimeType method invoked for %s", mime_type);
|
||||
out:
|
||||
if (call == NULL) {
|
||||
/* dbus method was not called, so we're not going to get the async dbus callback */
|
||||
activate_parameters_install_free (parameters_install);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1425,29 +1394,33 @@ application_unhandled_file_install (GtkDialog *dialog, gint response_id, Activat
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
packagekit_present_dbus_call_notify_cb (DBusGProxy *proxy, DBusGProxyCall *call, ActivateParametersInstall *parameters_install)
|
||||
static gboolean
|
||||
delete_cb (GtkDialog *dialog)
|
||||
{
|
||||
gboolean ret;
|
||||
GError *error = NULL;
|
||||
gtk_dialog_response (dialog, GTK_RESPONSE_DELETE_EVENT);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
pk_proxy_constructed_cb (GDBusConnection *connection,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
ActivateParametersInstall *parameters_install = user_data;
|
||||
char *mime_type;
|
||||
char *error_message;
|
||||
gboolean present;
|
||||
GtkWidget *dialog;
|
||||
GError *error = NULL;
|
||||
|
||||
|
||||
ret = dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_BOOLEAN, &present, G_TYPE_INVALID);
|
||||
if (!ret) {
|
||||
parameters_install->proxy = g_dbus_proxy_new_finish (result, &error);
|
||||
if (parameters_install->proxy == NULL) {
|
||||
nautilus_debug_log (FALSE, NAUTILUS_DEBUG_LOG_DOMAIN_USER,
|
||||
"Failed to construct PackageKit bus proxy: %s", error->message);
|
||||
g_error_free (error);
|
||||
|
||||
show_unhandled_type_error (parameters_install);
|
||||
activate_parameters_install_free (parameters_install);
|
||||
present = FALSE;
|
||||
goto out;
|
||||
}
|
||||
if (!present) {
|
||||
show_unhandled_type_error (parameters_install);
|
||||
activate_parameters_install_free (parameters_install);
|
||||
goto out;
|
||||
return;
|
||||
}
|
||||
|
||||
mime_type = nautilus_file_get_mime_type (parameters_install->file);
|
||||
|
@ -1463,11 +1436,9 @@ packagekit_present_dbus_call_notify_cb (DBusGProxy *proxy, DBusGProxyCall *call,
|
|||
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
|
||||
|
||||
g_signal_connect (dialog, "response", G_CALLBACK (application_unhandled_file_install), parameters_install);
|
||||
g_signal_connect (dialog, "delete-event", G_CALLBACK (delete_cb), NULL);
|
||||
gtk_widget_show_all (dialog);
|
||||
g_free (mime_type);
|
||||
|
||||
out:
|
||||
g_object_unref (proxy);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1477,9 +1448,7 @@ application_unhandled_uri (ActivateParameters *parameters, char *uri)
|
|||
char *mime_type;
|
||||
NautilusFile *file;
|
||||
ActivateParametersInstall *parameters_install;
|
||||
DBusGConnection *connection;
|
||||
DBusGProxy *proxy;
|
||||
DBusGProxyCall *call;
|
||||
GDBusConnection *connection;
|
||||
GError *error = NULL;
|
||||
|
||||
file = nautilus_file_get_by_uri (uri);
|
||||
|
@ -1495,7 +1464,7 @@ application_unhandled_uri (ActivateParameters *parameters, char *uri)
|
|||
g_object_add_weak_pointer (G_OBJECT (parameters_install->parent_window), (gpointer *)¶meters_install->parent_window);
|
||||
}
|
||||
parameters_install->activation_directory = g_strdup (parameters->activation_directory);
|
||||
parameters_install->file = nautilus_file_ref (file);
|
||||
parameters_install->file = file;
|
||||
parameters_install->files = get_file_list_for_launch_locations (parameters->locations);
|
||||
parameters_install->mode = parameters->mode;
|
||||
parameters_install->flags = parameters->flags;
|
||||
|
@ -1512,50 +1481,41 @@ application_unhandled_uri (ActivateParameters *parameters, char *uri)
|
|||
/* There is no use trying to look for handlers of application/octet-stream */
|
||||
if (g_content_type_is_unknown (mime_type)) {
|
||||
show_install_mime = FALSE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!show_install_mime) {
|
||||
goto out;
|
||||
}
|
||||
if (!show_install_mime) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check whether PackageKit can be spawned */
|
||||
connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
|
||||
if (connection == NULL) {
|
||||
g_error_free (error);
|
||||
show_install_mime = FALSE;
|
||||
goto out;
|
||||
}
|
||||
connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
|
||||
if (connection == NULL) {
|
||||
g_warning ("Could not connect to session bus: %s", error->message);
|
||||
goto out;
|
||||
}
|
||||
|
||||
proxy = dbus_g_proxy_new_for_name (connection,
|
||||
DBUS_SERVICE_DBUS,
|
||||
DBUS_PATH_DBUS,
|
||||
DBUS_INTERFACE_DBUS);
|
||||
g_dbus_proxy_new (connection,
|
||||
G_TYPE_DBUS_PROXY,
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
|
||||
NULL,
|
||||
"org.freedesktop.PackageKit",
|
||||
"/org/freedesktop/PackageKit",
|
||||
"org.freedesktop.PackageKit.Modify",
|
||||
NULL /* cancellable */,
|
||||
(GAsyncReadyCallback) pk_proxy_constructed_cb,
|
||||
parameters_install);
|
||||
|
||||
if (proxy == NULL) {
|
||||
show_install_mime = FALSE;
|
||||
goto out;
|
||||
}
|
||||
call = dbus_g_proxy_begin_call (proxy, "NameHasOwner",
|
||||
(DBusGProxyCallNotify) packagekit_present_dbus_call_notify_cb,
|
||||
parameters_install,
|
||||
NULL, /* Don't want to free user_data as we need to pass it on */
|
||||
G_TYPE_STRING, "org.freedesktop.PackageKit",
|
||||
G_TYPE_INVALID);
|
||||
if (call == NULL) {
|
||||
show_install_mime = FALSE;
|
||||
goto out;
|
||||
}
|
||||
g_object_unref (connection);
|
||||
return;
|
||||
|
||||
out:
|
||||
if (!show_install_mime) {
|
||||
/* show an unhelpful dialog */
|
||||
show_unhandled_type_error (parameters_install);
|
||||
/* The callback wasn't started, so we have to free the parameters */
|
||||
activate_parameters_install_free (parameters_install);
|
||||
}
|
||||
/* show an unhelpful dialog */
|
||||
show_unhandled_type_error (parameters_install);
|
||||
/* The callback wasn't started, so we have to free the parameters */
|
||||
activate_parameters_install_free (parameters_install);
|
||||
|
||||
nautilus_file_unref (file);
|
||||
g_free (mime_type);
|
||||
g_free (mime_type);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
|
|
@ -61,7 +61,6 @@
|
|||
#include <glib/gstdio.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <gio/gio.h>
|
||||
#include <dbus/dbus-glib.h>
|
||||
#include <eel/eel-gtk-extensions.h>
|
||||
#include <eel/eel-gtk-macros.h>
|
||||
#include <eel/eel-stock-dialogs.h>
|
||||
|
@ -125,10 +124,6 @@ static void drive_listen_for_eject_button (GDrive *drive,
|
|||
NautilusApplication *application);
|
||||
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);
|
||||
|
||||
|
@ -358,9 +353,16 @@ nautilus_application_finalize (GObject *object)
|
|||
application->automount_idle_id = 0;
|
||||
}
|
||||
|
||||
if (application->ck_session_watch_id != 0) {
|
||||
g_bus_unwatch_proxy (application->ck_session_watch_id);
|
||||
application->ck_session_watch_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_signal_handlers_disconnect_matched (application->ck_session_proxy,
|
||||
G_SIGNAL_MATCH_DATA,
|
||||
0, 0, NULL, NULL,
|
||||
application);
|
||||
g_object_unref (application->ck_session_proxy);
|
||||
application->ck_session_proxy = NULL;
|
||||
}
|
||||
|
@ -530,98 +532,130 @@ mark_desktop_files_trusted (void)
|
|||
g_free (do_once_file);
|
||||
}
|
||||
|
||||
#define CK_NAME "org.freedesktop.ConsoleKit"
|
||||
#define CK_PATH "/org/freedesktop/ConsoleKit"
|
||||
|
||||
#define CK_NAME "org.freedesktop.ConsoleKit"
|
||||
#define CK_PATH "/org/freedesktop/ConsoleKit"
|
||||
#define CK_INTERFACE "org.freedesktop.ConsoleKit"
|
||||
static void
|
||||
ck_session_active_changed_cb (DBusGProxy *proxy,
|
||||
gboolean is_active,
|
||||
void *user_data)
|
||||
ck_session_proxy_signal_cb (GDBusProxy *proxy,
|
||||
const char *sender_name,
|
||||
const char *signal_name,
|
||||
GVariant *parameters,
|
||||
gpointer user_data)
|
||||
{
|
||||
NautilusApplication *application = user_data;
|
||||
|
||||
application->session_is_active = is_active;
|
||||
if (g_strcmp0 (signal_name, "ActiveChanged") == 0) {
|
||||
g_variant_get (parameters, "(b)", &application->session_is_active);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ck_call_is_active_cb (DBusGProxy *proxy,
|
||||
DBusGProxyCall *call_id,
|
||||
void *user_data)
|
||||
ck_call_is_active_cb (GDBusProxy *proxy,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
gboolean res, is_active;
|
||||
NautilusApplication *application;
|
||||
NautilusApplication *application = user_data;
|
||||
GVariant *variant;
|
||||
|
||||
application = user_data;
|
||||
variant = g_dbus_proxy_call_finish (proxy, result, NULL);
|
||||
if (variant == NULL) {
|
||||
application->session_is_active = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
res = dbus_g_proxy_end_call (proxy, call_id, NULL,
|
||||
G_TYPE_BOOLEAN, &is_active,
|
||||
G_TYPE_INVALID);
|
||||
if (!res) {
|
||||
g_object_unref (proxy);
|
||||
g_variant_get (variant, "(b)", &application->session_is_active);
|
||||
g_variant_unref (variant);
|
||||
}
|
||||
|
||||
static void
|
||||
ck_session_proxy_constructed_cb (GDBusConnection *connection,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
NautilusApplication *application = user_data;
|
||||
GError *error = NULL;
|
||||
|
||||
application->ck_session_proxy = g_dbus_proxy_new_finish (result, &error);
|
||||
if (application->ck_session_proxy == NULL) {
|
||||
application->session_is_active = TRUE;
|
||||
g_object_unref (connection);
|
||||
return;
|
||||
}
|
||||
|
||||
g_signal_connect (application->ck_session_proxy, "g-signal",
|
||||
G_CALLBACK (ck_session_proxy_signal_cb),
|
||||
application);
|
||||
|
||||
g_dbus_proxy_call (application->ck_session_proxy,
|
||||
"IsActive",
|
||||
g_variant_new ("()"),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1,
|
||||
NULL,
|
||||
(GAsyncReadyCallback) ck_call_is_active_cb,
|
||||
application);
|
||||
|
||||
g_object_unref (connection);
|
||||
}
|
||||
|
||||
static void
|
||||
ck_get_current_session_cb (GDBusConnection *connection,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
NautilusApplication *application = user_data;
|
||||
GVariant *variant;
|
||||
const char *session_path;
|
||||
GError *error = NULL;
|
||||
|
||||
variant = g_dbus_connection_call_finish (connection, result, &error);
|
||||
if (variant == NULL) {
|
||||
g_warning ("Failed to get the current session: %s", error->message);
|
||||
g_error_free (error);
|
||||
g_object_unref (connection);
|
||||
|
||||
application->session_is_active = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
application->session_is_active = is_active;
|
||||
g_variant_get (variant, "(&o)", session_path);
|
||||
|
||||
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);
|
||||
g_dbus_proxy_new (connection,
|
||||
G_TYPE_DBUS_PROXY,
|
||||
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
|
||||
NULL,
|
||||
CK_NAME,
|
||||
session_path,
|
||||
CK_INTERFACE ".Session",
|
||||
NULL,
|
||||
(GAsyncReadyCallback) ck_session_proxy_constructed_cb,
|
||||
application);
|
||||
|
||||
g_variant_unref (variant);
|
||||
}
|
||||
|
||||
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_free (session_id);
|
||||
g_object_unref (proxy);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
do_initialize_consolekit (NautilusApplication *application)
|
||||
{
|
||||
DBusGConnection *conn;
|
||||
DBusGProxy *proxy;
|
||||
GError *error = NULL;
|
||||
GDBusConnection *connection;
|
||||
|
||||
conn = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
|
||||
if (error) {
|
||||
g_error_free (error);
|
||||
connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
|
||||
if (connection == NULL) {
|
||||
application->session_is_active = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
g_dbus_connection_call (connection,
|
||||
CK_NAME,
|
||||
CK_PATH "/Manager",
|
||||
CK_INTERFACE ".Manager",
|
||||
"GetCurrentSession",
|
||||
g_variant_new ("()"),
|
||||
G_DBUS_CALL_FLAGS_NONE /* FIXME? */,
|
||||
-1,
|
||||
NULL /* FIXME? */,
|
||||
(GAsyncReadyCallback) ck_get_current_session_cb,
|
||||
application);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include <gio/gio.h>
|
||||
#include <unique/unique.h>
|
||||
#include <libegg/eggsmclient.h>
|
||||
#include <dbus/dbus-glib.h>
|
||||
#include <libnautilus-private/nautilus-undo-manager.h>
|
||||
|
||||
#define NAUTILUS_DESKTOP_ICON_VIEW_IID "OAFIID:Nautilus_File_Manager_Desktop_Icon_View"
|
||||
|
@ -67,7 +66,8 @@ typedef struct {
|
|||
NautilusUndoManager *undo_manager;
|
||||
GVolumeMonitor *volume_monitor;
|
||||
unsigned int automount_idle_id;
|
||||
DBusGProxy *ck_session_proxy;
|
||||
GDBusProxy *ck_session_proxy;
|
||||
guint ck_session_watch_id;
|
||||
gboolean session_is_active;
|
||||
} NautilusApplication;
|
||||
|
||||
|
|
Loading…
Reference in a new issue