From adc9f412648e16ec19f940eab78a3eb8f2c64210 Mon Sep 17 00:00:00 2001 From: Moritz Lipp Date: Sun, 22 Apr 2012 10:04:46 +0200 Subject: [PATCH] Introduce new link types --- callbacks.c | 22 +++------------------- database-plain.c | 4 ++-- database-sqlite.c | 16 ++++++++-------- database.c | 2 +- page-widget.c | 11 +---------- types.c | 20 ++++++++------------ types.h | 16 +++++++--------- utils.c | 31 ++++++++++++++++++++++++++++--- utils.h | 8 ++++++++ zathura.c | 6 +++--- 10 files changed, 69 insertions(+), 67 deletions(-) diff --git a/callbacks.c b/callbacks.c index 136133c..851af54 100644 --- a/callbacks.c +++ b/callbacks.c @@ -148,14 +148,8 @@ cb_index_row_activated(GtkTreeView* tree_view, GtkTreePath* path, return; } - if (index_element->type == ZATHURA_LINK_TO_PAGE) { - sc_toggle_index(zathura->ui.session, NULL, NULL, 0); - page_set_delayed(zathura, index_element->target.page_number); - } else if (index_element->type == ZATHURA_LINK_EXTERNAL) { - if (girara_xdg_open(index_element->target.uri) == false) { - girara_notify(zathura->ui.session, GIRARA_ERROR, _("Failed to run xdg-open.")); - } - } + zathura_link_evaluate(zathura, index_element->link); + sc_toggle_index(zathura->ui.session, NULL, NULL, 0); } g_object_unref(model); @@ -200,17 +194,7 @@ cb_sc_follow(GtkEntry* entry, girara_session_t* session) if (eval == true) { zathura_link_t* link = zathura_page_widget_link_get(ZATHURA_PAGE(page_widget), index); if (link != NULL) { - switch (link->type) { - case ZATHURA_LINK_TO_PAGE: - page_set_delayed(zathura, link->target.page_number); - break; - case ZATHURA_LINK_EXTERNAL: - girara_xdg_open(link->target.uri); - break; - default: - break; - } - + zathura_link_evaluate(zathura, link); invalid_index = false; } } diff --git a/database-plain.c b/database-plain.c index 142306d..326c44d 100644 --- a/database-plain.c +++ b/database-plain.c @@ -385,14 +385,14 @@ plain_set_fileinfo(zathura_database_t* db, const char* file, zathura_fileinfo_t* char* tmp = g_strdup_printf("%f", file_info->scale); g_key_file_set_string (priv->history, name, KEY_SCALE, tmp); - g_free(tmp); + g_free(tmp); g_key_file_set_integer(priv->history, name, KEY_ROTATE, file_info->rotation); g_key_file_set_integer(priv->history, name, KEY_PAGES_PER_ROW, file_info->pages_per_row); tmp = g_strdup_printf("%f", file_info->position_x); g_key_file_set_string(priv->history, name, KEY_POSITION_X, tmp); - g_free(tmp); + g_free(tmp); tmp = g_strdup_printf("%f", file_info->position_y); g_key_file_set_string(priv->history, name, KEY_POSITION_Y, tmp); diff --git a/database-sqlite.c b/database-sqlite.c index b70927f..6d3d871 100644 --- a/database-sqlite.c +++ b/database-sqlite.c @@ -22,7 +22,7 @@ static girara_list_t* sqlite_load_bookmarks(zathura_database_t* db, static bool sqlite_set_fileinfo(zathura_database_t* db, const char* file, zathura_fileinfo_t* file_info); static bool sqlite_get_fileinfo(zathura_database_t* db, const char* file, - zathura_fileinfo_t* file_info); + zathura_fileinfo_t* file_info); static void sqlite_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec); @@ -280,8 +280,8 @@ sqlite_set_fileinfo(zathura_database_t* db, const char* file, zathura_fileinfo_t* file_info) { if (db == NULL || file == NULL || file_info == NULL) { - return false; - } + return false; + } zathura_sqldatabase_private_t* priv = ZATHURA_SQLDATABASE_GET_PRIVATE(db); @@ -314,11 +314,11 @@ sqlite_set_fileinfo(zathura_database_t* db, const char* file, static bool sqlite_get_fileinfo(zathura_database_t* db, const char* file, - zathura_fileinfo_t* file_info) + zathura_fileinfo_t* file_info) { - if (db == NULL || file == NULL || file_info == NULL) { - return false; - } + if (db == NULL || file == NULL || file_info == NULL) { + return false; + } zathura_sqldatabase_private_t* priv = ZATHURA_SQLDATABASE_GET_PRIVATE(db); @@ -327,7 +327,7 @@ sqlite_get_fileinfo(zathura_database_t* db, const char* file, sqlite3_stmt* stmt = prepare_statement(priv->session, SQL_FILEINFO_GET); if (stmt == NULL) { - return false; + return false; } if (sqlite3_bind_text(stmt, 1, file, -1, NULL) != SQLITE_OK) { diff --git a/database.c b/database.c index 00712be..5d481e7 100644 --- a/database.c +++ b/database.c @@ -56,7 +56,7 @@ zathura_db_set_fileinfo(zathura_database_t* db, const char* file, bool zathura_db_get_fileinfo(zathura_database_t* db, const char* file, - zathura_fileinfo_t* file_info) + zathura_fileinfo_t* file_info) { g_return_val_if_fail(ZATHURA_IS_DATABASE(db) && file != NULL && file_info != NULL, false); diff --git a/page-widget.c b/page-widget.c index 940443b..0d00db6 100644 --- a/page-widget.c +++ b/page-widget.c @@ -549,16 +549,7 @@ cb_zathura_page_widget_button_release_event(GtkWidget* widget, GdkEventButton* b zathura_rectangle_t rect = recalc_rectangle(priv->page, link->position); if (rect.x1 <= button->x && rect.x2 >= button->x && rect.y1 <= button->y && rect.y2 >= button->y) { - switch (link->type) { - case ZATHURA_LINK_TO_PAGE: - page_set_delayed(priv->zathura, link->target.page_number); - return false; - case ZATHURA_LINK_EXTERNAL: - girara_xdg_open(link->target.uri); - return false; - default: - return false; - } + zathura_link_evaluate(priv->zathura, link); } GIRARA_LIST_FOREACH_END(priv->links, zathura_link_t*, iter, link); } diff --git a/types.c b/types.c index de73c19..c72e46a 100644 --- a/types.c +++ b/types.c @@ -17,16 +17,16 @@ zathura_link_new(zathura_link_type_t type, zathura_rectangle_t position, link->position = position; switch (type) { - case ZATHURA_LINK_TO_PAGE: + case ZATHURA_LINK_GOTO_DEST: link->target.page_number = target.page_number; break; - case ZATHURA_LINK_EXTERNAL: - if (target.uri == NULL) { + case ZATHURA_LINK_URI: + if (target.value == NULL) { g_free(link); return NULL; } - link->target.uri = g_strdup(target.uri); + link->target.value = g_strdup(target.value); break; default: g_free(link); @@ -43,9 +43,9 @@ zathura_link_free(zathura_link_t* link) return; } - if (link->type == ZATHURA_LINK_EXTERNAL) { - if (link->target.uri != NULL) { - g_free(link->target.uri); + if (link->type == ZATHURA_LINK_URI) { + if (link->target.value != NULL) { + g_free(link->target.value); } } @@ -106,11 +106,7 @@ zathura_index_element_free(zathura_index_element_t* index) } g_free(index->title); - - if (index->type == ZATHURA_LINK_EXTERNAL) { - g_free(index->target.uri); - } - + zathura_link_free(index->link); g_free(index); } diff --git a/types.h b/types.h index 06af6ea..594497d 100644 --- a/types.h +++ b/types.h @@ -130,14 +130,17 @@ typedef struct zathura_image_s typedef enum zathura_link_type_e { ZATHURA_LINK_INVALID, /**< Invalid type */ - ZATHURA_LINK_TO_PAGE, /**< Links to a page */ - ZATHURA_LINK_EXTERNAL, /**< Links to an external source */ + ZATHURA_LINK_GOTO_DEST, /**< Links to a page */ + ZATHURA_LINK_GOTO_REMOTE, /**< Links to a page */ + ZATHURA_LINK_URI, /**< Links to an external source */ + ZATHURA_LINK_LAUNCH, /**< Links to an external source */ + ZATHURA_LINK_NAMED, /**< Links to an external source */ } zathura_link_type_t; typedef union zathura_link_target_u { unsigned int page_number; /**< Page number */ - char* uri; /**< Value */ + char* value; /**< Value */ } zathura_link_target_t; /** @@ -151,12 +154,7 @@ typedef struct zathura_link_s zathura_link_t; typedef struct zathura_index_element_s { char* title; /**< Title of the element */ - zathura_link_type_t type; /**< Type */ - union - { - unsigned int page_number; /**< Page number */ - char* uri; /**< Uri */ - } target; + zathura_link_t* link; } zathura_index_element_t; /** diff --git a/utils.c b/utils.c index 95c512d..285bb08 100644 --- a/utils.c +++ b/utils.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include "utils.h" #include "zathura.h" @@ -148,11 +150,14 @@ document_index_build(GtkTreeModel* model, GtkTreeIter* parent, GIRARA_LIST_FOREACH(list, girara_tree_node_t*, iter, node) zathura_index_element_t* index_element = (zathura_index_element_t*)girara_node_get_data(node); + zathura_link_type_t type = zathura_link_get_type(index_element->link); + zathura_link_target_t target = zathura_link_get_target(index_element->link); + gchar* description = NULL; - if (index_element->type == ZATHURA_LINK_TO_PAGE) { - description = g_strdup_printf("Page %d", index_element->target.page_number); + if (type == ZATHURA_LINK_GOTO_DEST) { + description = g_strdup_printf("Page %d", target.page_number); } else { - description = g_strdup(index_element->target.uri); + description = g_strdup(target.value); } GtkTreeIter tree_iter; @@ -322,3 +327,23 @@ readjust_view_after_zooming(zathura_t *zathura, float old_zoom) { set_adjustment(vadjustment, valy); } +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_URI: + if (girara_xdg_open(link->target.value) == false) { + girara_notify(zathura->ui.session, GIRARA_ERROR, _("Failed to run xdg-open.")); + } + break; + default: + break; + } +} diff --git a/utils.h b/utils.h index f38233f..75324ba 100644 --- a/utils.h +++ b/utils.h @@ -122,4 +122,12 @@ GtkWidget* zathura_page_get_widget(zathura_t* zathura, zathura_page_t* page); */ 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); + #endif // UTILS_H diff --git a/zathura.c b/zathura.c index 27e6548..f444617 100644 --- a/zathura.c +++ b/zathura.c @@ -480,10 +480,10 @@ document_open(zathura_t* zathura, const char* path, const char* password) unsigned int number_of_pages = zathura_document_get_number_of_pages(document); /* read history file */ - zathura_fileinfo_t file_info = { 0, 0, 1, 0, 1, 0, 0 }; + zathura_fileinfo_t file_info = { 0, 0, 1, 0, 1, 0, 0 }; zathura_db_get_fileinfo(zathura->database, file_path, &file_info); - /* set page offset */ + /* set page offset */ zathura_document_set_page_offset(document, file_info.page_offset); /* check for valid scale value */ @@ -733,7 +733,7 @@ document_close(zathura_t* zathura, bool keep_monitor) /* store file information */ const char* path = zathura_document_get_path(zathura->document); - zathura_fileinfo_t file_info = { 0 }; + zathura_fileinfo_t file_info = { 0 }; file_info.current_page = zathura_document_get_current_page_number(zathura->document); file_info.page_offset = zathura_document_get_page_offset(zathura->document); file_info.scale = zathura_document_get_scale(zathura->document);