1
0
mirror of https://gitlab.gnome.org/GNOME/evince synced 2024-06-30 22:54:23 +00:00

cut-n-paste: filemanager: create proxy synchronously

We can create the proxy without forcing the launch of the peer
process or waiting for signals/properties. Since this won't block
we meet the needs of [!46] but without the extra main loop
processing. This is important because it allows
tests/test-file-manager to still work as all the necessary RPC
bytes will be written to the stream before exiting

---

Cherry-picked this commit from libdazzle.

[!46]: https://gitlab.gnome.org/GNOME/libdazzle/-/merge_requests/46

Signed-off-by: Germán Poo-Caamaño <gpoo@gnome.org>
This commit is contained in:
Christian Hergert 2020-06-22 19:02:30 -04:00 committed by Germán Poo-Caamaño
parent 20728d6008
commit 6e87290dab

View File

@ -42,55 +42,20 @@
#if !(defined(G_OS_WIN32) || defined(PLATFORM_OSX))
static void
select_file_in_containing_folder_cb (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
show_items_cb (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
GError *error = NULL;
GDBusProxy *proxy = (GDBusProxy *)source_object;
g_autoptr(GVariant) reply = NULL;
g_autoptr(GError) error = NULL;
g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), result, &error);
g_assert (G_IS_DBUS_PROXY (proxy));
g_assert (G_IS_ASYNC_RESULT (result));
g_assert (user_data == NULL);
if (error != NULL)
{
g_prefix_error (&error, _("Calling ShowItems failed: "));
g_error_free (error);
}
}
static void
select_file_in_containing_folder (GObject *source_object,
GAsyncResult *result,
gchar *uri)
{
GDBusProxy *proxy;
GError *error = NULL;
GVariantBuilder *builder;
proxy = g_dbus_proxy_new_finish (result, &error);
if (proxy != NULL)
{
g_prefix_error (&error,
_("Connecting to org.freedesktop.FileManager1 failed: "));
g_error_free (error);
return;
}
builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
g_variant_builder_add (builder, "s", uri);
g_free (uri);
g_dbus_proxy_call (proxy,
"ShowItems",
g_variant_new ("(ass)", builder, ""),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
(GAsyncReadyCallback) select_file_in_containing_folder_cb,
NULL);
g_variant_builder_unref (builder);
if (!(reply = g_dbus_proxy_call_finish (proxy, result, &error)))
g_warning ("Failed to show items: %s", error->message);
}
#endif /* !(defined(G_OS_WIN32) || defined(PLATFORM_OSX)) */
@ -198,20 +163,35 @@ dzl_file_manager_show (GFile *file,
#else /* UNIX */
{
gchar *uri;
g_autofree gchar *uri = g_file_get_uri (file);
g_autoptr(GVariantBuilder) builder = NULL;
g_autoptr(GDBusProxy) proxy = NULL;
uri = g_file_get_uri (file);
proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
(G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS |
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION),
NULL,
"org.freedesktop.FileManager1",
"/org/freedesktop/FileManager1",
"org.freedesktop.FileManager1",
NULL,
error);
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
"org.freedesktop.FileManager1",
"/org/freedesktop/FileManager1",
"org.freedesktop.FileManager1",
NULL,
(GAsyncReadyCallback) select_file_in_containing_folder,
uri);
/* select_file_in_containing_folder must free `uri` when no longer needed */
/* Implausible */
if (proxy == NULL)
return FALSE;
builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
g_variant_builder_add (builder, "s", uri);
g_dbus_proxy_call (proxy,
"ShowItems",
g_variant_new ("(ass)", builder, ""),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
show_items_cb,
NULL);
return TRUE;
}