diff --git a/callbacks.c b/callbacks.c index 72fc348..b72ebad 100644 --- a/callbacks.c +++ b/callbacks.c @@ -340,7 +340,8 @@ cb_password_dialog(GtkEntry* entry, zathura_password_dialog_info_t* dialog) } /* try to open document again */ - if (document_open(dialog->zathura, dialog->path, input) == false) { + if (document_open(dialog->zathura, dialog->path, input, + ZATHURA_PAGE_NUMBER_UNSPECIFIED) == false) { gdk_threads_add_idle(password_dialog, dialog); } else { g_free(dialog->path); diff --git a/commands.c b/commands.c index b6ad942..9551b51 100644 --- a/commands.c +++ b/commands.c @@ -225,7 +225,9 @@ cmd_open(girara_session_t* session, girara_list_t* argument_list) document_close(zathura, false); } - document_open(zathura, girara_list_nth(argument_list, 0), (argc == 2) ? girara_list_nth(argument_list, 1) : NULL); + document_open(zathura, girara_list_nth(argument_list, 0), + (argc == 2) ? girara_list_nth(argument_list, 1) : NULL, + ZATHURA_PAGE_NUMBER_UNSPECIFIED); } else { girara_notify(session, GIRARA_ERROR, _("No arguments given.")); return false; diff --git a/main.c b/main.c index 7284faa..69562a4 100644 --- a/main.c +++ b/main.c @@ -43,6 +43,7 @@ main(int argc, char* argv[]) bool forkback = false; bool print_version = false; bool synctex = false; + int page_number = ZATHURA_PAGE_NUMBER_UNSPECIFIED; #if (GTK_MAJOR_VERSION == 3) Window embed = 0; @@ -57,6 +58,7 @@ main(int argc, char* argv[]) { "plugins-dir", 'p', 0, G_OPTION_ARG_STRING, &plugin_path, _("Path to the directories containing plugins"), "path" }, { "fork", '\0',0, G_OPTION_ARG_NONE, &forkback, _("Fork into the background"), NULL }, { "password", 'w', 0, G_OPTION_ARG_STRING, &password, _("Document password"), "password" }, + { "page", 'P', 0, G_OPTION_ARG_INT, &page_number, _("Page number to go to"), "number" }, { "debug", 'l', 0, G_OPTION_ARG_STRING, &loglevel, _("Log level (debug, info, warning, error)"), "level" }, { "version", 'v', 0, G_OPTION_ARG_NONE, &print_version, _("Print version information"), NULL }, { "synctex", 's', 0, G_OPTION_ARG_NONE, &synctex, _("Enable synctex support"), NULL }, @@ -128,7 +130,9 @@ main(int argc, char* argv[]) /* open document if passed */ if (argc > 1) { - document_open_idle(zathura, argv[1], password); + if (page_number > 0) + --page_number; + document_open_idle(zathura, argv[1], password, page_number); /* open additional files */ for (int i = 2; i < argc; i++) { diff --git a/shortcuts.c b/shortcuts.c index 80a1a37..a3348af 100644 --- a/shortcuts.c +++ b/shortcuts.c @@ -511,7 +511,9 @@ sc_reload(girara_session_t* session, girara_argument_t* UNUSED(argument), document_close(zathura, true); /* reopen document */ - document_open(zathura, zathura->file_monitor.file_path, zathura->file_monitor.password); + document_open(zathura, zathura->file_monitor.file_path, + zathura->file_monitor.password, + ZATHURA_PAGE_NUMBER_UNSPECIFIED); return false; } diff --git a/zathura.1.rst b/zathura.1.rst index 7ab265c..bba12e6 100644 --- a/zathura.1.rst +++ b/zathura.1.rst @@ -41,6 +41,11 @@ OPTIONS will be used for the first one and zathura will ask for the passwords of the remaining files if needed. +-P [number], --page [number] + Open the document at the given page number. Pages are numbered starting with + 1, and negative numbers indicate page numbers starting from the end of the + document, -1 being the last page. + --fork Fork into the background diff --git a/zathura.c b/zathura.c index f353840..807211a 100644 --- a/zathura.c +++ b/zathura.c @@ -37,6 +37,7 @@ typedef struct zathura_document_info_s { zathura_t* zathura; const char* path; const char* password; + int page_number; } zathura_document_info_t; typedef struct page_set_delayed_s { @@ -487,7 +488,8 @@ document_info_open(gpointer data) } if (file != NULL) { - document_open(document_info->zathura, file, document_info->password); + document_open(document_info->zathura, file, document_info->password, + document_info->page_number); g_free(file); } } @@ -497,7 +499,8 @@ document_info_open(gpointer data) } bool -document_open(zathura_t* zathura, const char* path, const char* password) +document_open(zathura_t* zathura, const char* path, const char* password, + int page_number) { if (zathura == NULL || zathura->plugins.manager == NULL || path == NULL) { goto error_out; @@ -552,11 +555,16 @@ document_open(zathura_t* zathura, const char* path, const char* password) } /* check current page number */ - if (file_info.current_page > number_of_pages) { + /* if it wasn't specified on the command-line, get it from file_info */ + if (page_number == ZATHURA_PAGE_NUMBER_UNSPECIFIED) + page_number = file_info.current_page; + if (page_number < 0) + page_number += number_of_pages; + if ((unsigned)page_number > number_of_pages) { girara_warning("document info: '%s' has an invalid page number", file_path); zathura_document_set_current_page_number(document, 0); } else { - zathura_document_set_current_page_number(document, file_info.current_page); + zathura_document_set_current_page_number(document, page_number); } /* check for valid rotation */ @@ -747,7 +755,8 @@ error_out: } void -document_open_idle(zathura_t* zathura, const char* path, const char* password) +document_open_idle(zathura_t* zathura, const char* path, const char* password, + int page_number) { if (zathura == NULL || path == NULL) { return; @@ -755,9 +764,10 @@ document_open_idle(zathura_t* zathura, const char* path, const char* password) zathura_document_info_t* document_info = g_malloc0(sizeof(zathura_document_info_t)); - document_info->zathura = zathura; - document_info->path = path; - document_info->password = password; + document_info->zathura = zathura; + document_info->path = path; + document_info->password = password; + document_info->page_number = page_number; gdk_threads_add_idle(document_info_open, document_info); } diff --git a/zathura.h b/zathura.h index 26753f7..96d9610 100644 --- a/zathura.h +++ b/zathura.h @@ -21,6 +21,11 @@ enum { NEXT, PREVIOUS, LEFT, RIGHT, UP, DOWN, BOTTOM, TOP, HIDE, HIGHLIGHT, FULL_DOWN, HALF_LEFT, HALF_RIGHT, FULL_LEFT, FULL_RIGHT, NEXT_CHAR, PREVIOUS_CHAR, DELETE_TO_LINE_START, APPEND_FILEPATH, ROTATE_CW, ROTATE_CCW }; +/* unspecified page number */ +enum { + ZATHURA_PAGE_NUMBER_UNSPECIFIED = INT_MIN +}; + /* forward declaration for types form database.h */ typedef struct _ZathuraDatabase zathura_database_t; @@ -237,7 +242,8 @@ void zathura_set_argv(zathura_t* zathura, char** argv); * * @return If no error occured true, otherwise false, is returned. */ -bool document_open(zathura_t* zathura, const char* path, const char* password); +bool document_open(zathura_t* zathura, const char* path, const char* password, + int page_number); /** * Opens a file (idle) @@ -246,7 +252,8 @@ bool document_open(zathura_t* zathura, const char* path, const char* password); * @param path The path to the file * @param password The password of the file */ -void document_open_idle(zathura_t* zathura, const char* path, const char* password); +void document_open_idle(zathura_t* zathura, const char* path, + const char* password, int page_number); /** * Save a open file