diff --git a/zathura/zathura.c b/zathura/zathura.c index 391f756..101b7ee 100644 --- a/zathura/zathura.c +++ b/zathura/zathura.c @@ -502,6 +502,41 @@ prepare_document_open_from_stdin(zathura_t* zathura, const char* path) return file; } +static gchar* +prepare_document_open_from_gfile(zathura_t* zathura, GFile* source) +{ + g_return_val_if_fail(zathura, NULL); + gchar* file = NULL; + GFileIOStream *iostream; + GError* error = NULL; + + GFile *tmpfile = g_file_new_tmp("zathura.gio.XXXXXX", &iostream, &error); + if(tmpfile == NULL) { + if (error != NULL) { + girara_error("Can not create temporary file: %s", error->message); + g_error_free(error); + } + return NULL; + } + + gboolean rc = g_file_copy(source, tmpfile, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error); + if(rc == FALSE) { + if (error != NULL) { + girara_error("Can not copy to temporary file: %s", error->message); + g_error_free(error); + } + g_object_unref(iostream); + g_object_unref(tmpfile); + return NULL; + } + + file = g_file_get_path(tmpfile); + g_object_unref(iostream); + g_object_unref(tmpfile); + + return file; +} + static gboolean document_info_open(gpointer data) { @@ -520,7 +555,20 @@ document_info_open(gpointer data) document_info->zathura->stdin_support.file = g_strdup(file); } } else { - file = g_strdup(document_info->path); + GFile *gf = g_file_new_for_commandline_arg(document_info->path); + if(g_file_is_native(gf)) { + file = g_strdup(document_info->path); + } + else { + file = prepare_document_open_from_gfile(document_info->zathura, gf); + if (file == NULL) { + girara_notify(document_info->zathura->ui.session, GIRARA_ERROR, + _("Could not read file from GIO and copy it to a temporary file.")); + } else { + document_info->zathura->stdin_support.file = g_strdup(file); + } + } + g_object_unref(gf); } if (file != NULL) {