Skip to content

Commit

Permalink
Use new DBus API to show the current image in the file browser
Browse files Browse the repository at this point in the history
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
  • Loading branch information
fxri authored and raveit65 committed Jul 3, 2018
1 parent 07de875 commit fb4446d
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 34 deletions.
86 changes: 86 additions & 0 deletions src/eom-util.c
Expand Up @@ -343,3 +343,89 @@ eom_util_file_is_persistent (GFile *file)


return TRUE; 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);
}
4 changes: 4 additions & 0 deletions src/eom-util.h
Expand Up @@ -63,6 +63,10 @@ char * eom_util_filename_get_extension (const char * filename_with_extensi
G_GNUC_INTERNAL G_GNUC_INTERNAL
gboolean eom_util_file_is_persistent (GFile *file); 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 G_END_DECLS


#endif /* __EOM_UTIL_H__ */ #endif /* __EOM_UTIL_H__ */
40 changes: 6 additions & 34 deletions src/eom-window.c
Expand Up @@ -2956,49 +2956,21 @@ eom_window_cmd_save_as (GtkAction *action, gpointer user_data)
static void static void
eom_window_cmd_open_containing_folder (GtkAction *action, gpointer user_data) eom_window_cmd_open_containing_folder (GtkAction *action, gpointer user_data)
{ {
EomWindow *window = EOM_WINDOW (user_data);
EomWindowPrivate *priv; EomWindowPrivate *priv;


GtkWidget *eom_window_widget;

GFile *file; GFile *file;
GFile *parent = NULL; g_return_if_fail (EOM_IS_WINDOW (user_data));


eom_window_widget = GTK_WIDGET (window); priv = EOM_WINDOW (user_data)->priv;
priv = window->priv;


g_return_if_fail (priv->image != NULL); g_return_if_fail (priv->image != NULL);


file = eom_image_get_file (priv->image); file = eom_image_get_file (priv->image);


if (file) { g_return_if_fail (file != NULL);
parent = g_file_get_parent (file);
g_object_unref(file);
}

if (parent) {
char *parent_uri;


parent_uri = g_file_get_uri (parent); eom_util_show_file_in_filemanager (file,
if (parent_uri) { gtk_widget_get_screen (GTK_WIDGET (user_data)));
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);
}
} }


static void static void
Expand Down

0 comments on commit fb4446d

Please sign in to comment.