summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Riemann <[email protected]>2011-12-15 19:36:06 +0100
committerraveit65 <[email protected]>2018-07-03 10:39:59 +0200
commitfb4446d3d00753a9918a4792e73a70b4a806ce09 (patch)
treefb4c8e3b7fe7886b94cce6fec5ce615330fad4b3
parent07de8758476b62430ca15f29d0d75b88afef1345 (diff)
downloadeom-fb4446d3d00753a9918a4792e73a70b4a806ce09.tar.bz2
eom-fb4446d3d00753a9918a4792e73a70b4a806ce09.tar.xz
Use new DBus API to show the current image in the file browser
This improves the functionality implemented with commit 9df5fd43. The new API that will be included in Nautilus 3.3.4 not only opens a view for the containing folder but also marks the image in the view. The old behaviour is still available as fallback if the new API is not offered on the system. https://bugzilla.gnome.org/show_bug.cgi?id=650402 origin commit: https://git.gnome.org/browse/eog/commit/?h=gnome-3-4&id=fa74473
-rw-r--r--src/eom-util.c86
-rw-r--r--src/eom-util.h4
-rw-r--r--src/eom-window.c40
3 files changed, 96 insertions, 34 deletions
diff --git a/src/eom-util.c b/src/eom-util.c
index 5fd2335..33bd36f 100644
--- a/src/eom-util.c
+++ b/src/eom-util.c
@@ -343,3 +343,89 @@ eom_util_file_is_persistent (GFile *file)
return TRUE;
}
+
+static void
+_eom_util_show_file_in_filemanager_fallback (GFile *file, GdkScreen *screen)
+{
+ gchar *uri = NULL;
+ GError *error = NULL;
+ guint32 timestamp = gtk_get_current_event_time ();
+
+ if (g_file_query_file_type (file, 0, NULL) == G_FILE_TYPE_DIRECTORY) {
+ uri = g_file_get_uri (file);
+ } else {
+ /* If input file is not a directory we must open it's
+ folder/parent to avoid opening the file itself */
+ GFile *parent_file;
+
+ parent_file = g_file_get_parent (file);
+ if (G_LIKELY (parent_file))
+ uri = g_file_get_uri (parent_file);
+ g_object_unref (parent_file);
+ }
+
+ if (uri && !gtk_show_uri (screen, uri, timestamp, &error)) {
+ g_warning ("Couldn't show containing folder \"%s\": %s", uri,
+ error->message);
+ g_error_free (error);
+ }
+
+ g_free (uri);
+}
+
+void
+eom_util_show_file_in_filemanager (GFile *file, GdkScreen *screen)
+{
+ GDBusProxy *proxy;
+ gboolean done = FALSE;
+
+ g_return_if_fail (file != NULL);
+
+ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS |
+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+ NULL, "org.freedesktop.FileManager1",
+ "/org/freedesktop/FileManager1",
+ "org.freedesktop.FileManager1",
+ NULL, NULL);
+
+ if (proxy) {
+ gchar *uri = g_file_get_uri (file);
+ gchar *startup_id;
+ GVariant *params, *result;
+ GVariantBuilder builder;
+
+ g_variant_builder_init (&builder,
+ G_VARIANT_TYPE ("as"));
+ g_variant_builder_add (&builder, "s", uri);
+
+ /* This seems to be the expected format, as other values
+ cause the filemanager window not to get focus. */
+ startup_id = g_strdup_printf("_TIME%u",
+ gtk_get_current_event_time());
+
+ /* params is floating! */
+ params = g_variant_new ("(ass)", &builder, startup_id);
+
+ g_free (startup_id);
+ g_variant_builder_clear (&builder);
+
+ /* Floating params-GVariant is consumed here */
+ result = g_dbus_proxy_call_sync (proxy, "ShowItems",
+ params, G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, NULL);
+
+ /* Receiving a non-NULL result counts as a successful call. */
+ if (G_LIKELY (result != NULL)) {
+ done = TRUE;
+ g_variant_unref (result);
+ }
+
+ g_free (uri);
+ g_object_unref (proxy);
+ }
+
+ /* Fallback to gtk_show_uri() if launch over DBus is not possible */
+ if (!done)
+ _eom_util_show_file_in_filemanager_fallback (file, screen);
+}
diff --git a/src/eom-util.h b/src/eom-util.h
index 9e9ef6b..3d0f40c 100644
--- a/src/eom-util.h
+++ b/src/eom-util.h
@@ -63,6 +63,10 @@ char * eom_util_filename_get_extension (const char * filename_with_extensi
G_GNUC_INTERNAL
gboolean eom_util_file_is_persistent (GFile *file);
+G_GNUC_INTERNAL
+void eom_util_show_file_in_filemanager (GFile *file,
+ GdkScreen *screen);
+
G_END_DECLS
#endif /* __EOM_UTIL_H__ */
diff --git a/src/eom-window.c b/src/eom-window.c
index 4bff663..1fb2e60 100644
--- a/src/eom-window.c
+++ b/src/eom-window.c
@@ -2956,49 +2956,21 @@ eom_window_cmd_save_as (GtkAction *action, gpointer user_data)
static void
eom_window_cmd_open_containing_folder (GtkAction *action, gpointer user_data)
{
- EomWindow *window = EOM_WINDOW (user_data);
EomWindowPrivate *priv;
- GtkWidget *eom_window_widget;
-
GFile *file;
- GFile *parent = NULL;
-
- eom_window_widget = GTK_WIDGET (window);
- priv = window->priv;
+ g_return_if_fail (EOM_IS_WINDOW (user_data));
+
+ priv = EOM_WINDOW (user_data)->priv;
g_return_if_fail (priv->image != NULL);
file = eom_image_get_file (priv->image);
- if (file) {
- parent = g_file_get_parent (file);
- g_object_unref(file);
- }
-
- if (parent) {
- char *parent_uri;
+ g_return_if_fail (file != NULL);
- parent_uri = g_file_get_uri (parent);
- if (parent_uri) {
- GdkScreen *screen;
- guint32 timestamp;
- GError *error;
-
- screen = gtk_widget_get_screen (eom_window_widget);
- timestamp = gtk_get_current_event_time ();
-
- error = NULL;
- if (!gtk_show_uri (screen, parent_uri, timestamp, &error)) {
- eom_debug_message (DEBUG_WINDOW, "Could not open the containing folder");
- g_error_free (error);
- }
-
- g_free (parent_uri);
- }
-
- g_object_unref(parent);
- }
+ eom_util_show_file_in_filemanager (file,
+ gtk_widget_get_screen (GTK_WIDGET (user_data)));
}
static void