mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2025-01-01 07:06:00 +01:00
update document.c/.h
This commit is contained in:
parent
daa523aaf5
commit
f57fe5dfde
6 changed files with 85 additions and 65 deletions
2
config.h
2
config.h
|
@ -7,6 +7,8 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function loads the default values of the configuration
|
* This function loads the default values of the configuration
|
||||||
|
*
|
||||||
|
* @param zathura the zathura session
|
||||||
*/
|
*/
|
||||||
void config_load_default(zathura_t* zathura);
|
void config_load_default(zathura_t* zathura);
|
||||||
|
|
||||||
|
|
86
document.c
86
document.c
|
@ -18,10 +18,8 @@
|
||||||
|
|
||||||
#define LENGTH(x) (sizeof(x)/sizeof((x)[0]))
|
#define LENGTH(x) (sizeof(x)/sizeof((x)[0]))
|
||||||
|
|
||||||
zathura_document_plugin_t* zathura_document_plugins = NULL;
|
|
||||||
|
|
||||||
void
|
void
|
||||||
zathura_document_plugins_load(void)
|
zathura_document_plugins_load(zathura_t* zathura)
|
||||||
{
|
{
|
||||||
/* read all files in the plugin directory */
|
/* read all files in the plugin directory */
|
||||||
DIR* dir = opendir(PLUGIN_DIR);
|
DIR* dir = opendir(PLUGIN_DIR);
|
||||||
|
@ -76,7 +74,7 @@ zathura_document_plugins_load(void)
|
||||||
|
|
||||||
register_plugin(plugin);
|
register_plugin(plugin);
|
||||||
|
|
||||||
bool r = zathura_document_plugin_register(plugin, handle);
|
bool r = zathura_document_plugin_register(zathura, plugin, handle);
|
||||||
|
|
||||||
if (r == false) {
|
if (r == false) {
|
||||||
fprintf(stderr, "error: could not register plugin (%s)\n", path);
|
fprintf(stderr, "error: could not register plugin (%s)\n", path);
|
||||||
|
@ -107,60 +105,54 @@ error_continue:
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
zathura_document_plugins_free(void)
|
zathura_document_plugins_free(zathura_t* zathura)
|
||||||
{
|
{
|
||||||
/* free registered plugins */
|
if (zathura == NULL) {
|
||||||
zathura_document_plugin_t* plugin = zathura_document_plugins;
|
return;
|
||||||
while (plugin) {
|
|
||||||
zathura_document_plugin_t* tmp = plugin->next;
|
|
||||||
free(plugin->file_extension);
|
|
||||||
free(plugin);
|
|
||||||
plugin = tmp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
zathura_document_plugins = NULL;
|
girara_list_iterator_t* iter = girara_list_iterator(zathura->plugins.plugins);
|
||||||
|
if (iter == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
zathura_document_plugin_t* plugin = (zathura_document_plugin_t*) girara_list_iterator_data(iter);
|
||||||
|
free(plugin->file_extension);
|
||||||
|
free(plugin);
|
||||||
|
} while (girara_list_iterator_next(iter));
|
||||||
|
girara_list_iterator_free(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
zathura_document_plugin_register(zathura_document_plugin_t* new_plugin, void* handle)
|
zathura_document_plugin_register(zathura_t* zathura, zathura_document_plugin_t* new_plugin, void* handle)
|
||||||
{
|
{
|
||||||
if( (new_plugin == NULL) || (new_plugin->file_extension == NULL) || (new_plugin->open_function == NULL)
|
if( (new_plugin == NULL) || (new_plugin->file_extension == NULL) || (new_plugin->open_function == NULL)
|
||||||
|| (handle == NULL) ) {
|
|| (handle == NULL) ) {
|
||||||
fprintf(stderr, "plugin: could not register\n");
|
girara_error("plugin: could not register\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* search existing plugins */
|
/* search existing plugins */
|
||||||
zathura_document_plugin_t* plugin = zathura_document_plugins;
|
girara_list_iterator_t* iter = girara_list_iterator(zathura->plugins.plugins);
|
||||||
while (plugin) {
|
if (iter) {
|
||||||
|
do {
|
||||||
|
zathura_document_plugin_t* plugin = (zathura_document_plugin_t*) girara_list_iterator_data(iter);
|
||||||
if (!strcmp(plugin->file_extension, new_plugin->file_extension)) {
|
if (!strcmp(plugin->file_extension, new_plugin->file_extension)) {
|
||||||
fprintf(stderr, "plugin: already registered for filetype %s\n", plugin->file_extension);
|
girara_error("plugin: already registered for filetype %s\n", plugin->file_extension);
|
||||||
|
girara_list_iterator_free(iter);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} while (girara_list_iterator_next(iter));
|
||||||
if (plugin->next == NULL) {
|
girara_list_iterator_free(iter);
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
plugin = plugin->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create new plugin */
|
|
||||||
new_plugin->handle = handle;
|
|
||||||
new_plugin->next = NULL;
|
|
||||||
|
|
||||||
/* append to list */
|
|
||||||
if (plugin == NULL) {
|
|
||||||
zathura_document_plugins = new_plugin;
|
|
||||||
} else {
|
|
||||||
plugin->next = new_plugin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
girara_list_append(zathura->plugins.plugins, new_plugin);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
zathura_document_t*
|
zathura_document_t*
|
||||||
zathura_document_open(const char* path, const char* password)
|
zathura_document_open(zathura_t* zathura, const char* path, const char* password)
|
||||||
{
|
{
|
||||||
if (!path) {
|
if (!path) {
|
||||||
goto error_out;
|
goto error_out;
|
||||||
|
@ -224,14 +216,19 @@ zathura_document_open(const char* path, const char* password)
|
||||||
document->functions.page_form_fields_get = NULL;
|
document->functions.page_form_fields_get = NULL;
|
||||||
document->functions.page_render = NULL;
|
document->functions.page_render = NULL;
|
||||||
|
|
||||||
/* init plugin with associated file type */
|
girara_list_iterator_t* iter = girara_list_iterator(zathura->plugins.plugins);
|
||||||
zathura_document_plugin_t* plugin = zathura_document_plugins;
|
if (iter == NULL) {
|
||||||
while (plugin) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
zathura_document_plugin_t* plugin = (zathura_document_plugin_t*) girara_list_iterator_data(iter);
|
||||||
if (!strcmp(file_extension, plugin->file_extension)) {
|
if (!strcmp(file_extension, plugin->file_extension)) {
|
||||||
|
girara_list_iterator_free(iter);
|
||||||
if (plugin->open_function) {
|
if (plugin->open_function) {
|
||||||
if (plugin->open_function(document)) {
|
if (plugin->open_function(document)) {
|
||||||
/* update statusbar */
|
/* update statusbar */
|
||||||
girara_statusbar_item_set_text(Zathura.UI.session, Zathura.UI.statusbar.file, real_path);
|
girara_statusbar_item_set_text(zathura->ui.session, zathura->ui.statusbar.file, real_path);
|
||||||
|
|
||||||
/* read all pages */
|
/* read all pages */
|
||||||
document->pages = calloc(document->number_of_pages, sizeof(zathura_page_t*));
|
document->pages = calloc(document->number_of_pages, sizeof(zathura_page_t*));
|
||||||
|
@ -250,16 +247,15 @@ zathura_document_open(const char* path, const char* password)
|
||||||
|
|
||||||
return document;
|
return document;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "error: could not open file\n");
|
girara_error("could not open file\n");
|
||||||
goto error_free;
|
goto error_free;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} while (girara_list_iterator_next(iter));
|
||||||
|
girara_list_iterator_free(iter);
|
||||||
|
|
||||||
plugin = plugin->next;
|
girara_error("unknown file type\n");
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr, "error: unknown file type\n");
|
|
||||||
|
|
||||||
error_free:
|
error_free:
|
||||||
|
|
||||||
|
|
20
document.h
20
document.h
|
@ -7,12 +7,13 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <girara-datastructures.h>
|
#include <girara-datastructures.h>
|
||||||
|
#include "zathura.h"
|
||||||
|
|
||||||
#define PLUGIN_DIR "/usr/lib/zathura"
|
#define PLUGIN_DIR "/usr/lib/zathura"
|
||||||
#define PLUGIN_REGISTER_FUNCTION "plugin_register"
|
#define PLUGIN_REGISTER_FUNCTION "plugin_register"
|
||||||
|
|
||||||
typedef struct zathura_list_s zathura_list_t;
|
typedef struct zathura_list_s zathura_list_t;
|
||||||
typedef struct zathura_document_s zathura_document_t;
|
// typedef struct zathura_document_s zathura_document_t;
|
||||||
|
|
||||||
typedef bool (*zathura_document_open_t)(zathura_document_t* document);
|
typedef bool (*zathura_document_open_t)(zathura_document_t* document);
|
||||||
|
|
||||||
|
@ -24,7 +25,6 @@ typedef struct zathura_document_plugin_s
|
||||||
char* file_extension; /**> File extension */
|
char* file_extension; /**> File extension */
|
||||||
zathura_document_open_t open_function; /**> Document open function */
|
zathura_document_open_t open_function; /**> Document open function */
|
||||||
void* handle; /**> DLL handle */
|
void* handle; /**> DLL handle */
|
||||||
struct zathura_document_plugin_s *next; /**> Next plugin */ // TODO: Use list_t
|
|
||||||
} zathura_document_plugin_t;
|
} zathura_document_plugin_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -139,7 +139,7 @@ typedef struct zathura_form_s
|
||||||
/**
|
/**
|
||||||
* Page
|
* Page
|
||||||
*/
|
*/
|
||||||
typedef struct zathura_page_s
|
struct zathura_page_s
|
||||||
{
|
{
|
||||||
double height; /**> Page height */
|
double height; /**> Page height */
|
||||||
double width; /**> Page width */
|
double width; /**> Page width */
|
||||||
|
@ -150,7 +150,7 @@ typedef struct zathura_page_s
|
||||||
GtkWidget* event_box; /**> Widget wrapper for mouse events */
|
GtkWidget* event_box; /**> Widget wrapper for mouse events */
|
||||||
GtkWidget* drawing_area; /**> Drawing area */
|
GtkWidget* drawing_area; /**> Drawing area */
|
||||||
GStaticMutex lock; /**> Lock */
|
GStaticMutex lock; /**> Lock */
|
||||||
} zathura_page_t;
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Document
|
* Document
|
||||||
|
@ -226,18 +226,22 @@ struct zathura_document_s
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load all document plugins
|
* Load all document plugins
|
||||||
|
*
|
||||||
|
* @param zathura the zathura session
|
||||||
*/
|
*/
|
||||||
void zathura_document_plugins_load(void);
|
void zathura_document_plugins_load(zathura_t* zathura);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free all document plugins
|
* Free all document plugins
|
||||||
|
*
|
||||||
|
* @param zathura the zathura session
|
||||||
*/
|
*/
|
||||||
void zathura_document_plugins_free(void);
|
void zathura_document_plugins_free(zathura_t* zathura);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register document plugin
|
* Register document plugin
|
||||||
*/
|
*/
|
||||||
bool zathura_document_plugin_register(zathura_document_plugin_t* new_plugin, void* handle);
|
bool zathura_document_plugin_register(zathura_t* zathura, zathura_document_plugin_t* new_plugin, void* handle);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open the document
|
* Open the document
|
||||||
|
@ -246,7 +250,7 @@ bool zathura_document_plugin_register(zathura_document_plugin_t* new_plugin, voi
|
||||||
* @param password Password of the document or NULL
|
* @param password Password of the document or NULL
|
||||||
* @return The document object
|
* @return The document object
|
||||||
*/
|
*/
|
||||||
zathura_document_t* zathura_document_open(const char* path, const char* password);
|
zathura_document_t* zathura_document_open(zathura_t* zathura, const char* path, const char* password);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free the document
|
* Free the document
|
||||||
|
|
6
render.h
6
render.h
|
@ -7,16 +7,16 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <girara-datastructures.h>
|
#include <girara-datastructures.h>
|
||||||
|
|
||||||
#include "document.h"
|
#include "zathura.h"
|
||||||
#include "callbacks.h"
|
#include "callbacks.h"
|
||||||
|
|
||||||
typedef struct render_thread_s
|
struct render_thread_s
|
||||||
{
|
{
|
||||||
girara_list_t* list; /**> The list of pages */
|
girara_list_t* list; /**> The list of pages */
|
||||||
GThread* thread; /**> The thread object */
|
GThread* thread; /**> The thread object */
|
||||||
GMutex* lock; /**> Lock */
|
GMutex* lock; /**> Lock */
|
||||||
GCond* cond; /**> Condition */
|
GCond* cond; /**> Condition */
|
||||||
} render_thread_t;
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function initializes a render thread
|
* This function initializes a render thread
|
||||||
|
|
11
zathura.c
11
zathura.c
|
@ -10,6 +10,7 @@
|
||||||
#include "shortcuts.h"
|
#include "shortcuts.h"
|
||||||
#include "zathura.h"
|
#include "zathura.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "render.h"
|
||||||
|
|
||||||
/* function implementation */
|
/* function implementation */
|
||||||
zathura_t*
|
zathura_t*
|
||||||
|
@ -21,6 +22,10 @@ zathura_init(int argc, char* argv[])
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* plugins */
|
||||||
|
zathura->plugins.plugins = girara_list_new();
|
||||||
|
zathura->plugins.path = NULL;
|
||||||
|
|
||||||
/* UI */
|
/* UI */
|
||||||
if ((zathura->ui.session = girara_session_create()) == NULL) {
|
if ((zathura->ui.session = girara_session_create()) == NULL) {
|
||||||
goto error_out;
|
goto error_out;
|
||||||
|
@ -74,7 +79,7 @@ zathura_init(int argc, char* argv[])
|
||||||
zathura->ui.session->events.buffer_changed = buffer_changed;
|
zathura->ui.session->events.buffer_changed = buffer_changed;
|
||||||
|
|
||||||
/* load plugins */
|
/* load plugins */
|
||||||
zathura_document_plugins_load();
|
zathura_document_plugins_load(zathura);
|
||||||
|
|
||||||
/* configuration */
|
/* configuration */
|
||||||
config_load_default(zathura);
|
config_load_default(zathura);
|
||||||
|
@ -108,7 +113,7 @@ zathura_free(zathura_t* zathura)
|
||||||
document_close(zathura);
|
document_close(zathura);
|
||||||
|
|
||||||
/* free registered plugins */
|
/* free registered plugins */
|
||||||
zathura_document_plugins_free();
|
zathura_document_plugins_free(zathura);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -118,7 +123,7 @@ document_open(zathura_t* zathura, const char* path, const char* password)
|
||||||
goto error_out;
|
goto error_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
zathura_document_t* document = zathura_document_open(path, password);
|
zathura_document_t* document = zathura_document_open(zathura, path, password);
|
||||||
|
|
||||||
if (!document) {
|
if (!document) {
|
||||||
goto error_out;
|
goto error_out;
|
||||||
|
|
19
zathura.h
19
zathura.h
|
@ -6,9 +6,6 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <girara.h>
|
#include <girara.h>
|
||||||
|
|
||||||
#include "render.h"
|
|
||||||
#include "document.h"
|
|
||||||
|
|
||||||
enum { NEXT, PREVIOUS, LEFT, RIGHT, UP, DOWN, BOTTOM, TOP, HIDE, HIGHLIGHT,
|
enum { NEXT, PREVIOUS, LEFT, RIGHT, UP, DOWN, BOTTOM, TOP, HIDE, HIGHLIGHT,
|
||||||
DELETE_LAST_WORD, DELETE_LAST_CHAR, DEFAULT, ERROR, WARNING, NEXT_GROUP,
|
DELETE_LAST_WORD, DELETE_LAST_CHAR, DEFAULT, ERROR, WARNING, NEXT_GROUP,
|
||||||
PREVIOUS_GROUP, ZOOM_IN, ZOOM_OUT, ZOOM_ORIGINAL, ZOOM_SPECIFIC, FORWARD,
|
PREVIOUS_GROUP, ZOOM_IN, ZOOM_OUT, ZOOM_ORIGINAL, ZOOM_SPECIFIC, FORWARD,
|
||||||
|
@ -24,6 +21,16 @@ enum { NEXT, PREVIOUS, LEFT, RIGHT, UP, DOWN, BOTTOM, TOP, HIDE, HIGHLIGHT,
|
||||||
#define NORMAL (1 << 3)
|
#define NORMAL (1 << 3)
|
||||||
#define INSERT (1 << 4)
|
#define INSERT (1 << 4)
|
||||||
|
|
||||||
|
/* forward declaration for types from document.h */
|
||||||
|
struct zathura_document_s;
|
||||||
|
struct zathura_page_s;
|
||||||
|
typedef struct zathura_document_s zathura_document_t;
|
||||||
|
typedef struct zathura_page_s zathura_page_t;
|
||||||
|
|
||||||
|
/* forward declaration for types from render.h */
|
||||||
|
struct render_thread_s;
|
||||||
|
typedef struct render_thread_s render_thread_t;
|
||||||
|
|
||||||
typedef struct zathura_s
|
typedef struct zathura_s
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
|
@ -46,6 +53,12 @@ typedef struct zathura_s
|
||||||
render_thread_t* render_thread; /**> The thread responsible for rendering the pages */
|
render_thread_t* render_thread; /**> The thread responsible for rendering the pages */
|
||||||
} sync;
|
} sync;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
girara_list_t* plugins;
|
||||||
|
girara_list_t* path;
|
||||||
|
} plugins;
|
||||||
|
|
||||||
zathura_document_t* document; /**> The current document */
|
zathura_document_t* document; /**> The current document */
|
||||||
} zathura_t;
|
} zathura_t;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue