[gnome-control-center/gnome-3-24] printers: Make the dialogs independent of the PpPrinterEntry lifetime



commit 58270a2c76328b6a2b96325c3764cfe60241bf10
Author: Felipe Borges <felipeborges gnome org>
Date:   Mon Mar 13 09:16:29 2017 +0100

    printers: Make the dialogs independent of the PpPrinterEntry lifetime
    
    https://bugzilla.gnome.org/show_bug.cgi?id=779846

 panels/printers/pp-jobs-dialog.c    |   12 +++++++++++
 panels/printers/pp-jobs-dialog.h    |   15 ++++++++-----
 panels/printers/pp-options-dialog.c |   12 +++++++++++
 panels/printers/pp-options-dialog.h |   15 ++++++++-----
 panels/printers/pp-printer-entry.c  |   36 +++++++++++++++++++++++++++++++++++
 5 files changed, 78 insertions(+), 12 deletions(-)
---
diff --git a/panels/printers/pp-jobs-dialog.c b/panels/printers/pp-jobs-dialog.c
index f821920..6971256 100644
--- a/panels/printers/pp-jobs-dialog.c
+++ b/panels/printers/pp-jobs-dialog.c
@@ -334,6 +334,18 @@ pp_jobs_dialog_update (PpJobsDialog *dialog)
 }
 
 void
+pp_jobs_dialog_set_callback (PpJobsDialog         *dialog,
+                             UserResponseCallback  user_callback,
+                             gpointer              user_data)
+{
+  if (dialog != NULL)
+    {
+      dialog->user_callback = user_callback;
+      dialog->user_data = user_data;
+    }
+}
+
+void
 pp_jobs_dialog_free (PpJobsDialog *dialog)
 {
   if (dialog->get_jobs_cancellable != NULL)
diff --git a/panels/printers/pp-jobs-dialog.h b/panels/printers/pp-jobs-dialog.h
index 216e5b3..408805d 100644
--- a/panels/printers/pp-jobs-dialog.h
+++ b/panels/printers/pp-jobs-dialog.h
@@ -28,12 +28,15 @@ G_BEGIN_DECLS
 
 typedef struct _PpJobsDialog PpJobsDialog;
 
-PpJobsDialog *pp_jobs_dialog_new    (GtkWindow            *parent,
-                                     UserResponseCallback  user_callback,
-                                     gpointer              user_data,
-                                     gchar                *printer_name);
-void          pp_jobs_dialog_update (PpJobsDialog         *dialog);
-void          pp_jobs_dialog_free   (PpJobsDialog         *dialog);
+PpJobsDialog *pp_jobs_dialog_new           (GtkWindow            *parent,
+                                            UserResponseCallback  user_callback,
+                                            gpointer              user_data,
+                                            gchar                *printer_name);
+void          pp_jobs_dialog_update        (PpJobsDialog         *dialog);
+void          pp_jobs_dialog_set_callback  (PpJobsDialog         *dialog,
+                                            UserResponseCallback  user_callback,
+                                            gpointer              user_data);
+void          pp_jobs_dialog_free          (PpJobsDialog         *dialog);
 
 G_END_DECLS
 
diff --git a/panels/printers/pp-options-dialog.c b/panels/printers/pp-options-dialog.c
index e96f4e7..47ea2e3 100644
--- a/panels/printers/pp-options-dialog.c
+++ b/panels/printers/pp-options-dialog.c
@@ -889,6 +889,18 @@ pp_options_dialog_new (GtkWindow            *parent,
 }
 
 void
+pp_options_dialog_set_callback (PpOptionsDialog      *dialog,
+                                UserResponseCallback  user_callback,
+                                gpointer              user_data)
+{
+  if (dialog != NULL)
+    {
+      dialog->user_callback = user_callback;
+      dialog->user_data = user_data;
+    }
+}
+
+void
 pp_options_dialog_free (PpOptionsDialog *dialog)
 {
   gtk_widget_destroy (GTK_WIDGET (dialog->dialog));
diff --git a/panels/printers/pp-options-dialog.h b/panels/printers/pp-options-dialog.h
index e88843c..5e75575 100644
--- a/panels/printers/pp-options-dialog.h
+++ b/panels/printers/pp-options-dialog.h
@@ -28,12 +28,15 @@ G_BEGIN_DECLS
 
 typedef struct _PpOptionsDialog PpOptionsDialog;
 
-PpOptionsDialog *pp_options_dialog_new  (GtkWindow            *parent,
-                                         UserResponseCallback  user_callback,
-                                         gpointer              user_data,
-                                         gchar                *printer_name,
-                                         gboolean              sensitive);
-void             pp_options_dialog_free (PpOptionsDialog      *dialog);
+PpOptionsDialog *pp_options_dialog_new          (GtkWindow            *parent,
+                                                 UserResponseCallback  user_callback,
+                                                 gpointer              user_data,
+                                                 gchar                *printer_name,
+                                                 gboolean              sensitive);
+void             pp_options_dialog_set_callback (PpOptionsDialog      *dialog,
+                                                 UserResponseCallback  user_callback,
+                                                 gpointer              user_data);
+void             pp_options_dialog_free         (PpOptionsDialog      *dialog);
 
 G_END_DECLS
 
diff --git a/panels/printers/pp-printer-entry.c b/panels/printers/pp-printer-entry.c
index a51a15b..4823924 100644
--- a/panels/printers/pp-printer-entry.c
+++ b/panels/printers/pp-printer-entry.c
@@ -338,6 +338,14 @@ details_dialog_cb (GtkDialog *dialog,
 }
 
 static void
+details_dialog_free_cb (GtkDialog *dialog,
+                        gint       response_id,
+                        gpointer   user_data)
+{
+  pp_details_dialog_free (PP_DETAILS_DIALOG (dialog));
+}
+
+static void
 on_show_printer_details_dialog (GtkButton      *button,
                                 PpPrinterEntry *self)
 {
@@ -365,6 +373,14 @@ printer_options_dialog_cb (GtkDialog *dialog,
 }
 
 static void
+printer_options_dialog_free_cb (GtkDialog *dialog,
+                                gint       response_id,
+                                gpointer   user_data)
+{
+  pp_options_dialog_free ((PpOptionsDialog *) user_data);
+}
+
+static void
 on_show_printer_options_dialog (GtkButton      *button,
                                 PpPrinterEntry *self)
 {
@@ -484,6 +500,14 @@ jobs_dialog_response_cb (GtkDialog  *dialog,
 }
 
 static void
+printer_jobs_dialog_free_cb (GtkDialog *dialog,
+                             gint       response_id,
+                             gpointer   user_data)
+{
+  pp_jobs_dialog_free ((PpJobsDialog *) user_data);
+}
+
+static void
 show_jobs_dialog (GtkButton *button,
                   gpointer   user_data)
 {
@@ -776,6 +800,18 @@ pp_printer_entry_dispose (GObject *object)
 {
   PpPrinterEntry *self = PP_PRINTER_ENTRY (object);
 
+  if (self->pp_details_dialog != NULL)
+    {
+      g_signal_handlers_disconnect_by_data (self->pp_details_dialog, self);
+      g_signal_connect (self->pp_details_dialog, "response", G_CALLBACK (details_dialog_free_cb), NULL);
+    }
+
+  if (self->pp_options_dialog != NULL)
+    pp_options_dialog_set_callback (self->pp_options_dialog, printer_options_dialog_free_cb, 
self->pp_options_dialog);
+
+  if (self->pp_jobs_dialog != NULL)
+    pp_jobs_dialog_set_callback (self->pp_jobs_dialog, printer_jobs_dialog_free_cb, self->pp_jobs_dialog);
+
   g_clear_pointer (&self->printer_name, g_free);
   g_clear_pointer (&self->printer_location, g_free);
   g_clear_pointer (&self->printer_make_and_model, g_free);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]