Code

gtk-tpdfv: Support relative pathnames as well.
[tpdfview.git] / src / gtk-tpdfv.c
index cba2e1f2a1c13697e384cb8d1eeab7e62c0547e8..e17a4eb22073f252910f0ee96afe48e2b941b9fa 100644 (file)
@@ -56,7 +56,7 @@ typedef enum {
 } tpdfv_zoommode_t;
 
 typedef struct {
-       char *filename;
+       gchar *filename;
 
        time_t mtime;
 
@@ -129,24 +129,32 @@ tpdfv_close(gtk_tpdfv_t *pdf)
 static gboolean
 tpdfv_init(gtk_tpdfv_t *pdf, const char *filename)
 {
-       if (strstr(filename, "://"))
-               pdf->filename = strdup(filename);
+       GError *err = NULL;
+
+       char *scheme;
+
+       if ((! pdf) || (! filename))
+               return FALSE;
+
+       scheme = g_uri_parse_scheme(filename);
+       if (scheme)
+               filename += strlen(scheme);
+
+       if (g_path_is_absolute(filename)) {
+               pdf->filename = g_filename_to_uri(filename,
+                               /* hostname = */ NULL, &err);
+       }
        else {
-               size_t len = strlen("file://") + strlen(filename);
-               pdf->filename = (char *)malloc(len + 1);
-               if (pdf->filename) {
-                       *pdf->filename = '\0';
-                       strncat(pdf->filename, "file://", len);
-                       strncat(pdf->filename, filename, len - strlen("file://"));
-               }
+               gchar *tmp = g_build_filename(g_get_current_dir(), filename, NULL);
+               pdf->filename = g_filename_to_uri(tmp, /* hostname = */ NULL, &err);
+               g_free(tmp);
        }
 
        /* XXX: error reporting mechanism */
 
        if (! pdf->filename) {
-               char errbuf[1024];
-               strerror_r(errno, errbuf, sizeof(errbuf));
-               fprintf(stderr, "Failed to allocate string: %s.\n", errbuf);
+               if (err)
+                       fprintf(stderr, "Failed to allocate string: %s.\n", err->message);
                return FALSE;
        }
 
@@ -175,7 +183,7 @@ tpdfv_clean(gtk_tpdfv_t *pdf)
 
        tpdfv_close(pdf);
        pdf->current_page = NULL;
-       free(pdf->filename);
+       g_free(pdf->filename);
        pdf->filename = NULL;
        return;
 } /* tpdfv_clean */
@@ -279,6 +287,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);
@@ -349,6 +366,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)
 {
@@ -393,6 +434,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)
 {