From 1e247284337090fd8f65e4c191652647d95a36ac Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Wed, 22 Dec 2004 03:14:27 +0000 Subject: [PATCH] Hook things up a bit, it works! (sort of) Tue Dec 21 21:58:56 2004 Owen Taylor * 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 | 11 ++ pdf/xpdf/Makefile.am | 2 +- pdf/xpdf/{pdf-document.c => pdf-document.cc} | 116 ++++++++++++++++++- shell/Makefile.am | 1 + shell/dummy.cc | 7 ++ shell/ev-view.c | 20 +++- 6 files changed, 149 insertions(+), 8 deletions(-) rename pdf/xpdf/{pdf-document.c => pdf-document.cc} (56%) create mode 100644 shell/dummy.cc diff --git a/ChangeLog b/ChangeLog index b77e0ead..48320e8a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Tue Dec 21 21:58:56 2004 Owen Taylor + + * 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 * shell/ev-view.[ch]: Start of content-area widget. diff --git a/pdf/xpdf/Makefile.am b/pdf/xpdf/Makefile.am index 2d2216c3..7c1b6437 100644 --- a/pdf/xpdf/Makefile.am +++ b/pdf/xpdf/Makefile.am @@ -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 = \ diff --git a/pdf/xpdf/pdf-document.c b/pdf/xpdf/pdf-document.cc similarity index 56% rename from pdf/xpdf/pdf-document.c rename to pdf/xpdf/pdf-document.cc index 81ad89c1..6078f962 100644 --- a/pdf/xpdf/pdf-document.c +++ b/pdf/xpdf/pdf-document.cc @@ -16,7 +16,13 @@ * 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; } diff --git a/shell/Makefile.am b/shell/Makefile.am index e764e3a0..48aa9175 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -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 index 00000000..645049dc --- /dev/null +++ b/shell/dummy.cc @@ -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) +{ +} + diff --git a/shell/ev-view.c b/shell/ev-view.c index 70b50e0c..9fbc81af 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -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)); } } -- 2.43.5