Code

build system: Define target 'version' in the toplevel Makefile.
[tpdfview.git] / src / gtk-tpdfv.c
index ee68357d1253de739f77b7002a4785f2b3f4346b..d1a377ce4e44bd3d1204b259982f02ded02f533b 100644 (file)
@@ -43,6 +43,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <sys/stat.h>
+
 #define TPDFV_MIN(a, b) ((a) <= (b) ? (a) : (b))
 #define TPDFV_MAX(a, b) ((a) >= (b) ? (a) : (b))
 
@@ -56,6 +58,8 @@ typedef enum {
 typedef struct {
        char *filename;
 
+       time_t mtime;
+
        PopplerDocument *doc;
        PopplerPage     *current_page;
 
@@ -84,9 +88,21 @@ tpdfv_open(gtk_tpdfv_t *pdf)
 {
        GError *err = NULL;
 
+       struct stat statbuf;
+
        if ((! pdf) || (! pdf->filename))
                return;
 
+       memset(&statbuf, 0, sizeof(statbuf));
+       if (stat(pdf->filename + strlen("file://"), &statbuf) != 0) {
+               char errbuf[1024];
+               strerror_r(errno, errbuf, sizeof(errbuf));
+               fprintf(stderr, "Failed to access PDF: %s.\n", errbuf);
+               return;
+       }
+
+       pdf->mtime = statbuf.st_mtime;
+
        pdf->doc = poppler_document_new_from_file(pdf->filename,
                        /* password = */ NULL, &err);
        if (! pdf->doc) {
@@ -201,6 +217,8 @@ gtk_tpdfv_expose(GtkWidget *tpdfv, GdkEventExpose *event)
        gtk_tpdfv_t *pdf;
        cairo_t *cr;
 
+       struct stat statbuf;
+
        gdouble width, height;
 
        gdouble page_width  = 0.0;
@@ -214,6 +232,17 @@ gtk_tpdfv_expose(GtkWidget *tpdfv, GdkEventExpose *event)
        if (! pdf)
                return FALSE;
 
+       memset(&statbuf, 0, sizeof(statbuf));
+       if (stat(pdf->filename + strlen("file://"), &statbuf)) {
+               char errbuf[1024];
+               strerror_r(errno, errbuf, sizeof(errbuf));
+               fprintf(stderr, "Failed to access PDF: %s.\n", errbuf);
+               return FALSE;
+       }
+
+       if (statbuf.st_mtime > pdf->mtime)
+               gtk_tpdfv_reload(tpdfv);
+
        cr = gdk_cairo_create(tpdfv->window);
        cairo_rectangle(cr, event->area.x, event->area.y,
                        event->area.width, event->area.height);
@@ -250,6 +279,15 @@ gtk_tpdfv_expose(GtkWidget *tpdfv, GdkEventExpose *event)
 
        cairo_translate(cr, x + pdf->delta_x, y + pdf->delta_y);
 
+       /* draw empty white page */
+       cairo_save(cr);
+
+       cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
+       cairo_rectangle(cr, 0.0, 0.0, page_width, page_height);
+       cairo_fill(cr);
+
+       cairo_restore(cr);
+
        poppler_page_render(pdf->current_page, cr);
 
        cairo_destroy(cr);
@@ -320,6 +358,30 @@ gtk_tpdfv_reload(GtkWidget *widget)
        do_redraw(widget);
 } /* gtk_tpdfv_reload */
 
+int
+gtk_tpdfv_get_n_pages(GtkWidget *widget)
+{
+       gtk_tpdfv_t *pdf;
+
+       if (! widget)
+               return -1;
+
+       pdf = GTK_TPDFV_GET_PRIVATE(widget);
+       return pdf->total_pages;
+} /* gtk_tpdfv_get_n_pages */
+
+int
+gtk_tpdfv_get_current_page(GtkWidget *widget)
+{
+       gtk_tpdfv_t *pdf;
+
+       if (! widget)
+               return -1;
+
+       pdf = GTK_TPDFV_GET_PRIVATE(widget);
+       return pdf->current_page_no;
+} /* gtk_tpdfv_get_current_page */
+
 void
 gtk_tpdfv_page_up(GtkWidget *widget)
 {
@@ -364,6 +426,20 @@ gtk_tpdfv_last_page(GtkWidget *widget)
        do_redraw(widget);
 } /* gtk_tpdfv_last_page */
 
+void
+gtk_tpdfv_goto_page(GtkWidget *widget, int page)
+{
+       gtk_tpdfv_t *pdf;
+
+       pdf = GTK_TPDFV_GET_PRIVATE(widget);
+
+       if ((page < 0) || (page >= pdf->total_pages))
+               return;
+
+       pdf->current_page_no = page;
+       do_redraw(widget);
+} /* gtk_tpdfv_goto_page */
+
 void
 gtk_tpdfv_zoom_in(GtkWidget *widget)
 {