summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Borges <felipeborges@gnome.org>2017-03-13 09:16:29 +0100
committerFelipe Borges <felipeborges@gnome.org>2017-03-13 12:47:18 +0100
commit58270a2c76328b6a2b96325c3764cfe60241bf10 (patch)
treea479c9dc985b83dd97a04c37c32251ebe7c8bc39
parent4bc4d8fb2d8e3537640584e2340524d7285b7b9d (diff)
downloadgnome-control-center-58270a2c76328b6a2b96325c3764cfe60241bf10.tar.gz
printers: Make the dialogs independent of the PpPrinterEntry lifetime
https://bugzilla.gnome.org/show_bug.cgi?id=779846
-rw-r--r--panels/printers/pp-jobs-dialog.c12
-rw-r--r--panels/printers/pp-jobs-dialog.h15
-rw-r--r--panels/printers/pp-options-dialog.c12
-rw-r--r--panels/printers/pp-options-dialog.h15
-rw-r--r--panels/printers/pp-printer-entry.c36
5 files changed, 78 insertions, 12 deletions
diff --git a/panels/printers/pp-jobs-dialog.c b/panels/printers/pp-jobs-dialog.c
index f821920cc..6971256c4 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 216e5b372..408805de7 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 e96f4e745..47ea2e34b 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 e88843c0f..5e7557560 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 a51a15b5e..482392475 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);