mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2024-12-29 10:55:59 +01:00
Improve zathura_link_t
This commit is contained in:
parent
325ea7ede9
commit
365dc9a66e
11 changed files with 285 additions and 240 deletions
2
Makefile
2
Makefile
|
@ -6,7 +6,7 @@ include common.mk
|
||||||
PROJECT = zathura
|
PROJECT = zathura
|
||||||
OSOURCE = $(wildcard *.c)
|
OSOURCE = $(wildcard *.c)
|
||||||
HEADER = $(wildcard *.h)
|
HEADER = $(wildcard *.h)
|
||||||
HEADERINST = version.h document.h macros.h page.h types.h plugin-api.h
|
HEADERINST = version.h document.h macros.h page.h types.h plugin-api.h links.h
|
||||||
|
|
||||||
ifneq (${WITH_SQLITE},0)
|
ifneq (${WITH_SQLITE},0)
|
||||||
INCS += $(SQLITE_INC)
|
INCS += $(SQLITE_INC)
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
#include "callbacks.h"
|
#include "callbacks.h"
|
||||||
|
#include "links.h"
|
||||||
#include "zathura.h"
|
#include "zathura.h"
|
||||||
#include "render.h"
|
#include "render.h"
|
||||||
#include "document.h"
|
#include "document.h"
|
||||||
|
|
|
@ -21,13 +21,6 @@ struct zathura_document_information_entry_s
|
||||||
char* value; /**< Value */
|
char* value; /**< Value */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct zathura_link_s
|
|
||||||
{
|
|
||||||
zathura_rectangle_t position; /**< Position of the link */
|
|
||||||
zathura_link_type_t type; /**< Link type */
|
|
||||||
zathura_link_target_t target; /**< Link target */
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the associated plugin
|
* Returns the associated plugin
|
||||||
*
|
*
|
||||||
|
|
191
links.c
Normal file
191
links.c
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
/* See LICENSE file for license and copyright information */
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include <glib/gi18n.h>
|
||||||
|
#include <girara/utils.h>
|
||||||
|
#include <girara/session.h>
|
||||||
|
|
||||||
|
#include "links.h"
|
||||||
|
#include "zathura.h"
|
||||||
|
#include "document.h"
|
||||||
|
|
||||||
|
struct zathura_link_s
|
||||||
|
{
|
||||||
|
zathura_rectangle_t position; /**< Position of the link */
|
||||||
|
zathura_link_type_t type; /**< Link type */
|
||||||
|
zathura_link_target_t target; /**< Link target */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* forward declarations */
|
||||||
|
static void link_remote(zathura_t* zathura, const char* file);
|
||||||
|
static void link_launch(zathura_t* zathura, zathura_link_t* link);
|
||||||
|
|
||||||
|
zathura_link_t*
|
||||||
|
zathura_link_new(zathura_link_type_t type, zathura_rectangle_t position,
|
||||||
|
zathura_link_target_t target)
|
||||||
|
{
|
||||||
|
zathura_link_t* link = g_malloc0(sizeof(zathura_link_t));
|
||||||
|
|
||||||
|
link->type = type;
|
||||||
|
link->position = position;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
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);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
link->target.value = g_strdup(target.value);
|
||||||
|
break;
|
||||||
|
case ZATHURA_LINK_LAUNCH:
|
||||||
|
if (target.value == NULL) {
|
||||||
|
g_free(link);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
link->target.value = g_strdup(target.value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_free(link);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return link;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
zathura_link_free(zathura_link_t* link)
|
||||||
|
{
|
||||||
|
if (link == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (link->type) {
|
||||||
|
case ZATHURA_LINK_URI:
|
||||||
|
case ZATHURA_LINK_LAUNCH:
|
||||||
|
if (link->target.value != NULL) {
|
||||||
|
g_free(link->target.value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free(link);
|
||||||
|
}
|
||||||
|
|
||||||
|
zathura_link_type_t
|
||||||
|
zathura_link_get_type(zathura_link_t* link)
|
||||||
|
{
|
||||||
|
if (link == NULL) {
|
||||||
|
return ZATHURA_LINK_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
return link->type;
|
||||||
|
}
|
||||||
|
|
||||||
|
zathura_rectangle_t
|
||||||
|
zathura_link_get_position(zathura_link_t* link)
|
||||||
|
{
|
||||||
|
if (link == NULL) {
|
||||||
|
zathura_rectangle_t position = { 0, 0, 0, 0 };
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
return link->position;
|
||||||
|
}
|
||||||
|
|
||||||
|
zathura_link_target_t
|
||||||
|
zathura_link_get_target(zathura_link_t* link)
|
||||||
|
{
|
||||||
|
if (link == NULL) {
|
||||||
|
zathura_link_target_t target = { 0 };
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
return link->target;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
zathura_link_evaluate(zathura_t* zathura, zathura_link_t* link)
|
||||||
|
{
|
||||||
|
if (zathura == NULL || link == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (link->type) {
|
||||||
|
case ZATHURA_LINK_GOTO_DEST:
|
||||||
|
page_set_delayed(zathura, link->target.page_number);
|
||||||
|
break;
|
||||||
|
case ZATHURA_LINK_GOTO_REMOTE:
|
||||||
|
link_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."));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ZATHURA_LINK_LAUNCH:
|
||||||
|
link_launch(zathura, link);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
link_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);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
link_launch(zathura_t* zathura, zathura_link_t* link)
|
||||||
|
{
|
||||||
|
if (zathura == NULL || link == NULL || zathura->document == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get file path */
|
||||||
|
if (link->target.value == NULL) {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
char* path = NULL;
|
||||||
|
if (g_path_is_absolute(link->target.value) == TRUE) {
|
||||||
|
path = g_strdup(link->target.value);
|
||||||
|
} else {
|
||||||
|
const char* document = zathura_document_get_path(zathura->document);
|
||||||
|
char* dir = g_path_get_dirname(document);
|
||||||
|
path = g_build_filename(dir, link->target.value, NULL);
|
||||||
|
g_free(dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (girara_xdg_open(path) == false) {
|
||||||
|
girara_notify(zathura->ui.session, GIRARA_ERROR, _("Failed to run xdg-open."));
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free(path);
|
||||||
|
}
|
59
links.h
Normal file
59
links.h
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/* See LICENSE file for license and copyright information */
|
||||||
|
|
||||||
|
#ifndef LINK_H
|
||||||
|
#define LINK_H
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new zathura link
|
||||||
|
*
|
||||||
|
* @param type Type of the link
|
||||||
|
* @param position Position of the link
|
||||||
|
* @param target Target
|
||||||
|
* @return New zathura link
|
||||||
|
*/
|
||||||
|
zathura_link_t*
|
||||||
|
zathura_link_new(zathura_link_type_t type, zathura_rectangle_t position,
|
||||||
|
zathura_link_target_t target);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free link
|
||||||
|
*
|
||||||
|
* @param link The link
|
||||||
|
*/
|
||||||
|
void zathura_link_free(zathura_link_t* link);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the type of the link
|
||||||
|
*
|
||||||
|
* @param link The link
|
||||||
|
* @return The target type of the link
|
||||||
|
*/
|
||||||
|
zathura_link_type_t zathura_link_get_type(zathura_link_t* link);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the position of the link
|
||||||
|
*
|
||||||
|
* @param link The link
|
||||||
|
* @return The position of the link
|
||||||
|
*/
|
||||||
|
zathura_rectangle_t zathura_link_get_position(zathura_link_t* link);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The target value of the link
|
||||||
|
*
|
||||||
|
* @param link The link
|
||||||
|
* @return Returns the target of the link (depends on the link type)
|
||||||
|
*/
|
||||||
|
zathura_link_target_t zathura_link_get_target(zathura_link_t* link);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate link
|
||||||
|
*
|
||||||
|
* @param zathura Zathura instance
|
||||||
|
* @param link The link
|
||||||
|
*/
|
||||||
|
void zathura_link_evaluate(zathura_t* zathura, zathura_link_t* link);
|
||||||
|
|
||||||
|
#endif // LINK_H
|
|
@ -7,6 +7,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
|
#include "links.h"
|
||||||
#include "page-widget.h"
|
#include "page-widget.h"
|
||||||
#include "page.h"
|
#include "page.h"
|
||||||
#include "render.h"
|
#include "render.h"
|
||||||
|
@ -224,7 +225,7 @@ zathura_page_widget_set_property(GObject* object, guint prop_id, const GValue* v
|
||||||
if (priv->links.retrieved == true && priv->links.list != NULL) {
|
if (priv->links.retrieved == true && priv->links.list != NULL) {
|
||||||
GIRARA_LIST_FOREACH(priv->links.list, zathura_link_t*, iter, link)
|
GIRARA_LIST_FOREACH(priv->links.list, zathura_link_t*, iter, link)
|
||||||
if (link != NULL) {
|
if (link != NULL) {
|
||||||
zathura_rectangle_t rectangle = recalc_rectangle(priv->page, link->position);
|
zathura_rectangle_t rectangle = recalc_rectangle(priv->page, zathura_link_get_position(link));
|
||||||
redraw_rect(pageview, &rectangle);
|
redraw_rect(pageview, &rectangle);
|
||||||
}
|
}
|
||||||
GIRARA_LIST_FOREACH_END(priv->links.list, zathura_link_t*, iter, link);
|
GIRARA_LIST_FOREACH_END(priv->links.list, zathura_link_t*, iter, link);
|
||||||
|
@ -379,7 +380,7 @@ zathura_page_widget_draw(GtkWidget* widget, cairo_t* cairo)
|
||||||
unsigned int link_counter = 0;
|
unsigned int link_counter = 0;
|
||||||
GIRARA_LIST_FOREACH(priv->links.list, zathura_link_t*, iter, link)
|
GIRARA_LIST_FOREACH(priv->links.list, zathura_link_t*, iter, link)
|
||||||
if (link != NULL) {
|
if (link != NULL) {
|
||||||
zathura_rectangle_t rectangle = recalc_rectangle(priv->page, link->position);
|
zathura_rectangle_t rectangle = recalc_rectangle(priv->page, zathura_link_get_position(link));
|
||||||
|
|
||||||
/* draw position */
|
/* draw position */
|
||||||
GdkColor color = priv->zathura->ui.colors.highlight_color;
|
GdkColor color = priv->zathura->ui.colors.highlight_color;
|
||||||
|
@ -588,7 +589,7 @@ cb_zathura_page_widget_button_release_event(GtkWidget* widget, GdkEventButton* b
|
||||||
|
|
||||||
if (priv->links.list != NULL && priv->links.n > 0) {
|
if (priv->links.list != NULL && priv->links.n > 0) {
|
||||||
GIRARA_LIST_FOREACH(priv->links.list, zathura_link_t*, iter, link)
|
GIRARA_LIST_FOREACH(priv->links.list, zathura_link_t*, iter, link)
|
||||||
zathura_rectangle_t rect = recalc_rectangle(priv->page, link->position);
|
zathura_rectangle_t rect = recalc_rectangle(priv->page, zathura_link_get_position(link));
|
||||||
if (rect.x1 <= button->x && rect.x2 >= button->x
|
if (rect.x1 <= button->x && rect.x2 >= button->x
|
||||||
&& rect.y1 <= button->y && rect.y2 >= button->y) {
|
&& rect.y1 <= button->y && rect.y2 >= button->y) {
|
||||||
zathura_link_evaluate(priv->zathura, link);
|
zathura_link_evaluate(priv->zathura, link);
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include "page.h"
|
#include "page.h"
|
||||||
#include "document.h"
|
#include "document.h"
|
||||||
|
#include "links.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
typedef struct zathura_plugin_functions_s zathura_plugin_functions_t;
|
typedef struct zathura_plugin_functions_s zathura_plugin_functions_t;
|
||||||
|
|
87
types.c
87
types.c
|
@ -5,94 +5,9 @@
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
#include "links.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
zathura_link_t*
|
|
||||||
zathura_link_new(zathura_link_type_t type, zathura_rectangle_t position,
|
|
||||||
zathura_link_target_t target)
|
|
||||||
{
|
|
||||||
zathura_link_t* link = g_malloc0(sizeof(zathura_link_t));
|
|
||||||
|
|
||||||
link->type = type;
|
|
||||||
link->position = position;
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
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);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
link->target.value = g_strdup(target.value);
|
|
||||||
break;
|
|
||||||
case ZATHURA_LINK_LAUNCH:
|
|
||||||
if (target.value == NULL) {
|
|
||||||
g_free(link);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
link->target.value = g_strdup(target.value);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_free(link);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return link;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
zathura_link_free(zathura_link_t* link)
|
|
||||||
{
|
|
||||||
if (link == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (link->type == ZATHURA_LINK_URI) {
|
|
||||||
if (link->target.value != NULL) {
|
|
||||||
g_free(link->target.value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free(link);
|
|
||||||
}
|
|
||||||
|
|
||||||
zathura_link_type_t
|
|
||||||
zathura_link_get_type(zathura_link_t* link)
|
|
||||||
{
|
|
||||||
if (link == NULL) {
|
|
||||||
return ZATHURA_LINK_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
return link->type;
|
|
||||||
}
|
|
||||||
|
|
||||||
zathura_rectangle_t
|
|
||||||
zathura_link_get_position(zathura_link_t* link)
|
|
||||||
{
|
|
||||||
if (link == NULL) {
|
|
||||||
zathura_rectangle_t position = { 0, 0, 0, 0 };
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
return link->position;
|
|
||||||
}
|
|
||||||
|
|
||||||
zathura_link_target_t
|
|
||||||
zathura_link_get_target(zathura_link_t* link)
|
|
||||||
{
|
|
||||||
if (link == NULL) {
|
|
||||||
zathura_link_target_t target = { 0 };
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
return link->target;
|
|
||||||
}
|
|
||||||
|
|
||||||
zathura_index_element_t*
|
zathura_index_element_t*
|
||||||
zathura_index_element_new(const char* title)
|
zathura_index_element_new(const char* title)
|
||||||
{
|
{
|
||||||
|
|
71
types.h
71
types.h
|
@ -3,6 +3,8 @@
|
||||||
#ifndef TYPES_H
|
#ifndef TYPES_H
|
||||||
#define TYPES_H
|
#define TYPES_H
|
||||||
|
|
||||||
|
#include <girara/datastructures.h>
|
||||||
|
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -130,17 +132,38 @@ typedef struct zathura_image_s
|
||||||
typedef enum zathura_link_type_e
|
typedef enum zathura_link_type_e
|
||||||
{
|
{
|
||||||
ZATHURA_LINK_INVALID, /**< Invalid type */
|
ZATHURA_LINK_INVALID, /**< Invalid type */
|
||||||
|
ZATHURA_LINK_NONE, /**< No action */
|
||||||
ZATHURA_LINK_GOTO_DEST, /**< Links to a page */
|
ZATHURA_LINK_GOTO_DEST, /**< Links to a page */
|
||||||
ZATHURA_LINK_GOTO_REMOTE, /**< Links to a page */
|
ZATHURA_LINK_GOTO_REMOTE, /**< Links to a page */
|
||||||
ZATHURA_LINK_URI, /**< Links to an external source */
|
ZATHURA_LINK_URI, /**< Links to an external source */
|
||||||
ZATHURA_LINK_LAUNCH, /**< Links to an external source */
|
ZATHURA_LINK_LAUNCH, /**< Links to an external source */
|
||||||
ZATHURA_LINK_NAMED, /**< Links to an external source */
|
ZATHURA_LINK_NAMED /**< Links to an external source */
|
||||||
} zathura_link_type_t;
|
} zathura_link_type_t;
|
||||||
|
|
||||||
typedef union zathura_link_target_u
|
typedef enum zathura_link_destionation_type_e
|
||||||
{
|
{
|
||||||
unsigned int page_number; /**< Page number */
|
ZATHURA_LINK_DESTINATION_UNKNOWN,
|
||||||
|
ZATHURA_LINK_DESTINATION_XYZ,
|
||||||
|
ZATHURA_LINK_DESTINATION_FIT,
|
||||||
|
ZATHURA_LINK_DESTINATION_FITH,
|
||||||
|
ZATHURA_LINK_DESTINATION_FITV,
|
||||||
|
ZATHURA_LINK_DESTINATION_FITR,
|
||||||
|
ZATHURA_LINK_DESTINATION_FITB,
|
||||||
|
ZATHURA_LINK_DESTINATION_FITBH,
|
||||||
|
ZATHURA_LINK_DESTINATION_FITBV,
|
||||||
|
ZATHURA_LINK_DESTINATION_NAMED
|
||||||
|
} zathura_link_destionation_type_t;
|
||||||
|
|
||||||
|
typedef struct zathura_link_target_s
|
||||||
|
{
|
||||||
|
zathura_link_destionation_type_t destination_type;
|
||||||
char* value; /**< Value */
|
char* value; /**< Value */
|
||||||
|
unsigned int page_number; /**< Page number */
|
||||||
|
double left; /**< Left coordinate */
|
||||||
|
double right; /**< Right coordinate */
|
||||||
|
double top; /**< Top coordinate */
|
||||||
|
double bottom; /**< Bottom coordinate */
|
||||||
|
double scale; /**< Scale */
|
||||||
} zathura_link_target_t;
|
} zathura_link_target_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -190,48 +213,6 @@ zathura_index_element_t* zathura_index_element_new(const char* title);
|
||||||
*/
|
*/
|
||||||
void zathura_index_element_free(zathura_index_element_t* index);
|
void zathura_index_element_free(zathura_index_element_t* index);
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new zathura link
|
|
||||||
*
|
|
||||||
* @param type Type of the link
|
|
||||||
* @param position Position of the link
|
|
||||||
* @param target Target
|
|
||||||
* @return New zathura link
|
|
||||||
*/
|
|
||||||
zathura_link_t* zathura_link_new(zathura_link_type_t type, zathura_rectangle_t position,
|
|
||||||
zathura_link_target_t target);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Free link
|
|
||||||
*
|
|
||||||
* @param link The link
|
|
||||||
*/
|
|
||||||
void zathura_link_free(zathura_link_t* link);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the type of the link
|
|
||||||
*
|
|
||||||
* @param link The link
|
|
||||||
* @return The target type of the link
|
|
||||||
*/
|
|
||||||
zathura_link_type_t zathura_link_get_type(zathura_link_t* link);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the position of the link
|
|
||||||
*
|
|
||||||
* @param link The link
|
|
||||||
* @return The position of the link
|
|
||||||
*/
|
|
||||||
zathura_rectangle_t zathura_link_get_position(zathura_link_t* link);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The target value of the link
|
|
||||||
*
|
|
||||||
* @param link The link
|
|
||||||
* @return Returns the target of the link (depends on the link type)
|
|
||||||
*/
|
|
||||||
zathura_link_target_t zathura_link_get_target(zathura_link_t* link);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a list that should be used to store \ref
|
* Creates a list that should be used to store \ref
|
||||||
* zathura_document_information_entry_t entries
|
* zathura_document_information_entry_t entries
|
||||||
|
|
80
utils.c
80
utils.c
|
@ -13,6 +13,7 @@
|
||||||
#include <girara/utils.h>
|
#include <girara/utils.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
|
#include "links.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "zathura.h"
|
#include "zathura.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
@ -327,85 +328,6 @@ readjust_view_after_zooming(zathura_t *zathura, float old_zoom) {
|
||||||
position_set_delayed(zathura, valx, valy);
|
position_set_delayed(zathura, valx, valy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
link_launch(zathura_t* zathura, zathura_link_t* link)
|
|
||||||
{
|
|
||||||
if (zathura == NULL || link == NULL || zathura->document == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get file path */
|
|
||||||
if (link->target.value == NULL) {
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
char* path = NULL;
|
|
||||||
if (g_path_is_absolute(link->target.value) == TRUE) {
|
|
||||||
path = g_strdup(link->target.value);
|
|
||||||
} else {
|
|
||||||
const char* document = zathura_document_get_path(zathura->document);
|
|
||||||
char* dir = g_path_get_dirname(document);
|
|
||||||
path = g_build_filename(dir, link->target.value, NULL);
|
|
||||||
g_free(dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (girara_xdg_open(path) == false) {
|
|
||||||
girara_notify(zathura->ui.session, GIRARA_ERROR, _("Failed to run xdg-open."));
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
zathura_link_evaluate(zathura_t* zathura, zathura_link_t* link)
|
|
||||||
{
|
|
||||||
if (zathura == NULL || link == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (link->type) {
|
|
||||||
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."));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ZATHURA_LINK_LAUNCH:
|
|
||||||
link_launch(zathura, link);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
document_draw_search_results(zathura_t* zathura, bool value)
|
document_draw_search_results(zathura_t* zathura, bool value)
|
||||||
{
|
{
|
||||||
|
|
19
utils.h
19
utils.h
|
@ -122,25 +122,6 @@ GtkWidget* zathura_page_get_widget(zathura_t* zathura, zathura_page_t* page);
|
||||||
*/
|
*/
|
||||||
void readjust_view_after_zooming(zathura_t* zathura, float old_zoom);
|
void readjust_view_after_zooming(zathura_t* zathura, float old_zoom);
|
||||||
|
|
||||||
/**
|
|
||||||
* Evaluate link
|
|
||||||
*
|
|
||||||
* @param zathura Zathura instance
|
|
||||||
* @param link The link
|
|
||||||
*/
|
|
||||||
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);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set if the search results should be drawn or not
|
* Set if the search results should be drawn or not
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue