diff --git a/types.c b/types.c index c72e46a..11ee0c2 100644 --- a/types.c +++ b/types.c @@ -20,6 +20,7 @@ zathura_link_new(zathura_link_type_t type, zathura_rectangle_t position, case ZATHURA_LINK_GOTO_DEST: link->target.page_number = target.page_number; break; + case ZATHURA_LINK_GOTO_REMOTE: case ZATHURA_LINK_URI: if (target.value == NULL) { g_free(link); diff --git a/utils.c b/utils.c index 285bb08..02f3a25 100644 --- a/utils.c +++ b/utils.c @@ -338,6 +338,9 @@ zathura_link_evaluate(zathura_t* zathura, zathura_link_t* link) case ZATHURA_LINK_GOTO_DEST: page_set_delayed(zathura, link->target.page_number); break; + case ZATHURA_LINK_GOTO_REMOTE: + open_remote(zathura, link->target.value); + break; case ZATHURA_LINK_URI: if (girara_xdg_open(link->target.value) == false) { girara_notify(zathura->ui.session, GIRARA_ERROR, _("Failed to run xdg-open.")); @@ -347,3 +350,26 @@ zathura_link_evaluate(zathura_t* zathura, zathura_link_t* link) break; } } + +void +open_remote(zathura_t* zathura, const char* file) +{ + if (zathura == NULL || file == NULL || zathura->document == NULL) { + return; + } + + const char* path = zathura_document_get_path(zathura->document); + char* dir = g_path_get_dirname(path); + char* uri = g_build_filename(dir, file, NULL); + + char* argv[] = { + *(zathura->global.arguments), + uri, + NULL + }; + + g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL); + + g_free(uri); + g_free(dir); +} diff --git a/utils.h b/utils.h index 75324ba..63b3544 100644 --- a/utils.h +++ b/utils.h @@ -130,4 +130,15 @@ void readjust_view_after_zooming(zathura_t* zathura, float old_zoom); */ void zathura_link_evaluate(zathura_t* zathura, zathura_link_t* link); +/** + * Opens a remote file + * + * Determines the path of the current document and tries to open a given file + * in that path + * + * @param zathura Zathura instance + * @param file File name + */ +void open_remote(zathura_t* zathura, const char* file); + #endif // UTILS_H diff --git a/zathura.c b/zathura.c index f444617..17338e5 100644 --- a/zathura.c +++ b/zathura.c @@ -169,6 +169,7 @@ zathura_init(int argc, char* argv[]) /* global settings */ zathura->global.recolor = false; zathura->global.update_page_number = true; + zathura->global.arguments = argv; /* load plugins */ zathura_plugin_manager_load(zathura->plugins.manager); diff --git a/zathura.h b/zathura.h index 837c493..9e40dcb 100644 --- a/zathura.h +++ b/zathura.h @@ -77,6 +77,7 @@ struct zathura_s bool recolor; /**< Recoloring mode switch */ bool update_page_number; /**< Update current page number */ girara_list_t* marks; /**< Marker */ + char** arguments; /**> Arguments that were passed at startup */ } global; struct