diff --git a/bookmarks.c b/bookmarks.c new file mode 100644 index 0000000..40e5a1f --- /dev/null +++ b/bookmarks.c @@ -0,0 +1,66 @@ +/* See LICENSE file for license and copyright information */ + +#include +#include "bookmarks.h" + +zathura_bookmark_t* +zathura_bookmark_add(zathura_t* zathura, const gchar* id, unsigned int page) +{ + g_return_val_if_fail(zathura && zathura->bookmarks.bookmarks, NULL); + g_return_val_if_fail(id, NULL); + + GIRARA_LIST_FOREACH(zathura->bookmarks.bookmarks, zathura_bookmark_t*, iter, bookmark) + if (strcmp(bookmark->id, id) == 0) + { + girara_list_iterator_free(iter); + return NULL; + } + GIRARA_LIST_FOREACH_END(zathura->bookmarks.bookmarks, zathura_bookmark_t*, iter, bookmark) + + zathura_bookmark_t* bookmark = g_malloc0(sizeof(zathura_bookmark_t)); + bookmark->id = g_strdup(id); + bookmark->page = page; + girara_list_append(zathura->bookmarks.bookmarks, bookmark); + + return bookmark; +} + +void zathura_bookmark_remove(zathura_t* zathura, const gchar* id) +{ + g_return_if_fail(zathura && zathura->bookmarks.bookmarks); + g_return_if_fail(id); + + zathura_bookmark_t* bookmark = zathura_bookmark_get(zathura, id); + if (bookmark) + { + girara_list_remove(zathura->bookmarks.bookmarks, bookmark); + } +} + +zathura_bookmark_t* zathura_bookmark_get(zathura_t* zathura, const gchar* id) +{ + g_return_val_if_fail(zathura && zathura->bookmarks.bookmarks, NULL); + g_return_val_if_fail(id, NULL); + + GIRARA_LIST_FOREACH(zathura->bookmarks.bookmarks, zathura_bookmark_t*, iter, bookmark) + if (strcmp(bookmark->id, id) == 0) + { + girara_list_iterator_free(iter); + return bookmark; + } + GIRARA_LIST_FOREACH_END(zathura->bookmarks.bookmarks, zathura_bookmark_t*, iter, bookmark) + + return NULL; +} + +void zathura_bookmark_free(zathura_bookmark_t* bookmark) +{ + if (!bookmark) + { + return; + } + + g_free(bookmark->id); + g_free(bookmark); +} + diff --git a/bookmarks.h b/bookmarks.h new file mode 100644 index 0000000..22b8e86 --- /dev/null +++ b/bookmarks.h @@ -0,0 +1,29 @@ +/* See LICENSE file for license and copyright information */ + +#ifndef BOOKMARKS_H +#define BOOKMARKS_H + +#include +#include "zathura.h" + +struct zathura_bookmark_s +{ + gchar* id; + unsigned int page; +}; + +typedef struct zathura_bookmark_s zathura_bookmark_t; + +zathura_bookmark_t* zathura_bookmark_add(zathura_t* zathura, const gchar* id, unsigned int page); + +void zathura_bookmark_remove(zathura_t* zathura, const gchar* id); + +zathura_bookmark_t* zathura_bookmark_get(zathura_t* zathura, const gchar* id); + +void zathura_bookmark_free(zathura_bookmark_t* bookmark); + +bool zathura_bookmarks_load(zathura_t* zathura, const gchar* file); + +bool zathura_bookmarks_save(zathura_t* zathura, const gchar* file); + +#endif // BOOKMARKS_H diff --git a/zathura.c b/zathura.c index 67534de..dabbdff 100644 --- a/zathura.c +++ b/zathura.c @@ -4,6 +4,7 @@ #include +#include "bookmarks.h" #include "callbacks.h" #include "config.h" #include "document.h" @@ -189,6 +190,10 @@ zathura_init(int argc, char* argv[]) free(string_value); } + /* bookmarks */ + zathura->bookmarks.bookmarks = girara_list_new(); + girara_list_set_free_function(zathura->bookmarks.bookmarks, (girara_free_function_t) zathura_bookmark_free); + /* open document if passed */ if (argc > 1) { zathura_document_info_t* document_info = malloc(sizeof(zathura_document_info_t)); @@ -231,6 +236,9 @@ zathura_free(zathura_t* zathura) document_close(zathura); + /* bookmarks */ + girara_list_free(zathura->bookmarks.bookmarks); + /* free print settings */ g_object_unref(zathura->print.settings); g_object_unref(zathura->print.page_setup); diff --git a/zathura.h b/zathura.h index 622a5a3..f654fb0 100644 --- a/zathura.h +++ b/zathura.h @@ -84,6 +84,12 @@ typedef struct zathura_s girara_mode_t insert; /**> Insert mode */ } modes; + struct + { + gchar* file; /**> bookmarks file */ + girara_list_t* bookmarks; /**> bookmarks */ + } bookmarks; + zathura_document_t* document; /**> The current document */ } zathura_t;