Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--ps/ps-document.c108
2 files changed, 69 insertions, 48 deletions
diff --git a/ChangeLog b/ChangeLog
index d15f4a9..5e27e07 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2005-02-28 Marco Pesenti Gritti <marco@gnome.org>
+ * ps/ps-document.c: (ps_document_widget_event),
+ (ps_document_set_target), (ps_document_finalize),
+ (ps_document_get_page):
+
+ Disconnect the widget event signal on finalize.
+ Some code cleanups.
+
+2005-02-28 Marco Pesenti Gritti <marco@gnome.org>
+
* ps/ps-document.c: (set_up_page):
If there is no bpixmap create one, even if size
diff --git a/ps/ps-document.c b/ps/ps-document.c
index c0eb794..c1a9481 100644
--- a/ps/ps-document.c
+++ b/ps/ps-document.c
@@ -216,6 +216,7 @@ static gint start_interpreter(PSDocument * gs);
gboolean computeSize(void);
static gboolean ps_document_set_page_size(PSDocument * gs, gint new_pagesize, gint pageid);
static void ps_document_document_iface_init (EvDocumentIface *iface);
+static gboolean ps_document_goto_page(PSDocument * gs, gint page);
static GObjectClass *parent_class = NULL;
@@ -388,6 +389,63 @@ ps_document_cleanup(PSDocument * gs)
set_up_page(gs);
}
+static gboolean
+ps_document_widget_event (GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ PSDocument *gs = (PSDocument *) data;
+
+ if(event->type != GDK_CLIENT_EVENT)
+ return FALSE;
+
+ gs->message_window = event->client.data.l[0];
+
+ if (event->client.message_type == gs_class->page_atom) {
+ LOG ("GS rendered the document");
+ gs->busy = FALSE;
+
+ if (gs->scaling) {
+ ev_document_scale_changed (EV_DOCUMENT (gs));
+ gs->scaling = FALSE;
+ } else {
+ ev_document_page_changed (EV_DOCUMENT (gs));
+ }
+ }
+
+ return TRUE;
+}
+
+static void
+ps_document_set_target (EvDocument *document,
+ GdkDrawable *target)
+{
+ PSDocument *gs = PS_DOCUMENT (document);
+ GtkWidget *widget;
+ gpointer data;
+
+ 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_handlers_disconnect_by_func
+ (widget, ps_document_widget_event, document);
+ }
+
+ 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 (ps_document_widget_event),
+ document);
+ }
+
+ ps_document_goto_page (gs, gs->current_page);
+}
+
static void
ps_document_finalize (GObject * object)
{
@@ -403,6 +461,8 @@ ps_document_finalize (GObject * object)
ps_document_cleanup (gs);
stop_interpreter (gs);
+ ps_document_set_target (EV_DOCUMENT (object), NULL);
+
if(gs->input_buffer) {
g_free(gs->input_buffer);
gs->input_buffer = NULL;
@@ -1715,54 +1775,6 @@ ps_document_get_page (EvDocument *document)
return ps->current_page + 1;
}
-static gboolean
-ps_document_widget_event (GtkWidget *widget, GdkEvent *event, gpointer data)
-{
- PSDocument *gs = (PSDocument *) data;
-
- if(event->type != GDK_CLIENT_EVENT)
- return FALSE;
-
- gs->message_window = event->client.data.l[0];
-
- if (event->client.message_type == gs_class->page_atom) {
- LOG ("GS rendered the document");
- gs->busy = FALSE;
-
- if (gs->scaling) {
- ev_document_scale_changed (EV_DOCUMENT (gs));
- gs->scaling = FALSE;
- } else {
- ev_document_page_changed (EV_DOCUMENT (gs));
- }
- }
-
- return TRUE;
-}
-
-static void
-ps_document_set_target (EvDocument *document,
- GdkDrawable *target)
-{
- PSDocument *gs = PS_DOCUMENT (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 (ps_document_widget_event),
- document);
- }
-
- ps_document_goto_page (gs, gs->current_page);
-}
-
static void
ps_document_set_scale (EvDocument *document,
double scale)