Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog25
-rw-r--r--backend/ev-document.c30
-rw-r--r--backend/ev-document.h4
-rw-r--r--pdf/xpdf/pdf-document.cc1
-rw-r--r--ps/gtkgs.c34
-rw-r--r--shell/ev-view.c15
6 files changed, 104 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 122293c..5b7828f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2004-12-31 Marco Pesenti Gritti <marco@gnome.org>
+
+ * 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 <raphaelh@cvs.gnome.org>
* configure.ac: Added pt_BR to ALL_LINGUAS.
diff --git a/backend/ev-document.c b/backend/ev-document.c
index 59697bd..dcc6204 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 083bd1a..0059fd4 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 e6e72c2..24e0b36 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 ebb29f2..74d6195 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 07fdecd..bde7d33 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);
}
}
}