diff options
author | Přemysl Eric Janouch <p@janouch.name> | 2022-08-05 03:25:31 +0200 |
---|---|---|
committer | Přemysl Eric Janouch <p@janouch.name> | 2022-08-05 04:15:42 +0200 |
commit | 51dc56c9dfa26b560f367d2060a7147084cb7138 (patch) | |
tree | b687cb28024acc3480c421b02eb69b1d064e411d | |
parent | bb669743b606b6972485eec3153a22a5106b0427 (diff) | |
download | fiv-51dc56c9dfa26b560f367d2060a7147084cb7138.tar.gz fiv-51dc56c9dfa26b560f367d2060a7147084cb7138.tar.xz fiv-51dc56c9dfa26b560f367d2060a7147084cb7138.zip |
Improve support for opening HTTP URIs
While all GVfs files implement the mountable interface,
mounting may not actually achieve anything.
-rw-r--r-- | fiv.c | 29 |
1 files changed, 23 insertions, 6 deletions
@@ -913,27 +913,44 @@ on_item_activated(G_GNUC_UNUSED FivBrowser *browser, GFile *location, static void open_any_file(GFile *file, gboolean force_browser); static void -on_mounted_enclosing(GObject *source_object, GAsyncResult *res, - G_GNUC_UNUSED gpointer user_data) +on_mounted_enclosing( + GObject *source_object, GAsyncResult *res, gpointer user_data) { GFile *file = G_FILE(source_object); GError *error = NULL; - if (!g_file_mount_enclosing_volume_finish(file, res, &error)) + if (g_file_mount_enclosing_volume_finish(file, res, &error)) + goto retry; + + if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_ALREADY_MOUNTED)) { show_error_dialog(error); - else - open_any_file(file, FALSE); + return; + } + + // The "http" scheme doesn't behave nicely, make a leap of faith. + g_error_free(error); + if (g_file_query_file_type(file, G_FILE_QUERY_INFO_NONE, NULL) == + G_FILE_TYPE_UNKNOWN) { + gchar *uri = g_file_get_uri(file); + open_image(uri); + g_free(uri); + return; + } + +retry: + open_any_file(file, (gboolean) (gintptr) user_data); } static void open_any_file(GFile *file, gboolean force_browser) { + // Various GVfs schemes may need mounting. GFileType type = g_file_query_file_type(file, G_FILE_QUERY_INFO_NONE, NULL); if (type == G_FILE_TYPE_UNKNOWN && G_FILE_GET_IFACE(file)->mount_enclosing_volume) { // TODO(p): At least provide some kind of indication. GMountOperation *op = gtk_mount_operation_new(GTK_WINDOW(g.window)); g_file_mount_enclosing_volume(file, G_MOUNT_MOUNT_NONE, op, NULL, - on_mounted_enclosing, NULL); + on_mounted_enclosing, (gpointer) (gintptr) force_browser); g_object_unref(op); return; } |