diff --git a/.gitignore b/.gitignore index 4fdda19..c038363 100644 --- a/.gitignore +++ b/.gitignore @@ -13,9 +13,14 @@ zathura.pc gcov/ *.swp version.h -doc/ +./doc/_build *.tmp zathura.1 zathurarc.5 .version-checks/ dbus-interface-definitions.c +css-definitions.c +.ycm_extra_conf.py +.ropeproject +compile_commands.json +zathura-*.tar.gz diff --git a/AUTHORS b/AUTHORS index 81d1071..9238785 100644 --- a/AUTHORS +++ b/AUTHORS @@ -23,4 +23,5 @@ Rob Cornish Marwan Tanager Diego Joss Ignas Anikevicius +Kamil Smardzewski oblique diff --git a/Makefile b/Makefile index 9f3c0ba..5748442 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ # See LICENSE file for license and copyright information include config.mk +include colors.mk include common.mk -PROJECT = zathura -OSOURCE = $(filter-out dbus-interface-definitions.c, $(wildcard *.c)) -HEADER = $(wildcard *.h) +OSOURCE = $(filter-out css-definitions.c, $(filter-out dbus-interface-definitions.c, $(wildcard *.c))) $(wildcard synctex/*.c) +HEADER = $(wildcard *.h) $(wildcard synctex/*.h) HEADERINST = version.h document.h macros.h page.h types.h plugin-api.h links.h ifneq (${WITH_SQLITE},0) @@ -36,8 +36,15 @@ endif ifeq (,$(findstring -DLOCALEDIR,${CPPFLAGS})) CPPFLAGS += -DLOCALEDIR=\"${LOCALEDIR}\" endif +ifeq (,$(findstring -Isynctex,${CPPFLAGS})) +CPPFLAGS += -Isynctex +endif +ifeq (,$(findstring -DSYNCTEX_VERBOSE=0,${CPPFLAGS})) +CPPFLAGS += -DSYNCTEX_VERBOSE=0 +endif -OBJECTS = $(patsubst %.c, %.o, $(SOURCE)) dbus-interface-definitions.o + +OBJECTS = $(patsubst %.c, %.o, $(SOURCE)) dbus-interface-definitions.o css-definitions.o DOBJECTS = $(patsubst %.o, %.do, $(OBJECTS)) all: options ${PROJECT} po build-manpages @@ -68,19 +75,26 @@ version.h: version.h.in config.mk $(QUIET)mv version.h.tmp version.h dbus-interface-definitions.c: data/org.pwmt.zathura.xml - $(QUIET)echo '#include "dbus-interface-definitions.h"' > dbus-interface-definitions.c.tmp - $(QUIET)echo 'const char* DBUS_INTERFACE_XML =' >> dbus-interface-definitions.c.tmp - $(QUIET)sed 's/^\(.*\)$$/"\1\\n"/' data/org.pwmt.zathura.xml >> dbus-interface-definitions.c.tmp - $(QUIET)echo ';' >> dbus-interface-definitions.c.tmp - $(QUIET)mv dbus-interface-definitions.c.tmp dbus-interface-definitions.c + $(QUIET)echo '#include "dbus-interface-definitions.h"' > $@.tmp + $(QUIET)echo 'const char* DBUS_INTERFACE_XML =' >> $@.tmp + $(QUIET)sed 's/^\(.*\)$$/"\1\\n"/' data/org.pwmt.zathura.xml >> $@.tmp + $(QUIET)echo ';' >> $@.tmp + $(QUIET)mv $@.tmp $@ + +css-definitions.c: data/zathura.css_t + $(QUIET)echo '#include "css-definitions.h"' > $@.tmp + $(QUIET)echo 'const char* CSS_TEMPLATE_INDEX =' >> $@.tmp + $(QUIET)sed 's/^\(.*\)$$/"\1\\n"/' $< >> $@.tmp + $(QUIET)echo ';' >> $@.tmp + $(QUIET)mv $@.tmp $@ %.o: %.c - $(ECHO) CC $< - @mkdir -p .depend + $(call colorecho,CC,$<) + $(QUIET) mkdir -p $(shell dirname .depend/$@.dep) $(QUIET)${CC} -c ${CPPFLAGS} ${CFLAGS} -o $@ $< -MMD -MF .depend/$@.dep %.do: %.c - $(ECHO) CC $< + $(call colorecho,CC,$<) @mkdir -p .depend $(QUIET)${CC} -c ${CPPFLAGS} ${CFLAGS} ${DFLAGS} -o $@ $< -MMD -MF .depend/$@.dep @@ -88,32 +102,30 @@ ${OBJECTS} ${DOBJECTS}: config.mk version.h \ .version-checks/GIRARA .version-checks/GLIB .version-checks/GTK ${PROJECT}: ${OBJECTS} - $(ECHO) CC -o $@ + $(call colorecho,CC,$@) $(QUIET)${CC} ${SFLAGS} ${LDFLAGS} -o $@ ${OBJECTS} ${LIBS} clean: $(QUIET)rm -rf ${PROJECT} \ ${OBJECTS} \ - ${PROJECT}-${VERSION}.tar.gz \ + ${TARFILE} \ + ${TARDIR} \ ${DOBJECTS} \ ${PROJECT}-debug \ .depend \ ${PROJECT}.pc \ - doc \ version.h \ version.h.tmp \ dbus-interface-definitions.c \ dbus-interface-definitions.c.tmp \ *gcda *gcno $(PROJECT).info gcov *.tmp \ .version-checks -ifneq "$(wildcard ${RSTTOMAN})" "" - $(QUIET)rm -f zathura.1 zathurarc.5 -endif $(QUIET)$(MAKE) -C tests clean $(QUIET)$(MAKE) -C po clean + $(QUIET)$(MAKE) -C doc clean ${PROJECT}-debug: ${DOBJECTS} - $(ECHO) CC -o $@ + $(call colorecho,CC,$@) $(QUIET)${CC} ${LDFLAGS} -o $@ ${DOBJECTS} ${LIBS} debug: ${PROJECT}-debug @@ -139,24 +151,13 @@ test: ${OBJECTS} $(QUIET)make -C tests run dist: clean build-manpages - $(QUIET)mkdir -p ${PROJECT}-${VERSION} - $(QUIET)mkdir -p ${PROJECT}-${VERSION}/tests - $(QUIET)mkdir -p ${PROJECT}-${VERSION}/po - $(QUIET)cp LICENSE Makefile config.mk common.mk README AUTHORS Doxyfile \ - ${PROJECT}.1.rst ${PROJECT}rc.5.rst ${OSOURCE} ${HEADER} ${PROJECT}.pc.in \ - ${PROJECT}.desktop version.h.in \ - ${PROJECT}.1 ${PROJECT}rc.5 \ - ${PROJECT}-${VERSION} - $(QUIET)cp -r data ${PROJECT}-${VERSION} - $(QUIET)cp tests/Makefile tests/config.mk tests/*.c \ - ${PROJECT}-${VERSION}/tests - $(QUIET)cp po/Makefile po/*.po ${PROJECT}-${VERSION}/po - $(QUIET)tar -cf ${PROJECT}-${VERSION}.tar ${PROJECT}-${VERSION} - $(QUIET)gzip ${PROJECT}-${VERSION}.tar - $(QUIET)rm -rf ${PROJECT}-${VERSION} + $(QUIET)tar -czf $(TARFILE) --exclude=.gitignore \ + --transform 's,^,zathura-$(VERSION)/,' \ + `git ls-files` \ + doc/_build/$(PROJECT).1 doc/_build/$(PROJECT)rc.5 doc: - $(QUIET)doxygen Doxyfile + $(QUIET)make -C doc gcov: clean $(QUIET)CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage" LDFLAGS="${LDFLAGS} -fprofile-arcs" ${MAKE} $(PROJECT) @@ -170,68 +171,58 @@ po: update-po: $(QUIET)${MAKE} -C po update-po -ifneq "$(wildcard ${RSTTOMAN})" "" -%.1 %.5: config.mk - $(QUIET)sed "s/VERSION/${VERSION}/g" < $@.rst > $@.tmp - $(QUIET)${RSTTOMAN} $@.tmp > $@.out.tmp - $(QUIET)mv $@.out.tmp $@ - $(QUIET)rm $@.tmp - -${PROJECT}.1: ${PROJECT}.1.rst -${PROJECT}rc.5: ${PROJECT}rc.5.rst - -build-manpages: ${PROJECT}.1 ${PROJECT}rc.5 -else build-manpages: -endif + $(QUIET)${MAKE} -C doc man install-manpages: build-manpages - $(ECHO) installing manual pages + $(call colorecho,INSTALL,"man pages") $(QUIET)mkdir -m 755 -p ${DESTDIR}${MANPREFIX}/man1 ${DESTDIR}${MANPREFIX}/man5 -ifneq "$(wildcard ${PROJECT}.1)" "" - $(QUIET)install -m 644 ${PROJECT}.1 ${DESTDIR}${MANPREFIX}/man1 +ifneq "$(wildcard doc/_build/${PROJECT}.1)" "" + $(QUIET)install -m 644 doc/_build/${PROJECT}.1 ${DESTDIR}${MANPREFIX}/man1 endif -ifneq "$(wildcard ${PROJECT}rc.5)" "" - $(QUIET)install -m 644 ${PROJECT}rc.5 ${DESTDIR}${MANPREFIX}/man5 +ifneq "$(wildcard doc/_build/${PROJECT}rc.5)" "" + $(QUIET)install -m 644 doc/_build/${PROJECT}rc.5 ${DESTDIR}${MANPREFIX}/man5 endif install-headers: ${PROJECT}.pc - $(ECHO) installing header files + $(call colorecho,INSTALL,"header files") $(QUIET)mkdir -m 755 -p ${DESTDIR}${INCLUDEDIR}/${PROJECT} $(QUIET)install -m 644 ${HEADERINST} ${DESTDIR}${INCLUDEDIR}/${PROJECT} - $(ECHO) installing pkgconfig file + + $(call colorecho,INSTALL,"pkgconfig file") $(QUIET)mkdir -m 755 -p ${DESTDIR}${LIBDIR}/pkgconfig $(QUIET)install -m 644 ${PROJECT}.pc ${DESTDIR}${LIBDIR}/pkgconfig install-dbus: - $(ECHO) installing D-Bus interface definitions + $(call colorecho,INSTALL,"D-Bus interface definitions") $(QUIET)mkdir -m 755 -p $(DESTDIR)$(DBUSINTERFACEDIR) $(QUIET)install -m 644 data/org.pwmt.zathura.xml $(DESTDIR)$(DBUSINTERFACEDIR) install: all install-headers install-manpages install-dbus - $(ECHO) installing executable file + $(call colorecho,INSTALL,"executeable file") $(QUIET)mkdir -m 755 -p ${DESTDIR}${PREFIX}/bin $(QUIET)install -m 755 ${PROJECT} ${DESTDIR}${PREFIX}/bin $(QUIET)mkdir -m 755 -p ${DESTDIR}${DESKTOPPREFIX} - $(ECHO) installing desktop file + $(call colorecho,INSTALL,"desktop file") $(QUIET)install -m 644 ${PROJECT}.desktop ${DESTDIR}${DESKTOPPREFIX} $(MAKE) -C po install uninstall-headers: - $(ECHO) removing header files + $(call colorecho,UNINSTALL,"header files") $(QUIET)rm -rf ${DESTDIR}${INCLUDEDIR}/${PROJECT} - $(ECHO) removing pkgconfig file + $(call colorecho,UNINSTALL,"pkgconfig file") $(QUIET)rm -f ${DESTDIR}${LIBDIR}/pkgconfig/${PROJECT}.pc uninstall: uninstall-headers $(ECHO) removing executable file + $(call colorecho,UNINSTALL,"executeable") $(QUIET)rm -f ${DESTDIR}${PREFIX}/bin/${PROJECT} - $(ECHO) removing manual pages + $(call colorecho,UNINSTALL,"man pages") $(QUIET)rm -f ${DESTDIR}${MANPREFIX}/man1/${PROJECT}.1 $(QUIET)rm -f ${DESTDIR}${MANPREFIX}/man5/${PROJECT}rc.5 - $(ECHO) removing desktop file + $(call colorecho,UNINSTALL,"desktop file") $(QUIET)rm -f ${DESTDIR}${DESKTOPPREFIX}/${PROJECT}.desktop - $(ECHO) removing D-Bus interface definitions + $(call colorecho,UNINSTALL,"D-Bus interface definitions") $(QUIET)rm -f $(DESTDIR)$(DBUSINTERFACEDIR)/org.pwmt.zathura.xml $(MAKE) -C po uninstall diff --git a/README b/README index 04bf619..83e2341 100644 --- a/README +++ b/README @@ -7,20 +7,24 @@ Requirements ------------ gtk3 glib (>= 2.28) -girara (>= 0.1.8) +girara (>= 0.2.0) sqlite3 (optional, >= 3.5.9) check (for tests) intltool -python-docutils (optional, for man pages) libmagic from file(1) (optional, for mime-type detection) +Sphinx (optional, for manpages and HTML documentation) +doxygen (optional, for HTML documentation) +breathe (optional, for HTML documentation) +sphinx_rtd_theme (optional, for HTML documentation) Please note that you need to have a working pkg-config installation and that the Makefile is only compatible with GNU make. If you don't have a working pkg-config installation please set the GTK_INC, GTK_LIB, GIRARA_INC, GIRARA_LIB, SQLITE_INC and SQLITE_LIB variables accordingly. -And also note that rst2man from python-docutils is needed to build the man pages. -If it is not installed, the man pages won't be built. +Also note that Sphinx is needed to build the manpages. If it is not +installed, the man pages won't be built. For the HTML documentation, doxygen, +breathe and sphinx_rtd_theme are needed in additioan to Sphinx. If you don't want to build with support for sqlite databases, you can set WITH_SQLITE=0 and sqlite support won't be available. @@ -31,6 +35,9 @@ WITH_MAGIC=0. If you pass these flags as a command line argument to make, you have to ensure to pass the same flags when executing the install target. +If you want to build zathuras documentation, please install all python +dependencies from the ./doc/requirements.txt file. + Installation ------------ To build and install zathura: diff --git a/adjustment.c b/adjustment.c index 8d2b513..1cd31b3 100644 --- a/adjustment.c +++ b/adjustment.c @@ -63,9 +63,17 @@ position_to_page_number(zathura_document_t* document, double pos_x, unsigned int c0 = zathura_document_get_first_page_column(document); unsigned int npag = zathura_document_get_number_of_pages(document); unsigned int ncol = zathura_document_get_pages_per_row(document); - unsigned int nrow = (npag + c0 - 1 + ncol - 1) / ncol; /* number of rows */ + unsigned int nrow = 0; unsigned int pad = zathura_document_get_page_padding(document); + if (c0 == 1) { + /* There is no offset, so this is easy. */ + nrow = (npag + ncol - 1) / ncol; + } else { + /* If there is a offset, we handle the first row extra. */ + nrow = 1 + (npag - (ncol - c0 - 1) + (ncol - 1)) / ncol; + } + unsigned int col = floor(pos_x * (double)doc_width / (double)(cell_width + pad)); unsigned int row = floor(pos_y * (double)doc_height / (double)(cell_height + pad)); @@ -73,7 +81,7 @@ position_to_page_number(zathura_document_t* document, double pos_x, if (page < c0 - 1) { return 0; } else { - return page - (c0 - 1); + return MIN(page - (c0 - 1), npag - 1); } } diff --git a/callbacks.c b/callbacks.c index 5389cc2..0f7561d 100644 --- a/callbacks.c +++ b/callbacks.c @@ -137,32 +137,45 @@ cb_view_vadjustment_value_changed(GtkAdjustment* adjustment, gpointer data) statusbar_page_number_update(zathura); } +static void +cb_view_adjustment_changed(GtkAdjustment* adjustment, zathura_t* zathura, + bool width) +{ + /* Do nothing in index mode */ + if (girara_mode_get(zathura->ui.session) == zathura->modes.index) { + return; + } + + const zathura_adjust_mode_t adjust_mode = + zathura_document_get_adjust_mode(zathura->document); + + /* Don't scroll, we're focusing the inputbar. */ + if (adjust_mode == ZATHURA_ADJUST_INPUTBAR) { + return; + } + + /* Save the viewport size */ + unsigned int size = (unsigned int)floor(gtk_adjustment_get_page_size(adjustment)); + if (width == true) { + zathura_document_set_viewport_width(zathura->document, size); + } else { + zathura_document_set_viewport_height(zathura->document, size); + } + + /* reset the adjustment, in case bounds have changed */ + const double ratio = width == true ? + zathura_document_get_position_x(zathura->document) : + zathura_document_get_position_y(zathura->document); + zathura_adjustment_set_value_from_ratio(adjustment, ratio); +} + void cb_view_hadjustment_changed(GtkAdjustment* adjustment, gpointer data) { zathura_t* zathura = data; g_return_if_fail(zathura != NULL); - zathura_adjust_mode_t adjust_mode = - zathura_document_get_adjust_mode(zathura->document); - - /* Do nothing in index mode */ - if (girara_mode_get(zathura->ui.session) == zathura->modes.index) { - return; - } - - /* Don't scroll we're focusing the inputbar. */ - if (adjust_mode == ZATHURA_ADJUST_INPUTBAR) { - return; - } - - /* save the viewport size */ - unsigned int view_width = (unsigned int)floor(gtk_adjustment_get_page_size(adjustment)); - zathura_document_set_viewport_width(zathura->document, view_width); - - /* reset the adjustment, in case bounds have changed */ - double ratio = zathura_document_get_position_x(zathura->document); - zathura_adjustment_set_value_from_ratio(adjustment, ratio); + cb_view_adjustment_changed(adjustment, zathura, true); } void @@ -171,26 +184,7 @@ cb_view_vadjustment_changed(GtkAdjustment* adjustment, gpointer data) zathura_t* zathura = data; g_return_if_fail(zathura != NULL); - zathura_adjust_mode_t adjust_mode = - zathura_document_get_adjust_mode(zathura->document); - - /* Do nothing in index mode */ - if (girara_mode_get(zathura->ui.session) == zathura->modes.index) { - return; - } - - /* Don't scroll we're focusing the inputbar. */ - if (adjust_mode == ZATHURA_ADJUST_INPUTBAR) { - return; - } - - /* save the viewport size */ - unsigned int view_height = (unsigned int)floor(gtk_adjustment_get_page_size(adjustment)); - zathura_document_set_viewport_height(zathura->document, view_height); - - /* reset the adjustment, in case bounds have changed */ - double ratio = zathura_document_get_position_y(zathura->document); - zathura_adjustment_set_value_from_ratio(adjustment, ratio); + cb_view_adjustment_changed(adjustment, zathura, false); } void @@ -220,13 +214,24 @@ cb_refresh_view(GtkWidget* GIRARA_UNUSED(view), gpointer data) } void -cb_page_layout_value_changed(girara_session_t* session, const char* UNUSED(name), girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data)) +cb_page_layout_value_changed(girara_session_t* session, const char* name, girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data)) { g_return_if_fail(value != NULL); g_return_if_fail(session != NULL); g_return_if_fail(session->global.data != NULL); zathura_t* zathura = session->global.data; + /* pages-per-row must not be 0 */ + if (g_strcmp0(name, "pages-per-row") == 0) { + unsigned int pages_per_row = *((unsigned int*) value); + if (pages_per_row == 0) { + pages_per_row = 1; + girara_setting_set(session, name, &pages_per_row); + girara_notify(session, GIRARA_WARNING, _("'%s' must not be 0. Set to 1."), name); + return; + } + } + if (zathura->document == NULL) { /* no document has been openend yet */ return; @@ -579,3 +584,16 @@ cb_page_widget_image_selected(ZathuraPage* page, GdkPixbuf* pixbuf, void* data) g_free(selection); } + +void +cb_page_widget_link(ZathuraPage* page, void* data) +{ + g_return_if_fail(page != NULL); + + bool enter = (bool) data; + + GdkWindow* window = gtk_widget_get_parent_window(GTK_WIDGET(page)); + GdkCursor* cursor = gdk_cursor_new(enter == true ? GDK_HAND1 : GDK_LEFT_PTR); + gdk_window_set_cursor(window, cursor); + g_object_unref(cursor); +} diff --git a/callbacks.h b/callbacks.h index 48cbf90..524e4ce 100644 --- a/callbacks.h +++ b/callbacks.h @@ -200,4 +200,8 @@ void cb_page_widget_text_selected(ZathuraPage* page, const char* text, void cb_page_widget_image_selected(ZathuraPage* page, GdkPixbuf* pixbuf, void* data); +void +cb_page_widget_link(ZathuraPage* page, void* data); + + #endif // CALLBACKS_H diff --git a/colors.mk b/colors.mk new file mode 100644 index 0000000..7c00b36 --- /dev/null +++ b/colors.mk @@ -0,0 +1,25 @@ +# See LICENSE file for license and copyright information +# + +TPUT ?= /usr/bin/tput +TPUT_AVAILABLE ?= $(shell ${TPUT} -V 2>/dev/null) + +ifdef TPUT_AVAILABLE +ifeq ($(COLOR),1) +COLOR_NORMAL = `$(TPUT) sgr0` +COLOR_ACTION = `$(TPUT) bold``$(TPUT) setaf 3` +COLOR_COMMENT = `$(TPUT) bold``$(TPUT) setaf 2` +COLOR_BRACKET = `$(TPUT) setaf 4` +define colorecho + @echo $(COLOR_BRACKET)" ["$(COLOR_ACTION)$1$(COLOR_BRACKET)"] "$(COLOR_COMMENT)$2$(COLOR_BRACKET) $(COLOR_NORMAL) +endef +else +define colorecho + @echo " [$1]" $2 +endef +endif +else +define colorecho + @echo " [$1]" $2 +endef +endif diff --git a/commands.c b/commands.c index a8882c0..00326ba 100644 --- a/commands.c +++ b/commands.c @@ -523,8 +523,8 @@ cmd_exec(girara_session_t* session, girara_list_t* argument_list) const char* path = zathura_document_get_path(zathura->document); GIRARA_LIST_FOREACH(argument_list, char*, iter, value) - char* r = NULL; - if ((r = replace_substring(value, "$FILE", path)) != NULL) { + char* r = girara_replace_substring(value, "$FILE", path); + if (r != NULL) { girara_list_iterator_set(iter, r); } GIRARA_LIST_FOREACH_END(argument_list, char*, iter, value); diff --git a/config.c b/config.c index 7216647..b074366 100644 --- a/config.c +++ b/config.c @@ -31,17 +31,15 @@ cb_jumplist_change(girara_session_t* session, const char* name, g_return_if_fail(name != NULL); zathura_t* zathura = session->global.data; - if (g_strcmp0(name, "jumplist-size") != 0) { - return; - } - if (*(int *)value < 0) { zathura->jumplist.max_size = 0; } else { zathura->jumplist.max_size = *(int *)value; } - zathura_jumplist_trim(zathura); + if (zathura->jumplist.list != NULL && zathura->jumplist.size != 0) { + zathura_jumplist_trim(zathura); + } } static void @@ -176,6 +174,11 @@ config_load_default(zathura_t* zathura) girara_setting_add(gsession, "render-loading-fg", NULL, STRING, false, _("'Loading ...' foreground color"), cb_color_change, NULL); girara_setting_set(gsession, "render-loading-fg", "#000000"); + girara_setting_add(gsession, "index-fg", "#DDDDDD", STRING, true, _("Index mode foreground color"), NULL, NULL); + girara_setting_add(gsession, "index-bg", "#232323", STRING, true, _("Index mode background color"), NULL, NULL); + girara_setting_add(gsession, "index-active-fg", "#232323", STRING, true, _("Index mode foreground color (active element)"), NULL, NULL); + girara_setting_add(gsession, "index-active-bg", "#9FBC00", STRING, true, _("Index mode background color (active element)"), NULL, NULL); + bool_value = false; girara_setting_add(gsession, "recolor", &bool_value, BOOLEAN, false, _("Recolor pages"), cb_setting_recolor_change, NULL); bool_value = false; @@ -184,7 +187,7 @@ config_load_default(zathura_t* zathura) girara_setting_add(gsession, "scroll-wrap", &bool_value, BOOLEAN, false, _("Wrap scrolling"), NULL, NULL); bool_value = false; girara_setting_add(gsession, "scroll-page-aware", &bool_value, BOOLEAN, false, _("Page aware scrolling"), NULL, NULL); - bool_value = false; + bool_value = true; girara_setting_add(gsession, "advance-pages-per-row", &bool_value, BOOLEAN, false, _("Advance number of pages per row"), NULL, NULL); bool_value = false; girara_setting_add(gsession, "zoom-center", &bool_value, BOOLEAN, false, _("Horizontally centered zoom"), NULL, NULL); diff --git a/config.mk b/config.mk index 656bc5d..b8b71bd 100644 --- a/config.mk +++ b/config.mk @@ -1,9 +1,12 @@ # See LICENSE file for license and copyright information # zathura make config +# project +PROJECT = zathura + ZATHURA_VERSION_MAJOR = 0 ZATHURA_VERSION_MINOR = 2 -ZATHURA_VERSION_REV = 7 +ZATHURA_VERSION_REV = 8 # If the API changes, the API version and the ABI version have to be bumped. ZATHURA_API_VERSION = 2 # If the ABI breaks for any reason, this has to be bumped. @@ -15,7 +18,7 @@ VERSION = ${ZATHURA_VERSION_MAJOR}.${ZATHURA_VERSION_MINOR}.${ZATHURA_VERSION_RE # girara GIRARA_VERSION_CHECK ?= 1 -GIRARA_MIN_VERSION = 0.1.8 +GIRARA_MIN_VERSION = 0.2.0 GIRARA_PKG_CONFIG_NAME = girara-gtk3 # glib GLIB_VERSION_CHECK ?= 1 @@ -48,9 +51,6 @@ PLUGINDIR ?= ${LIBDIR}/zathura # locale directory LOCALEDIR ?= ${PREFIX}/share/locale -# rst2man -RSTTOMAN ?= /usr/bin/rst2man - # libs GTK_INC ?= $(shell pkg-config --cflags gtk+-3.0) GTK_LIB ?= $(shell pkg-config --libs gtk+-3.0) @@ -77,8 +77,11 @@ MAGIC_INC ?= MAGIC_LIB ?= -lmagic endif -INCS = ${GIRARA_INC} ${GTK_INC} ${GTHREAD_INC} ${GMODULE_INC} ${GLIB_INC} -LIBS = ${GIRARA_LIB} ${GTK_LIB} ${GTHREAD_LIB} ${GMODULE_LIB} ${GLIB_LIB} -lpthread -lm +ZLIB_INC ?= $(shell pkg-config --cflags zlib) +ZLIB_LIB ?= $(shell pkg-config --libs zlib) + +INCS = ${GIRARA_INC} ${GTK_INC} ${GTHREAD_INC} ${GMODULE_INC} ${GLIB_INC} $(ZLIB_INC) +LIBS = ${GIRARA_LIB} ${GTK_LIB} ${GTHREAD_LIB} ${GMODULE_LIB} ${GLIB_LIB} $(ZLIB_LIB) -lpthread -lm # flags CFLAGS += -std=c99 -pedantic -Wall -Wno-format-zero-length -Wextra $(INCS) @@ -107,3 +110,9 @@ VALGRIND_SUPPRESSION_FILE = zathura.suppression # set to something != 0 if you want verbose build output VERBOSE ?= 0 +# colors +COLOR ?= 1 + +# dist +TARFILE = ${PROJECT}-${VERSION}.tar.gz +TARDIR = ${PROJECT}-${VERSION} diff --git a/css-definitions.h b/css-definitions.h new file mode 100644 index 0000000..5e31db3 --- /dev/null +++ b/css-definitions.h @@ -0,0 +1,8 @@ +/* See LICENSE file for license and copyright information */ + +#ifndef GIRARA_CSS_DEFINITIONS_H +#define GIRARA_CSS_DEFINITIONS_H + +extern const char* CSS_TEMPLATE_INDEX; + +#endif diff --git a/data/zathura.css_t b/data/zathura.css_t new file mode 100644 index 0000000..05cbe3a --- /dev/null +++ b/data/zathura.css_t @@ -0,0 +1,11 @@ +/* Index mode colors */ + +#@session@ .indexmode { + color: @index-fg@; + background-color: @index-bg@; +} + +#@session@ .indexmode:selected { + color: @index-active-fg@; + background-color: @index-active-bg@; +} diff --git a/dbus-interface.c b/dbus-interface.c index eeee0f4..5e965f6 100644 --- a/dbus-interface.c +++ b/dbus-interface.c @@ -170,7 +170,9 @@ highlight_rects(zathura_t* zathura, unsigned int page, document_draw_search_results(zathura, true); - if (rectangles[page] == NULL || girara_list_size(rectangles[page]) == 0) { + girara_list_t* rect_list = rectangles[page]; + if (rect_list == NULL || girara_list_size(rect_list) == 0) { + girara_debug("No rectangles for the given page. Jumping to page %u.", page); page_set(zathura, page); return; } @@ -195,7 +197,13 @@ highlight_rects(zathura_t* zathura, unsigned int page, /* Need to adjust rectangle to page scale and orientation */ zathura_page_t* doc_page = zathura_document_get_page(zathura->document, page); - zathura_rectangle_t* rect = girara_list_nth(rectangles[page], 0); + zathura_rectangle_t* rect = girara_list_nth(rect_list, 0); + if (rect == NULL) { + girara_debug("List of rectangles is broken. Jumping to page %u.", page); + page_set(zathura, page); + return; + } + zathura_rectangle_t rectangle = recalc_rectangle(doc_page, *rect); /* compute the center of the rectangle, which will be aligned to the center @@ -209,6 +217,7 @@ highlight_rects(zathura_t* zathura, unsigned int page, } /* move to position */ + girara_debug("Jumping to page %u position (%f, %f).", page, pos_x, pos_y); zathura_jumplist_add(zathura); position_set(zathura, pos_x, pos_y); zathura_jumplist_add(zathura); @@ -283,6 +292,7 @@ handle_method_call(GDBusConnection* UNUSED(connection), &secondary_iter); if (page >= number_of_pages) { + girara_debug("Got invalid page number."); GVariant* result = g_variant_new("(b)", false); g_variant_iter_free(iter); g_variant_iter_free(secondary_iter); @@ -312,7 +322,7 @@ handle_method_call(GDBusConnection* UNUSED(connection), return; } - zathura_rectangle_t temp_rect; + zathura_rectangle_t temp_rect = { 0, 0, 0, 0 }; while (g_variant_iter_loop(iter, "(dddd)", &temp_rect.x1, &temp_rect.x2, &temp_rect.y1, &temp_rect.y2)) { zathura_rectangle_t* rect = g_try_malloc0(sizeof(zathura_rectangle_t)); @@ -535,17 +545,17 @@ zathura_dbus_goto_page_and_highlight(const char* filename, unsigned int page, } bool -zathura_dbus_synctex_position(const char* filename, const char* position, - pid_t hint) +zathura_dbus_synctex_position(const char* filename, const char* input_file, + int line, int column, pid_t hint) { - if (filename == NULL || position == NULL) { + if (filename == NULL || input_file == NULL) { return false; } unsigned int page = 0; girara_list_t* secondary_rects = NULL; girara_list_t* rectangles = synctex_rectangles_from_position( - filename, position, &page, &secondary_rects); + filename, input_file, line, column, &page, &secondary_rects); if (rectangles == NULL) { return false; } diff --git a/dbus-interface.h b/dbus-interface.h index 4e0f929..1f5b2c5 100644 --- a/dbus-interface.h +++ b/dbus-interface.h @@ -57,7 +57,7 @@ bool zathura_dbus_goto_page_and_highlight(const char* filename, unsigned int page, girara_list_t* rectangles, girara_list_t* secondary_rects, pid_t pidhint); -bool zathura_dbus_synctex_position(const char* filename, const char* position, - pid_t pidhint); +bool zathura_dbus_synctex_position(const char* filename, const char* input_file, + int line, int column, pid_t hint); #endif diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 0000000..e35d885 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1 @@ +_build diff --git a/Doxyfile b/doc/Doxyfile similarity index 80% rename from Doxyfile rename to doc/Doxyfile index f52ac20..632180a 100644 --- a/Doxyfile +++ b/doc/Doxyfile @@ -2,7 +2,7 @@ # General information PROJECT_NAME = zathura -OUTPUT_DIRECTORY = ./doc/ +OUTPUT_DIRECTORY = ./_build/doxygen/ OUTPUT_LANGUAGE = English TAB_SIZE = 2 EXTRACT_ALL = YES @@ -16,15 +16,15 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # Input files -INPUT = -EXCLUDE = ./tests +INPUT = ../ +EXCLUDE = ./tests ./doc FILE_PATTERNS = *.h *.c RECURSIVE = YES # Output files -GENERATE_HTML = YES +GENERATE_HTML = NO GENERATE_LATEX = NO GENERATE_RTF = NO -GENERATE_XML = NO +GENERATE_XML = YES SOURCE_BROWSER = YES diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..c9fb506 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,47 @@ +# See LICENSE file for license and copyright information +# +include ../config.mk +include ../common.mk +include ../colors.mk +include config.mk + +MAN_SOURCES=$(wildcard man/*.rst) $(wildcard man/*.txt) man/conf.py +DOXYGEN_SOURCES=$(wildcard ../*.h) Doxyfile +HTML_SORUCES=$(wildcard *.rst api/*.rst configuration/*.rst installation/*.rst usage/*.rst) conf.py + +SPHINX_OPTS+=-d $(SPHINX_BUILDDIR)/doctrees + +all: man html + +clean: + $(call colorecho,RM,doc/$(SPHINX_BUILDDIR)) + $(QUIET)rm -rf $(SPHINX_BUILDDIR)/ + +$(SPHINX_BUILDDIR)/html/index.html: $(HTML_SOURCES) $(SPHINX_BUILDDIR)/doxygen/xml/index.xml + $(call colorecho,DOC,"Build HTML documentation") + $(QUIET)$(SPHINX_BIN) -b html $(SPHINX_OPTS) . $(SPHINX_BUILDDIR)/html + +$(SPHINX_BUILDDIR)/zathura.1 $(SPHINX_BUILDDIR)/zathurarc.5: $(MAN_SOURCES) + $(call colorecho,DOC,"Build man pages") + $(QUIET)$(SPHINX_BIN) -b man $(SPHINX_OPTS) man $(SPHINX_BUILDDIR) + +$(SPHINX_BUILDDIR)/doxygen/xml/index.xml: $(DOXYGEN_SOURCES) + $(QUIET)mkdir -p $(SPHINX_BUILDDIR) + $(call colorecho,DOC,"Run doxygen") + $(QUIET)$(DOXYGEN_BIN) Doxyfile + +ifeq ($(shell which $(SPHINX_BIN) >/dev/null 2>&1; echo $$?), 1) +man: +html: +else +man: $(SPHINX_BUILDDIR)/zathura.1 $(SPHINX_BUILDDIR)/zathurarc.5 + +# TODO: Make a better test for breathe and sphinx_rtd_theme +ifeq ($(shell which $(DOXYGEN_BIN) >/dev/null 2>&1 && $(PYTHON_BIN) -c "import breathe; import sphinx_rtd_theme" >/dev/null 2>&1; echo $$?), 0) +html: $(SPHINX_BUILDDIR)/html/index.html +else +html: +endif +endif + +.PHONY: clean html man all diff --git a/doc/api/index.rst b/doc/api/index.rst new file mode 100644 index 0000000..fa2a66a --- /dev/null +++ b/doc/api/index.rst @@ -0,0 +1,20 @@ +API and Development +=================== + +This guide should give a short introduction in the way zathura's plugin +system works and how you can write your own plugin and let zathura use +it. + +zathura's plugin system is quite simple. At startup zathura searches +through a specified directory for shared objects and tries to load them +as plugins. Each plugin has to register itself by a name, its version, a +special function as well as its supported mimetypes to zathura. After +the registration of the plugin zathura will automatically use it to open +files with the previous defined mimetypes. That's it. + +.. toctree:: + :maxdepth: 2 + :hidden: + + plugin + diff --git a/doc/api/plugin-development.rst b/doc/api/plugin-development.rst new file mode 100644 index 0000000..e771332 --- /dev/null +++ b/doc/api/plugin-development.rst @@ -0,0 +1,245 @@ +Example - A minimalistic PDF plugin +=================================== + +In this section we are going to develop a simplified version of the +`zathura-pdf-poppler <../zathura-pdf-poppler>`_ plugin. For the sake of +simplicity we are not discussing the build process of the plugin because +we would recommend you to adapt our Makefiles from existing plugins. In +addition we avoid most of the error handling that should be implemented. + +Prerequisites +~~~~~~~~~~~~~ + +In order to use the following described functions and macros you have to +include the *plugin-api.h* header file: + +:: + + #include + +This automatically loads other header files for the +*zathura\_document\_t*, *zathura\_page\_t* as well as all the other +types that are necessary automatically. + +Register the plugin +~~~~~~~~~~~~~~~~~~~ + +As previously described each plugin has to register itself to zathura so +that it can be used properly. Therefore we have introduced a macro +called *ZATHURA\_PLUGIN\_REGISTER* which expects several parameters: + +- Plugin name *The name of the plugin* +- Major version *The plugins major version* +- Minor version *The plugins minor version* +- Revision *The plugins revision* +- Open function *The open function* +- Mimetypes *A character array of supported mime types* + +In our case we are going to register our plugin "my plugin" with its +version 1.0.1, the register function *register\_functions* and the list +of supported mimetypes. + +:: + + ZATHURA_PLUGIN_REGISTER( + "plugin-tutorial", + 0, 1, 0, + register_functions, + ZATHURA_PLUGIN_MIMETYPES({ + "application/pdf" + }) + ) + +This macro will automatically generate among others a function called +*plugin\_register* which is used to register the plugin to zathura when +it has been loaded. + +Register the plugin functions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In our macro we have defined that the function *register\_functions* is +used to install our functions which will implement a certain +functionality in the struct: + +:: + + void + register_functions(zathura_plugin_functions_t* functions) + { + functions->document_open = plugin_document_open; + functions->document_free = plugin_document_free; + functions->page_init = plugin_page_init; + functions->page_clear = plugin_page_clear; + functions->page_render_cairo = plugin_page_render_cairo; + } + +We are now going to give a short overview about the used functions in +the above code snippet. For a complete documentation you should checkout +the documentation of `zathura\_document\_functions\_t <../../doxygen>`_. +A document instance consists out of a *zathura\_document\_t* document +object that contains information about the document itself and a defined +number of *zathura\_page\_t* page objects. There are several functions +defined for those two types and they have to be implemented by the +plugin. For our simple plugin which will only be capable of rendering a +page we will need one function that is capable of opening the PDF +document and setting up all necessary objects for further usage and one +function which will clean up all the allocated objects afterwards. In +addition we need two of those functions for page objects as well and one +function that will actually implement the rendering process. + +Open and closing a document +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The first thing we have to do when opening a document is to initialize +all necessary objects and values that we are going to need for the +future use of the plugin. Therefore we have to implement our +*pdf\_document\_open* function: + +:: + + zathura_error_t + plugin_document_open(zathura_document_t* document) + { + /* get path and password */ + const char* path = zathura_document_get_path(document); + const char* password = zathura_document_get_password(document); + + /* create document data */ + char* uri = g_filename_to_uri(path, NULL, NULL); + PopplerDocument* poppler_document = poppler_document_new_from_file(uri, password, NULL); + g_free(uri); + + if (poppler_document == NULL) { + return ZATHURA_ERROR_UNKNOWN; + } + + /* save poppler document for further usage */ + zathura_document_set_data(document, poppler_document); + + /* get number of pages */ + unsigned int number_of_pages = poppler_document_get_n_pages(poppler_document); + zathura_document_set_number_of_pages(document, number_of_pages); + + return ZATHURA_ERROR_OK; + } + +To open the document we retrieve the *path* and the optional *password* +of the document to create an instance of *PopplerDocument* which +represents a document in the poppler library. If this fails for any +reason (e.g.: the path does not exist, the user provided the incorrect +password) we tell zathura that this function failed for an unknown +reason. If we are lucky we continue and save the created +*poppler\_document* object in the custom data field of the document so +that we can access it later on. After that we determine the number of +pages that the document contains so that zathura can initialize every +single page. + +Since we have allocated the *poppler\_document* object we have to make +sure that its resources will be freed when it is no longer needed. This +happens in our *pdf\_document\_free* function: + +:: + + zathura_error_t + plugin_document_free(zathura_document_t* document, PopplerDocument* poppler_document) + { + g_object_unref(poppler_document); + + return ZATHURA_ERROR_OK; + } + +Page initialization +~~~~~~~~~~~~~~~~~~~ + +Each page has to be initialized so that zathura knows about its +dimension. In addition this stage is used to store additional data in +the page that will be used for further use with it. Therefore we are +implementing *pdf\_page\_init* which will save the width and the height +of the page in the given structure: + +:: + + zathura_error_t + plugin_page_init(zathura_page_t* page) + { + unsigned int page_index = zathura_page_get_index(page); + zathura_document_t* document = zathura_page_get_document(page); + PopplerDocument* poppler_document = zathura_document_get_data(document); + + /* create poppler page */ + PopplerPage* poppler_page = poppler_document_get_page(poppler_document, page_index); + zathura_page_set_data(page, poppler_page); + + /* get page dimensions */ + double width, height; + poppler_page_get_size(poppler_page, &width, &height); + + zathura_page_set_width(page, width); + zathura_page_set_height(page, height); + + return ZATHURA_ERROR_OK; + } + +And we have to make sure that all requested resources are freed in the +end: + +:: + + zathura_error_t + plugin_page_clear(zathura_page_t* page, PopplerPage* poppler_page) + { + g_object_unref(poppler_page); + + return ZATHURA_ERROR_OK; + } + +Render a page +~~~~~~~~~~~~~ + +After we have setup the document and the page objects we are ready to +implement the render function which finally will be able to draw our +page on a widget so that it can be viewed with zathura. This function +has two additional parameters to the already known *zathura\_page\_t* +object: One of them is a *cairo\_t* object which will be used to render +the page, the other one is a flag called *printing* which determines if +the rendered page should be rendered for the print process of zathura. +For instance if this flag is set to true you should not render any +rectangles around links in the document because they are totally +worthless on paper: + +:: + + zathura_error_t + pdf_page_render_cairo(zathura_page_t* page, cairo_t* cairo, bool printing) + { + if (printing == false) { + poppler_page_render(poppler_page, cairo); + } else { + poppler_page_render_for_printing(poppler_page, cairo); + } + + return ZATHURA_ERROR_OK; + } + +In this case the *pdf\_page\_render\_cairo* function is very simplistic +since all the work is done by the *poppler* library. In your case you +might have to do some magic here to draw the page to the cairo object. +Make sure to check out the source code of our plugins. + +Installation of the plugin +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +As we suggested earlier the easiest way to build and install the plugin +is to duplicate the *Makefile* (as long with its *common.mk* and +*config.mk* files of one of our plugins. It already contains all +necessary targets for building, installing and debugging the plugin. + +Otherwise you could build the above plugin with the following command: + +:: + + $ gcc -std=c99 -shared -fPIC -pedantic -Wall `pkg-config --cflags --libs poppler-glib zathura` \ + -o pdf.so pdf.c + +After that you have to copy the *pdf.so* file into the directory where +zathura looks for plugins (this is by default: */usr/lib/zathura*). diff --git a/doc/api/plugin.rst b/doc/api/plugin.rst new file mode 100644 index 0000000..d854a18 --- /dev/null +++ b/doc/api/plugin.rst @@ -0,0 +1,26 @@ +Plugin system +============= + +zathura's plugin system is quite simple. At startup zathura searches +through a specified directory for shared objects and tries to load them +as plugins. Each plugin has to register itself by a name, its version, a +special function as well as its supported mimetypes to zathura. After +the registration of the plugin zathura will automatically use it to open +files with the previous defined mimetypes. That's it. + +Each plugin has to implement a basic set of functionality so that it can +be used in a meaningful way with zathura. For instance it would not make +any sense if the plugin was not able to render any page at all. On the +contrary the export of images out of the document might not be +considered as that important. + +We have predefined a certain set of functionality that a plugin can have +and that can be used by zathura if it has been implemented by the +plugin. When a plugin is loaded, zathura calls a certain function that +the plugin **must implemented** in order to work correctly. This +function gets a data structure which has to be filled with function +pointers by the plugin, which are then used by the main application. + +.. toctree:: + + plugin-development diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..c0fb098 --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# See LICENSE file for license and copyright information + +import sphinx_rtd_theme + +# -- General configuration ------------------------------------------------ + +extensions = [ + 'sphinx.ext.todo', + 'breathe' +] +source_suffix = '.rst' +master_doc = 'index' +templates_path = ['_templates'] +exclude_patterns = ['_build'] + +pygments_style = 'sphinx' + + +# -- Project configuration ------------------------------------------------ + +project = 'zathura' +copyright = '2014, pwmt.org' +version = '0.2.7' +release = '0.2.7' + + +# -- Options for HTML output ---------------------------------------------- + +html_theme = 'sphinx_rtd_theme' +html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] +html_static_path = ['_static'] +htmlhelp_basename = 'zathuradoc' + +# -- Options for breathe --------------------------------------- + +breathe_projects = { "zathura": "_build/doxygen/xml" } +breathe_default_project = "zathura" +breathe_build_directory = "_build" +breathe_projects_source = { + "zathura": "../" +} +breathe_domain_by_extension = { + "h" : "c", + "c" : "c" +} diff --git a/doc/config.mk b/doc/config.mk new file mode 100644 index 0000000..60e395b --- /dev/null +++ b/doc/config.mk @@ -0,0 +1,8 @@ +# See LICENSE file for license and copyright information + +SPHINX_BIN ?= sphinx-build +SPHINX_BUILDDIR = _build +SPHINX_OPTS ?= +DOXYGEN_BIN ?= doxygen +# This needs to be the same python interpreter as used by sphinx-build +PYTHON_BIN ?= python diff --git a/doc/configuration/index.rst b/doc/configuration/index.rst new file mode 100644 index 0000000..072f32a --- /dev/null +++ b/doc/configuration/index.rst @@ -0,0 +1,25 @@ +Configuration +============= + +.. toctree:: + :maxdepth: 1 + + set + map + options + +The customization of zathura is be managed via a configuration file +called *zathurarc*. By default zathura will evaluate the following +files: + +- */etc/zathurarc* +- *$XDG\_CONFIG\_HOME/zathura/zathurarc* (default: + ~/.config/zathura/zathurarc) + +The *zathurarc* file is a simple plain text file that can be populated +with various commands to change the behaviour and the look of zathura +which we are going to describe in the following subsections. Each line +(besides empty lines and comments (which start with a prepended *#*) is +evaluated on its own, so it is not possible to write multiple commands +in one single line. + diff --git a/doc/configuration/map.rst b/doc/configuration/map.rst new file mode 100644 index 0000000..0e0ed6c --- /dev/null +++ b/doc/configuration/map.rst @@ -0,0 +1,266 @@ +map - Mapping a shortcut +======================== + +It is possible to map or remap new key bindings to shortcut functions +which allows a high level of customization. The *:map* command can also +be used in the *zathurarc* file to make those changes permanent: + +:: + + map [mode] + +Mode +---- + +The *map* command expects several arguments where only the *binding* as +well as the *shortcut-function* argument is required. Since zathura uses +several modes it is possible to map bindings only for a specific mode by +passing the *mode* argument which can take one of the following values: + +- normal (default) +- visual +- insert +- fullscreen +- index + +The brackets around the value are mandatory. + +Single key binding +~~~~~~~~~~~~~~~~~~ + +The (possible) second argument defines the used key binding that should +be mapped to the shortcut function and is structured like the following. +On the one hand it is possible to just assign single letters, numbers or +signs to it: + +:: + + map a shortcut_function + map b shortcut_function + map c shortcut_function + map 1 shortcut_function + map 2 shortcut_function + map 3 shortcut_function + map ! shortcut_function + map ? shortcut_function + +Using modifiers +--------------- + +It is also possible to use modifiers like the *Control* or *Alt* button +on the keyboard. It is possible to use the following modifiers: + +- A - *Alt* +- C - *Control* +- S - *Shift* + +Now it is required to define the *binding* with the following structure: + +:: + + map shortcut_function + map shortcut_function + +Special keys +------------ + +zathura allows it also to assign keys like the space bar or the tab +button which also have to be written in between angle brackets. The +following special keys are currently available: + ++--------------+--------------------+ +| Identifier | Description | ++==============+====================+ +| BackSpace | *Back space* | ++--------------+--------------------+ +| CapsLock | *Caps lock* | ++--------------+--------------------+ +| Esc | *Escape* | ++--------------+--------------------+ +| Down | *Arrow down* | ++--------------+--------------------+ +| Up | *Arrow up* | ++--------------+--------------------+ +| Left | *Arrow left* | ++--------------+--------------------+ +| Right | *Arrow right* | ++--------------+--------------------+ +| F1 | *F1* | ++--------------+--------------------+ +| F2 | *F2* | ++--------------+--------------------+ +| F3 | *F3* | ++--------------+--------------------+ +| F4 | *F4* | ++--------------+--------------------+ +| F5 | *F5* | ++--------------+--------------------+ +| F6 | *F6* | ++--------------+--------------------+ +| F7 | *F7* | ++--------------+--------------------+ +| F8 | *F8* | ++--------------+--------------------+ +| F9 | *F9* | ++--------------+--------------------+ +| F10 | *F10* | ++--------------+--------------------+ +| F11 | *F11* | ++--------------+--------------------+ +| F12 | *F12* | ++--------------+--------------------+ +| PageDown | *Page Down* | ++--------------+--------------------+ +| PageUp | *Page Up* | ++--------------+--------------------+ +| Return | *Return* | ++--------------+--------------------+ +| Space | *Space* | ++--------------+--------------------+ +| Super | *Windows button* | ++--------------+--------------------+ +| Tab | *Tab* | ++--------------+--------------------+ + +Of course it is possible to combine those special keys with a modifier. +The usage of those keys should be explained by the following examples: + +:: + + map shortcut_function + map shortcut_function + +Mouse buttons +------------- + +It is also possible to map mouse buttons to shortcuts by using the +following special keys: + ++--------------+--------------------+ +| Identifier | Description | ++==============+====================+ +| Button1 | *Mouse button 1* | ++--------------+--------------------+ +| Button2 | *Mouse button 2* | ++--------------+--------------------+ +| Button3 | *Mouse button 3* | ++--------------+--------------------+ +| Button4 | *Mouse button 4* | ++--------------+--------------------+ +| Button5 | *Mouse button 5* | ++--------------+--------------------+ + +They can also be combined with modifiers: + +:: + + map shortcut_function + map shortcut_function + +Buffer commands +--------------- + +If a mapping does not match one of the previous definition but is still +a valid mapping it will be mapped as a buffer command: + +:: + + map abc quit + map test quit + +Shortcut functions +------------------ + +The following shortcut functions can be mapped: + ++----------------------+----------------------------------------+ +| Function | Description | ++======================+========================================+ +| abort | *Switch back to normal mode* | ++----------------------+----------------------------------------+ +| adjust\_window | *Adjust page width* | ++----------------------+----------------------------------------+ +| change\_mode | *Change current mode* | ++----------------------+----------------------------------------+ +| follow | *Follow a link* | ++----------------------+----------------------------------------+ +| focus\_inputbar | *Focus inputbar* | ++----------------------+----------------------------------------+ +| goto | *Go to a certain page* | ++----------------------+----------------------------------------+ +| index\_navigate | *Navigate through the index* | ++----------------------+----------------------------------------+ +| navigate | *Navigate to the next/previous page* | ++----------------------+----------------------------------------+ +| quit | *Quit zathura* | ++----------------------+----------------------------------------+ +| recolor | *Recolor the pages* | ++----------------------+----------------------------------------+ +| reload | *Reload the document* | ++----------------------+----------------------------------------+ +| rotate | *Rotate the page* | ++----------------------+----------------------------------------+ +| scroll | *Scroll* | ++----------------------+----------------------------------------+ +| search | *Search next/previous item* | ++----------------------+----------------------------------------+ +| set | *Set an option* | ++----------------------+----------------------------------------+ +| toggle\_fullscreen | *Toggle fullscreen* | ++----------------------+----------------------------------------+ +| toggle\_index | *Show or hide index* | ++----------------------+----------------------------------------+ +| toggle\_inputbar | *Show or hide inputbar* | ++----------------------+----------------------------------------+ +| toggle\_statusbar | *Show or hide statusbar* | ++----------------------+----------------------------------------+ +| zoom | *Zoom in or out* | ++----------------------+----------------------------------------+ + +Pass arguments +-------------- + +Some shortcut function require or have optional arguments which +influence the behaviour of them. Those can be passed as the last +argument: + +:: + + map zoom in + map zoom out + +Possible arguments are: + +- bottom +- default +- down +- full-down +- full-up +- half-down +- half-up +- in +- left +- next +- out +- previous +- right +- specific +- top +- up +- best-fit +- width +- rotate-cw +- rotate-ccw + +unmap - Removing a shortcut +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In addition to mapping or remaping custom key bindings it is possible to +remove existing ones by using the *:unmap* command. The command is used +in the following way (the explanation of the parameters is described in +the *map* section of this document + +:: + + unmap [mode] + diff --git a/doc/configuration/options.rst b/doc/configuration/options.rst new file mode 100644 index 0000000..6926160 --- /dev/null +++ b/doc/configuration/options.rst @@ -0,0 +1,164 @@ +Configuration options +===================== + +General settings +---------------- + +.. describe:: abort-clear-search + + Defines if the search results should be cleared on abort. + + :type: Boolean + :default: True + +.. describe:: adjust-open + + Defines which auto adjustment mode should be used if a document is + loaded. Possible options are "best-fit" and "width". + + :type: String + :default: best-fit + +.. describe:: advance-ds-per-row + + Defines if the number of pages per row should be honored when advancing + a page. + + :type: Boolean + :default: true + +.. describe:: database + + Defines the used database backend. Possible options are 'plain' and + 'sqlite' + + :type: String + :default: plain + +.. describe:: highlight-color + + Defines the color that is used for highlighting parts of the document + (e.g.: show search results) + + :type: String + :default: #9FBC00 + +.. describe:: highlight-active-color + + Defines the color that is used to show the current selected highlighted + element (e.g: current search result) + + :type: String + :default: #00BC00 + +.. describe:: highlight-transparency + + Defines the opacity of a highlighted element + + :type: Float + :default: 0.5 + +.. describe:: page-padding + + The page padding defines the gap in pixels between each rendered page. + + :type: Integer + :default: 1 + +.. describe:: page-store-threshold + + Pages that are not visible get unloaded after some time. Every page that + has not been visible for page-store-treshold seconds will be unloaded. + + :type: Integer + :default: 30 + +.. describe:: page-store-interval + + Defines the amount of seconds between the check to unload invisible + pages. + + :type: Integer + :default: 30 + +.. describe:: pages-per-row + + Defines the number of pages that are rendered next to each other in a + row. + + :type: Integer + :default: 1 + +.. describe:: recolor + + En/Disables recoloring + + :type: Boolean + :default: false + +.. describe:: recolor-darkcolor + + Defines the color value that is used to represent dark colors in + recoloring mode + + :type: String + :default: #FFFFFF + +.. describe:: recolor-lightcolor + + Defines the color value that is used to represent light colors in + recoloring mode + + :type: String + :default: #000000 + +.. describe:: render-loading + + Defines if the "Loading..." text should be displayed if a page is + rendered. + + :type: Boolean + :default: true + +.. describe:: scroll-step + + Defines the step size of scrolling by calling the scroll command once + + :type: Float + :default: 40 + +.. describe:: scroll-wrap + + Defines if the last/first page should be wrapped + + :type: Boolean + :default: false + +.. describe:: zoom-max + + Defines the maximum percentage that the zoom level can be + + :type: Integer + :default: 1000 + +.. describe:: zoom-min + + Defines the minimum percentage that the zoom level can be + + :type: Integer + :default: 10 + +.. describe:: zoom-step + + Defines the amount of percent that is zoomed in or out on each comand. + + :type: Integer + :default: 10 + +Girara settings +--------------- + +Most of the options affecting the appearance of zathura are derived from +the options that are offered by our user interface library called girara +and can be found in its `documentation `_. +Those values can also be set via the *zathurarc* file. diff --git a/doc/configuration/set.rst b/doc/configuration/set.rst new file mode 100644 index 0000000..0e0e066 --- /dev/null +++ b/doc/configuration/set.rst @@ -0,0 +1,37 @@ +set - Changing options +====================== + +In addition to the build-in *:set* command zathura offers more options +to be changed and makes those changes permanent. To overwrite an option +you just have to add a line structured like the following + +:: + + set