]> www.fi.muni.cz Git - evince.git/commitdiff
Hook things up a bit, it works! (sort of)
authorOwen Taylor <otaylor@redhat.com>
Wed, 22 Dec 2004 03:14:27 +0000 (03:14 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Wed, 22 Dec 2004 03:14:27 +0000 (03:14 +0000)
Tue Dec 21 21:58:56 2004  Owen Taylor  <otaylor@redhat.com>

        * pdf/xpdf/pdf-document.cc shell/ev-view.c: Hook things up
        a bit, it works! (sort of)

        * pdf/xpdf/Makefile.am pdf/xpdf/pdf-document.cc:
        Move to .cc since we need to use C++ in the implementation.

        * shell/dummy.cc: Add a CC file to force evince
        to be linked as a C++ program.x

ChangeLog
pdf/xpdf/Makefile.am
pdf/xpdf/pdf-document.cc [moved from pdf/xpdf/pdf-document.c with 56% similarity]
shell/Makefile.am
shell/dummy.cc [new file with mode: 0644]
shell/ev-view.c

index b77e0ead1cf296d627a737038125ff971cc41406..48320e8ac85e7f417155c18c1110fa6f4cfb26cd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Tue Dec 21 21:58:56 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * pdf/xpdf/pdf-document.cc shell/ev-view.c: Hook things up 
+       a bit, it works! (sort of)
+
+       * pdf/xpdf/Makefile.am pdf/xpdf/pdf-document.cc:
+       Move to .cc since we need to use C++ in the implementation.
+
+       * shell/dummy.cc: Add a CC file to force evince
+       to be linked as a C++ program.
+
 Tue Dec 21 21:07:55 2004  Owen Taylor  <otaylor@redhat.com>
 
        * shell/ev-view.[ch]: Start of content-area widget.
index 2d2216c3f5f33f77fb7d201a729955af33ea7c49..7c1b64374ead412dba5d0108394facc699e8cac3 100644 (file)
@@ -111,7 +111,7 @@ test_gdk_output_dev_LDADD =                                         \
        $(GTK_LIBS)
 
 libpdfdocument_la_SOURCES =    \
-       pdf-document.c          \
+       pdf-document.cc         \
        pdf-document.h
 
 libpdfdocument_la_LIBADD =                                     \
similarity index 56%
rename from pdf/xpdf/pdf-document.c
rename to pdf/xpdf/pdf-document.cc
index 81ad89c1437e87de11fb3e5f3f55bebcea7824f1..6078f96297ebb81a9cd4ac6585d0a45b5b02d0e1 100644 (file)
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
+#include "gpdf-g-switch.h"
 #include "pdf-document.h"
+#include "gpdf-g-switch.h"
+
+#include "GlobalParams.h"
+#include "GDKSplashOutputDev.h"
+#include "PDFDoc.h"
 
 typedef struct _PdfDocumentClass PdfDocumentClass;
 
@@ -33,8 +39,12 @@ struct _PdfDocument
 {
        GObject parent_instance;
 
+       int page;
        GdkRectangle page_rect;
        GdkDrawable *target;
+
+       GDKSplashOutputDev *out;
+       PDFDoc *doc;
        
 };
 
@@ -50,19 +60,79 @@ pdf_document_load (EvDocument  *document,
                   const char  *uri,
                   GError     **error)
 {
+       PdfDocument *pdf_document = PDF_DOCUMENT (document);
+       PDFDoc *newDoc;
+       int err;
+       char *filename;
+       GString *filename_g;
+       
+       if (!globalParams) {
+               globalParams = new GlobalParams("/etc/xpdfrc");
+               globalParams->setupBaseFonts(NULL);
+       }
+
+       filename = g_filename_from_uri (uri, NULL, error);
+       if (!filename)
+               return FALSE;
+
+       filename_g = new GString (filename);
+       g_free (filename);
+
+       // open the PDF file
+       newDoc = new PDFDoc(filename_g, 0, 0);
+
+       delete filename_g;
+  
+       if (!newDoc->isOk()) {
+               err = newDoc->getErrorCode();
+               delete newDoc;
+
+               /* FIXME: Add a real error enum to EvDocument */
+               g_set_error (error, G_FILE_ERROR,
+                            G_FILE_ERROR_FAILED,
+                            "Failed to load document (error %d) '%s'\n",
+                            err,
+                            uri);
+               
+               return FALSE;
+       }
+
+       if (pdf_document->doc)
+               delete pdf_document->doc;
+       pdf_document->doc = newDoc;
+
+       if (pdf_document->out) {
+               pdf_document->out->startDoc(pdf_document->doc->getXRef());
+               pdf_document->doc->displayPage (pdf_document->out, 1, 72, 72, 0, gTrue, gTrue);
+       }
+       
        return TRUE;
 }
 
 static int
 pdf_document_get_n_pages (EvDocument  *document)
 {
-       return 1;
+       PdfDocument *pdf_document = PDF_DOCUMENT (document);
+
+       if (pdf_document->doc)
+               return pdf_document->doc->getNumPages();
+       else
+               return 1;
 }
 
 static void
 pdf_document_set_page (EvDocument  *document,
                       int          page)
 {
+       PdfDocument *pdf_document = PDF_DOCUMENT (document);
+
+       pdf_document->page = page;
+}
+
+static void
+redraw_callback (void *data)
+{
+       /* Need to hook up through a EvDocument callback? */
 }
 
 static void
@@ -79,6 +149,19 @@ pdf_document_set_target (EvDocument  *document,
 
                if (pdf_document->target)
                        g_object_ref (pdf_document->target);
+
+               if (pdf_document->out)
+                       delete pdf_document->out;
+
+               if (pdf_document->target) {
+                       pdf_document->out = new GDKSplashOutputDev (gdk_drawable_get_screen (pdf_document->target),
+                                                        redraw_callback, (void*) document);
+
+                       if (pdf_document->doc) {
+                               pdf_document->out->startDoc(pdf_document->doc->getXRef());
+                               pdf_document->doc->displayPage (pdf_document->out, 1, 72, 72, 0, gTrue, gTrue);
+                       }
+               }
        }
 }
 
@@ -104,6 +187,28 @@ pdf_document_render (EvDocument  *document,
                     int          clip_width,
                     int          clip_height)
 {
+       PdfDocument *pdf_document = PDF_DOCUMENT (document);
+       GdkRectangle page;
+       GdkRectangle draw;
+
+       if (!pdf_document->target)
+               return;
+       
+       page.x = 0;
+       page.y = 0;
+       page.width = pdf_document->out->getBitmapWidth();
+       page.height = pdf_document->out->getBitmapHeight();
+
+       draw.x = clip_x;
+       draw.y = clip_y;
+       draw.width = clip_width;
+       draw.height = clip_height;
+       
+       if (gdk_rectangle_intersect (&page, &draw, &draw))
+               pdf_document->out->redraw (draw.x, draw.y,
+                                          pdf_document->target,
+                                          draw.x, draw.y,
+                                          draw.width, draw.height);
 }
 
 static void
@@ -114,12 +219,17 @@ pdf_document_finalize (GObject *object)
        if (pdf_document->target)
                g_object_unref (pdf_document->target);
 
+       if (pdf_document->out)
+               delete pdf_document->out;
+       if (pdf_document->doc)
+               delete pdf_document->doc;
+
 }
 
 static void
-pdf_document_class_init (PdfDocumentClass *class)
+pdf_document_class_init (PdfDocumentClass *klass)
 {
-       GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+       GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
   
        gobject_class->finalize = pdf_document_finalize;
 }
index e764e3a0ad0b5781019c6937f80e4f331fd751a6..48aa917562f6a6d2cfb2e4340316ee1ab4e14810 100644 (file)
@@ -13,6 +13,7 @@ INCLUDES=                                     \
 bin_PROGRAMS=evince
 
 evince_SOURCES=                                \
+       dummy.cc                        \
        eggfindbar.c                    \
        eggfindbar.h                    \
        ev-application.c                \
diff --git a/shell/dummy.cc b/shell/dummy.cc
new file mode 100644 (file)
index 0000000..645049d
--- /dev/null
@@ -0,0 +1,7 @@
+/* This file is just here to fake automake into linking evince as a C++ app
+ */
+
+void evince_cpp_stub_dummy (void)
+{
+}
+
index 70b50e0c4bef82ee940d82b90c946600d7677abf..9fbc81afb8c588c2ae794b5bdd6dce6fe9dc3dfe 100644 (file)
@@ -223,8 +223,9 @@ ev_view_realize (GtkWidget *widget)
        gdk_window_set_user_data (view->bin_window, widget);
        gdk_window_show (view->bin_window);
 
-       attributes.event_mask = GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK | GDK_EXPOSURE_MASK;
-  
+       if (view->document)
+               ev_document_set_target (view->document, view->bin_window);
+
        update_window_backgrounds (view);
 }
 
@@ -233,10 +234,13 @@ ev_view_unrealize (GtkWidget *widget)
 {
        EvView *view = EV_VIEW (widget);
 
+       if (view->document)
+               ev_document_set_target (view->document, NULL);
+
        gdk_window_set_user_data (view->bin_window, NULL);
        gdk_window_destroy (view->bin_window);
        view->bin_window = NULL;
-  
+
        GTK_WIDGET_CLASS (ev_view_parent_class)->unrealize (widget);
 }
 
@@ -258,7 +262,12 @@ static void
 expose_bin_window (GtkWidget      *widget,
                   GdkEventExpose *event)
 {
-       /* EvView *view = EV_VIEW (widget); */
+       EvView *view = EV_VIEW (widget);
+       
+       if (view->document)
+               ev_document_render (view->document,
+                                   event->area.x, event->area.y,
+                                   event->area.width, event->area.height);
 }
 
 static gboolean
@@ -417,6 +426,9 @@ ev_view_set_document (EvView     *view,
                if (view->document)
                        g_object_ref (view->document);
 
+               if (GTK_WIDGET_REALIZED (view))
+                       ev_document_set_target (view->document, view->bin_window);
+               
                gtk_widget_queue_resize (GTK_WIDGET (view));
        }
 }