summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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