From cd303522106f5ce836d426697f8ce3334d955d60 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Fri, 31 Dec 2004 17:10:25 +0000 Subject: [PATCH] Add a changed event that is emitted when the page content changes. This is 2004-12-31 Marco Pesenti Gritti * backend/ev-document.c: (ev_document_base_init), (ev_document_changed): * backend/ev-document.h: Add a changed event that is emitted when the page content changes. This is necessary to deal with the fact that in ps backend rendering happen asycrounously. This makes the ps backend mostly work. * pdf/xpdf/pdf-document.cc: Emit changed event * ps/gtkgs.c: (set_up_page), (gtk_gs_widget_event), (ps_document_set_target): Emit changed event * shell/ev-view.c: (document_changed_callback), (ev_view_set_document), (ev_view_set_page): Redraw on the changed signal --- ChangeLog | 25 +++++++++++++++++++++++++ backend/ev-document.c | 30 +++++++++++++++++++++++++++++- backend/ev-document.h | 4 ++++ pdf/xpdf/pdf-document.cc | 1 + ps/gtkgs.c | 34 +++++++++++++++++++++++++++++++++- shell/ev-view.c | 15 ++++++++++++--- 6 files changed, 104 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 122293ca..5b7828fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2004-12-31 Marco Pesenti Gritti + + * backend/ev-document.c: (ev_document_base_init), + (ev_document_changed): + * backend/ev-document.h: + + Add a changed event that is emitted when the page content + changes. This is necessary to deal with the fact that + in ps backend rendering happen asycrounously. + This makes the ps backend mostly work. + + * pdf/xpdf/pdf-document.cc: + + Emit changed event + + * ps/gtkgs.c: (set_up_page), (gtk_gs_widget_event), + (ps_document_set_target): + + Emit changed event + + * shell/ev-view.c: (document_changed_callback), + (ev_view_set_document), (ev_view_set_page): + + Redraw on the changed signal + 2004-12-25 Raphael Higino * configure.ac: Added pt_BR to ALL_LINGUAS. diff --git a/backend/ev-document.c b/backend/ev-document.c index 59697bd6..dcc62048 100644 --- a/backend/ev-document.c +++ b/backend/ev-document.c @@ -25,6 +25,14 @@ static void ev_document_base_init (gpointer g_class); +enum +{ + CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + GType ev_document_get_type (void) { @@ -50,7 +58,22 @@ ev_document_get_type (void) static void ev_document_base_init (gpointer g_class) { + static gboolean initialized = FALSE; + if (!initialized) + { + signals[CHANGED] = + g_signal_new ("changed", + EV_TYPE_DOCUMENT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EvDocumentIface, changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + + initialized = TRUE; + } } gboolean @@ -128,4 +151,9 @@ ev_document_render (EvDocument *document, EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document); iface->render (document, clip_x, clip_y, clip_width, clip_height); } - + +void +ev_document_changed (EvDocument *document) +{ + g_signal_emit (G_OBJECT (document), signals[CHANGED], 0); +} diff --git a/backend/ev-document.h b/backend/ev-document.h index 083bd1ae..0059fd43 100644 --- a/backend/ev-document.h +++ b/backend/ev-document.h @@ -42,6 +42,9 @@ struct _EvDocumentIface { GTypeInterface base_iface; + /* Signals */ + void (* changed) (EvDocument *document); + /* Methods */ gboolean (* load) (EvDocument *document, const char *uri, @@ -91,6 +94,7 @@ void ev_document_render (EvDocument *document, int clip_y, int clip_width, int clip_height); +void ev_document_changed (EvDocument *document); G_END_DECLS diff --git a/pdf/xpdf/pdf-document.cc b/pdf/xpdf/pdf-document.cc index e6e72c27..24e0b362 100644 --- a/pdf/xpdf/pdf-document.cc +++ b/pdf/xpdf/pdf-document.cc @@ -204,6 +204,7 @@ pdf_document_set_page (EvDocument *document, pdf_document->page_valid = FALSE; } + ev_document_changed (document); } static int diff --git a/ps/gtkgs.c b/ps/gtkgs.c index ebb29f23..74d61957 100644 --- a/ps/gtkgs.c +++ b/ps/gtkgs.c @@ -498,6 +498,7 @@ set_up_page(GtkGS * gs) //GdkColormap *colormap; GdkGC *fill; GdkColor white = { 0, 0xFFFF, 0xFFFF, 0xFFFF }; /* pixel, r, g, b */ + GdkColormap *colormap; #ifdef HAVE_LOCALE_H char *savelocale; @@ -518,6 +519,8 @@ set_up_page(GtkGS * gs) /* clear new pixmap (set to white) */ fill = gdk_gc_new(gs->pstarget); if(fill) { + colormap = gdk_drawable_get_colormap(gs->pstarget); + gdk_color_alloc (colormap, &white); gdk_gc_set_foreground(fill, &white); if(gs->width > 0 && gs->height > 0) { @@ -2089,13 +2092,42 @@ ps_document_get_page (EvDocument *document) return gtk_gs_get_current_page (GTK_GS (document)); } +static gboolean +gtk_gs_widget_event (GtkWidget *widget, GdkEvent *event, gpointer data) +{ + GtkGS *gs = (GtkGS *) data; + + if(event->type != GDK_CLIENT_EVENT) + return FALSE; + + if (event->client.message_type == gs_class->page_atom) { + gs->busy = FALSE; + ev_document_changed (EV_DOCUMENT (gs)); + } + + return TRUE; +} + static void ps_document_set_target (EvDocument *document, - GdkDrawable *target) + GdkDrawable *target) { GtkGS *gs = GTK_GS (document); + GtkWidget *widget; + gpointer data; gs->pstarget = target; + + if (gs->pstarget) { + gdk_window_get_user_data (gs->pstarget, &data); + g_return_if_fail (GTK_IS_WIDGET (data)); + + widget = GTK_WIDGET (data); + g_signal_connect (widget, "event", + G_CALLBACK (gtk_gs_widget_event), + document); + } + gtk_gs_goto_page (gs, gs->current_page); } diff --git a/shell/ev-view.c b/shell/ev-view.c index 07fdecd8..bde7d33d 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -596,6 +596,13 @@ ev_view_new (void) return g_object_new (EV_TYPE_VIEW, NULL); } +static void +document_changed_callback (EvDocument *document, + EvView *view) +{ + gtk_widget_queue_draw (GTK_WIDGET (view)); +} + void ev_view_set_document (EvView *view, EvDocument *document) @@ -624,6 +631,10 @@ ev_view_set_document (EvView *view, "found", G_CALLBACK (found_results_callback), view); + g_signal_connect (view->document, + "changed", + G_CALLBACK (document_changed_callback), + view); } if (GTK_WIDGET_REALIZED (view)) @@ -648,9 +659,7 @@ ev_view_set_page (EvView *view, g_signal_emit (view, page_changed_signal, 0); view->find_percent_complete = 0.0; - update_find_results (view); - - gtk_widget_queue_draw (GTK_WIDGET (view)); + update_find_results (view); } } } -- 2.43.5