If '--page [number]' (or '-P [number]') is given on the command-line,
the document is opened at the specified page number. Negative numbers
are allowed, and denote a page number starting from the end of the
document.

See issue 275 <http://bugs.pwmt.org/issue275>.

Reported-by: bob <sean...@gmail.com>
---
 callbacks.c   |    3 ++-
 commands.c    |    4 +++-
 main.c        |    6 +++++-
 shortcuts.c   |    4 +++-
 zathura.1.rst |    5 +++++
 zathura.c     |   26 ++++++++++++++++++--------
 zathura.h     |   11 +++++++++--
 7 files changed, 45 insertions(+), 14 deletions(-)

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
-- 
1.7.10.4

_______________________________________________
zathura mailing list
zathura@lists.pwmt.org
http://lists.pwmt.org/mailman/listinfo/zathura

Reply via email to