From 4cb2c5e459126e31c569d9d3cd22fa5d6847c719 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Mon, 28 Feb 2005 21:53:42 +0000 Subject: Disconnect the widget event signal on finalize. Some code cleanups. 2005-02-28 Marco Pesenti Gritti * 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. --- (limited to 'ps/ps-document.c') 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) -- cgit v0.9.1