From 3f26314d0fd32a55b03c80356ed561e18558e536 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 27 May 2008 04:48:31 +0000 Subject: [PATCH] =?UTF-8?q?=20=20=20=20=20=20=20=20Bug=20531008=20?= =?UTF-8?q?=E2=80=93=20Crash=20in=20gtkprintunixdialog.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gtk/gtkprintunixdialog.c: Disconnect signal handlers when the dialog closes. Patch by Yevgen Muntyan. svn path=/trunk/; revision=20186 --- ChangeLog | 7 +++++++ gtk/gtkprintunixdialog.c | 38 +++++++++++++++++++++++--------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index c162154c0d..52cd7261e2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-05-27 Matthias Clasen + + Bug 531008 – Crash in gtkprintunixdialog.c + + * gtk/gtkprintunixdialog.c: Disconnect signal handlers when + the dialog closes. Patch by Yevgen Muntyan. + 2008-05-27 Matthias Clasen RH bug 248245: cups client printing from gnome applications fail diff --git a/gtk/gtkprintunixdialog.c b/gtk/gtkprintunixdialog.c index da1812b4e4..0c8d27b76a 100644 --- a/gtk/gtkprintunixdialog.c +++ b/gtk/gtkprintunixdialog.c @@ -195,6 +195,7 @@ struct GtkPrintUnixDialogPrivate GList *print_backends; GtkPrinter *current_printer; + GtkPrinter *request_details_printer; guint request_details_tag; GtkPrinterOptionSet *options; gulong options_changed_handler; @@ -449,6 +450,21 @@ gtk_print_unix_dialog_destroy (GtkPrintUnixDialog *dialog) clear_per_printer_ui (dialog); } +static void +disconnect_printer_details_request (GtkPrintUnixDialog *dialog) +{ + GtkPrintUnixDialogPrivate *priv = dialog->priv; + + if (priv->request_details_tag) + { + g_signal_handler_disconnect (priv->request_details_printer, + priv->request_details_tag); + priv->request_details_tag = 0; + g_object_unref (priv->request_details_printer); + priv->request_details_printer = NULL; + } +} + static void gtk_print_unix_dialog_finalize (GObject *object) { @@ -458,13 +474,8 @@ gtk_print_unix_dialog_finalize (GObject *object) GList *node; unschedule_idle_mark_conflicts (dialog); + disconnect_printer_details_request (dialog); - if (priv->request_details_tag) - { - g_source_remove (priv->request_details_tag); - priv->request_details_tag = 0; - } - if (priv->current_printer) { g_object_unref (priv->current_printer); @@ -1358,7 +1369,7 @@ printer_details_acquired (GtkPrinter *printer, { GtkPrintUnixDialogPrivate *priv = dialog->priv; - priv->request_details_tag = 0; + disconnect_printer_details_request (dialog); if (success) { @@ -1385,13 +1396,9 @@ selected_printer_changed (GtkTreeSelection *selection, g_free (priv->waiting_for_printer); priv->waiting_for_printer = NULL; } - - if (priv->request_details_tag) - { - g_source_remove (priv->request_details_tag); - priv->request_details_tag = 0; - } - + + disconnect_printer_details_request (dialog); + printer = NULL; if (gtk_tree_selection_get_selected (selection, NULL, &filter_iter)) { @@ -1410,8 +1417,9 @@ selected_printer_changed (GtkTreeSelection *selection, priv->request_details_tag = g_signal_connect (printer, "details-acquired", G_CALLBACK (printer_details_acquired), dialog); + /* take the reference */ + priv->request_details_printer = printer; gtk_printer_request_details (printer); - g_object_unref (printer); return; }