Addl fix #322: include pdf-view
authorColin Clark <colin.clark@cclark.uk>
Thu, 18 Jul 2019 17:32:50 +0000 (18:32 +0100)
committerColin Clark <colin.clark@cclark.uk>
Thu, 18 Jul 2019 17:32:50 +0000 (18:32 +0100)
https://github.com/BestImageViewer/geeqie/issues/322

View multi-page pdfs.
Use <control>page-up and <control>page-down to scroll through the pages.

src/filedata.c
src/filedata.h
src/image-load.c
src/image-load.h
src/image_load_pdf.c
src/layout.c
src/layout_util.c
src/typedefs.h

index 240531f..2a2a645 100644 (file)
@@ -435,6 +435,8 @@ static FileData *file_data_new(const gchar *path_utf8, struct stat *st, gboolean
        fd->exifdate = 0;
        fd->rating = STAR_RATING_NOT_READ;
        fd->format_class = filter_file_get_class(path_utf8);
+       fd->page_num = 0;
+       fd->page_total = 0;
 
        user = getpwuid(st->st_uid);
        if (!user)
@@ -3394,4 +3396,32 @@ void marks_clear_all()
 {
        g_hash_table_foreach(file_data_pool, marks_clear, NULL);
 }
+
+void file_data_inc_page_num(FileData *fd)
+{
+       if (fd->page_total > 0 && fd->page_num < fd->page_total - 1)
+               {
+               fd->page_num = fd->page_num + 1;
+               }
+       else if (fd->page_total == 0)
+               {
+               fd->page_num = fd->page_num + 1;
+               }
+       file_data_send_notification(fd, NOTIFY_REREAD);
+}
+
+void file_data_dec_page_num(FileData *fd)
+{
+       if (fd->page_num > 0)
+               {
+               fd->page_num = fd->page_num - 1;
+               }
+       file_data_send_notification(fd, NOTIFY_REREAD);
+}
+
+void file_data_set_page_total(FileData *fd, gint page_total)
+{
+       fd->page_total = page_total;
+}
+
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
index 8587dcd..201c120 100644 (file)
@@ -172,5 +172,9 @@ gboolean marks_list_save(gchar *path, gboolean clear);
 gboolean marks_list_load(const gchar *path);
 void marks_clear_all();
 void read_rating_data(FileData *file);
+
+void file_data_inc_page_num(FileData *fd);
+void file_data_dec_page_num(FileData *fd);
+void file_data_set_page_total(FileData *fd, gint page_total);
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
index 11045c4..1f2be3f 100644 (file)
@@ -683,6 +683,12 @@ static void image_loader_setup_loader(ImageLoader *il)
                image_loader_backend_set_default(&il->backend);
 
        il->loader = il->backend.loader_new(image_loader_area_updated_cb, image_loader_size_cb, image_loader_area_prepared_cb, il);
+
+       if (il->fd->format_class == FORMAT_CLASS_PDF)
+               {
+               il->backend.set_page_num(il->loader, il->fd->page_num);
+               }
+
        g_mutex_unlock(il->data_mutex);
 }
 
@@ -766,6 +772,12 @@ static gboolean image_loader_begin(ImageLoader *il)
                return FALSE;
                }
 
+       if (il->fd->format_class == FORMAT_CLASS_PDF)
+               {
+               gint i = il->backend.get_page_total(il->loader);
+               file_data_set_page_total(il->fd, i);
+               }
+
        il->bytes_read += b;
 
        /* read until size is known */
index 98bb653..a209fa3 100644 (file)
@@ -38,6 +38,8 @@ typedef void (*ImageLoaderBackendFuncAbort)(gpointer loader);
 typedef void (*ImageLoaderBackendFuncFree)(gpointer loader);
 typedef gchar* (*ImageLoaderBackendFuncGetFormatName)(gpointer loader);
 typedef gchar** (*ImageLoaderBackendFuncGetFormatMimeTypes)(gpointer loader);
+typedef void (*ImageLoaderBackendFuncSetPageNum)(gpointer loader, gint page_num);
+typedef gint (*ImageLoaderBackendFuncGetPageTotal)(gpointer loader);
 
 typedef struct _ImageLoaderBackend ImageLoaderBackend;
 struct _ImageLoaderBackend
@@ -52,6 +54,8 @@ struct _ImageLoaderBackend
        ImageLoaderBackendFuncFree free;
        ImageLoaderBackendFuncGetFormatName get_format_name;
        ImageLoaderBackendFuncGetFormatMimeTypes get_format_mime_types;
+       ImageLoaderBackendFuncSetPageNum set_page_num;
+       ImageLoaderBackendFuncGetPageTotal get_page_total;
 };
 
 
index ae00a9d..32b1656 100644 (file)
@@ -36,6 +36,8 @@ struct _ImageLoaderPDF {
        guint requested_width;
        guint requested_height;
        gboolean abort;
+       gint page_num;
+       gint page_total;
 };
 
 static gboolean image_loader_pdf_load(gpointer loader, const guchar *buf, gsize count, GError **error)
@@ -44,13 +46,13 @@ static gboolean image_loader_pdf_load(gpointer loader, const guchar *buf, gsize
        GError *poppler_error = NULL;
        PopplerPage *page;
        PopplerDocument *document;
-       gint page_num;
        gdouble width, height;
        cairo_surface_t *surface;
        cairo_t *cr;
        gboolean ret = FALSE;
+       gint page_total;
+DEBUG_0(" ");
 
-       page_num = 0;
        document = poppler_document_new_from_data((gchar *)buf, count, NULL, &poppler_error);
 
        if (poppler_error)
@@ -60,7 +62,13 @@ static gboolean image_loader_pdf_load(gpointer loader, const guchar *buf, gsize
                }
        else
                {
-               page = poppler_document_get_page(document, page_num);
+               page_total = poppler_document_get_n_pages(document);
+               if (page_total > 0)
+                       {
+                       ld->page_total = page_total;
+                       }
+
+               page = poppler_document_get_page(document, ld->page_num);
                poppler_page_get_size(page, &width, &height);
 
                surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
@@ -88,6 +96,7 @@ static gpointer image_loader_pdf_new(ImageLoaderBackendCbAreaUpdated area_update
        loader->size_cb = size_cb;
        loader->area_prepared_cb = area_prepared_cb;
        loader->data = data;
+       loader->page_num = 0;
        return (gpointer) loader;
 }
 
@@ -115,6 +124,21 @@ static gchar** image_loader_pdf_get_format_mime_types(gpointer loader)
        return g_strdupv(mime);
 }
 
+static void image_loader_pdf_set_page_num(gpointer loader, gint page_num)
+{
+       ImageLoader *il = (ImageLoader *) loader;
+       ImageLoaderPDF *ld = (ImageLoaderPDF *) loader;
+
+       ld->page_num = page_num;
+}
+
+static gint image_loader_pdf_get_page_total(gpointer loader)
+{
+       ImageLoaderPDF *ld = (ImageLoaderPDF *) loader;
+
+       return ld->page_total;
+}
+
 static gboolean image_loader_pdf_close(gpointer loader, GError **error)
 {
        return TRUE;
@@ -145,6 +169,8 @@ void image_loader_backend_set_pdf(ImageLoaderBackend *funcs)
        funcs->free = image_loader_pdf_free;
        funcs->get_format_name = image_loader_pdf_get_format_name;
        funcs->get_format_mime_types = image_loader_pdf_get_format_mime_types;
+       funcs->set_page_num = image_loader_pdf_set_page_num;
+       funcs->get_page_total = image_loader_pdf_get_page_total;
 }
 
 #endif
index 2b92d30..979613f 100644 (file)
@@ -680,6 +680,9 @@ void layout_status_update_info(LayoutWindow *lw, const gchar *text)
 void layout_status_update_image(LayoutWindow *lw)
 {
        guint64 n;
+       FileData *fd;
+       gint page_total;
+       gint page_num;
 
        if (!layout_valid(&lw) || !lw->image) return;
        if (!lw->info_zoom || !lw->info_details) return; /*called from layout_style_set */
@@ -716,10 +719,19 @@ void layout_status_update_image(LayoutWindow *lw)
                else
                        {
                        gint width, height;
-
+                       fd = image_get_fd(lw->image);
+                       page_total = fd->page_total;
+                       page_num = fd->page_num + 1;
                        image_get_image_size(lw->image, &width, &height);
-                       text = g_strdup_printf(_("( %d x %d ) %s bytes"),
-                                              width, height, b);
+
+                       if (page_total > 0)
+                               {
+                               text = g_strdup_printf(_("( %d x %d ) %s bytes%s%d%s%d%s"), width, height, b, "[", page_num, "/", page_total, "]");
+                               }
+                       else
+                               {
+                               text = g_strdup_printf(_("( %d x %d ) %s bytes"), width, height, b);
+                               }
                        }
 
                g_signal_emit_by_name (lw->image->pr, "update-pixel");
index 5eb32fb..bd0e093 100644 (file)
@@ -1541,6 +1541,22 @@ static void layout_menu_image_next_cb(GtkAction *action, gpointer data)
        layout_image_next(lw);
 }
 
+static void layout_menu_page_next_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+       FileData *fd = layout_image_get_fd(lw);
+
+       file_data_inc_page_num(fd);
+}
+
+static void layout_menu_page_previous_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+       FileData *fd = layout_image_get_fd(lw);
+
+       file_data_dec_page_num(fd);
+}
+
 static void layout_menu_split_pane_next_cb(GtkAction *action, gpointer data)
 {
        LayoutWindow *lw = data;
@@ -1889,6 +1905,11 @@ static GtkActionEntry menu_entries[] = {
   { "PrevImageAlt2",   GTK_STOCK_GO_UP,        N_("_Previous Image"),                  "KP_Page_Up",           N_("Previous Image"),                   CB(layout_menu_image_prev_cb) },
   { "NextImage",       GTK_STOCK_GO_DOWN,      N_("_Next Image"),                      "space",                N_("Next Image"),                       CB(layout_menu_image_next_cb) },
   { "NextImageAlt1",   GTK_STOCK_GO_DOWN,      N_("_Next Image"),                      "Page_Down",            N_("Next Image"),                       CB(layout_menu_image_next_cb) },
+
+  { "NextPage",        NULL,   N_("_Next Page"),                       "<control>Page_Down",           N_("Next Page"),                        CB(layout_menu_page_next_cb) },
+  { "PrevPage",        NULL,   N_("_Previous Page"),                   "<control>Page_Up",             N_("Previous Page"),                    CB(layout_menu_page_previous_cb) },
+
+
   { "NextImageAlt2",   GTK_STOCK_GO_DOWN,      N_("_Next Image"),                      "KP_Page_Down",         N_("Next Image"),                       CB(layout_menu_image_next_cb) },
   { "LastImage",       GTK_STOCK_GOTO_BOTTOM,  N_("_Last Image"),                      "End",                  N_("Last Image"),                       CB(layout_menu_image_last_cb) },
   { "Back",            GTK_STOCK_GO_BACK,      N_("_Back"),                            NULL,                   N_("Back"),                             CB(layout_menu_back_cb) },
@@ -2121,6 +2142,8 @@ static const gchar *menu_ui_description =
 "      <menuitem action='Up'/>"
 "      <menuitem action='Home'/>"
 "      <separator/>"
+"      <menuitem action='NextPage'/>"
+"      <menuitem action='PrevPage'/>"
 "    </menu>"
 "    <menu action='SelectMenu'>"
 "      <menuitem action='SelectAll'/>"
index 6f6e2ce..f9ada74 100644 (file)
@@ -606,6 +606,9 @@ struct _FileData {
        gchar *sym_link;
 
        SelectionType selected;  // Used by view_file_icon.
+
+       gint page_num;
+       gint page_total;
 };
 
 struct _LayoutOptions