summaryrefslogtreecommitdiff
path: root/src/nautilus-freedesktop-dbus.c
diff options
context:
space:
mode:
authorErnestas Kulik <ernestask@gnome.org>2018-04-03 14:58:52 +0300
committerErnestas Kulik <ernestask@gnome.org>2018-04-03 15:04:01 +0300
commit3014f69485a120bedf0eec5af441346a95fe27f7 (patch)
tree6f2d0ac0dca140c021ccdfae06d0fb47c71480e1 /src/nautilus-freedesktop-dbus.c
parenta34319fe3770cc657ed22d5d76f886aaae197c00 (diff)
downloadnautilus-3014f69485a120bedf0eec5af441346a95fe27f7.tar.gz
freedesktop-dbus: Defer D-Bus property setting
In some cases (particularly when no I/O is performed, e.g. opening other-locations:/// directly), the FDO FileManager1 object OpenLocations property is set before the connection is made. This commit makes the code defer doing that until then.
Diffstat (limited to 'src/nautilus-freedesktop-dbus.c')
-rw-r--r--src/nautilus-freedesktop-dbus.c49
1 files changed, 48 insertions, 1 deletions
diff --git a/src/nautilus-freedesktop-dbus.c b/src/nautilus-freedesktop-dbus.c
index c4657aba3..554b1bc3d 100644
--- a/src/nautilus-freedesktop-dbus.c
+++ b/src/nautilus-freedesktop-dbus.c
@@ -41,6 +41,10 @@ struct _NautilusFreedesktopDBus
/* Our DBus implementation skeleton */
NautilusFreedesktopFileManager1 *skeleton;
+
+ GStrv pending_open_locations;
+
+ gboolean name_lost;
};
struct _NautilusFreedesktopDBusClass
@@ -160,6 +164,15 @@ bus_acquired_cb (GDBusConnection *conn,
G_CALLBACK (skeleton_handle_show_item_properties_cb), fdb);
g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (fdb->skeleton), conn, NAUTILUS_FDO_DBUS_PATH, NULL);
+
+ if (G_UNLIKELY (fdb->pending_open_locations != NULL))
+ {
+ g_auto (GStrv) locations = NULL;
+
+ locations = g_steal_pointer (&fdb->pending_open_locations);
+
+ nautilus_freedesktop_dbus_set_open_locations (fdb, (const gchar **) locations);
+ }
}
static void
@@ -175,7 +188,13 @@ name_lost_cb (GDBusConnection *connection,
const gchar *name,
gpointer user_data)
{
+ NautilusFreedesktopDBus *fdb;
+
DEBUG ("Lost (or failed to acquire) the name %s on the session message bus\n", name);
+
+ fdb = NAUTILUS_FREEDESKTOP_DBUS (user_data);
+
+ fdb->name_lost = TRUE;
}
static void
@@ -200,11 +219,22 @@ nautilus_freedesktop_dbus_dispose (GObject *object)
}
static void
+nautilus_freedesktop_dbus_finalize (GObject *object)
+{
+ NautilusFreedesktopDBus *fdb;
+
+ fdb = NAUTILUS_FREEDESKTOP_DBUS (object);
+
+ g_clear_pointer (&fdb->pending_open_locations, g_strfreev);
+}
+
+static void
nautilus_freedesktop_dbus_class_init (NautilusFreedesktopDBusClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = nautilus_freedesktop_dbus_dispose;
+ object_class->finalize = nautilus_freedesktop_dbus_finalize;
}
static void
@@ -218,6 +248,9 @@ nautilus_freedesktop_dbus_init (NautilusFreedesktopDBus *fdb)
name_lost_cb,
fdb,
NULL);
+ fdb->skeleton = NULL;
+ fdb->pending_open_locations = NULL;
+ fdb->name_lost = FALSE;
}
void
@@ -226,7 +259,21 @@ nautilus_freedesktop_dbus_set_open_locations (NautilusFreedesktopDBus *fdb,
{
g_return_if_fail (NAUTILUS_IS_FREEDESKTOP_DBUS (fdb));
- nautilus_freedesktop_file_manager1_set_open_locations (fdb->skeleton, locations);
+ if (G_UNLIKELY (fdb->skeleton == NULL))
+ {
+ if (G_LIKELY (fdb->name_lost))
+ {
+ return;
+ }
+
+ g_clear_pointer (&fdb->pending_open_locations, g_strfreev);
+
+ fdb->pending_open_locations = g_strdupv ((gchar **) locations);
+ }
+ else
+ {
+ nautilus_freedesktop_file_manager1_set_open_locations (fdb->skeleton, locations);
+ }
}
/* Tries to own the org.freedesktop.FileManager1 service name */