diff options
-rw-r--r-- | src/eom-util.c | 86 | ||||
-rw-r--r-- | src/eom-util.h | 4 | ||||
-rw-r--r-- | src/eom-window.c | 40 |
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 |