[gnome-control-center] Change PpPPDSelectionDialog to GtkDialog



commit c239521e9d2eecfc1270afb954fbde1df09246d3
Author: Brandon Nielsen <nielsenb jetfuse net>
Date:   Sat Dec 12 19:18:34 2020 -0600

    Change PpPPDSelectionDialog to GtkDialog
    
    The dialog is now displayed by calling gtk_dialog_run and
    gtk_window_set_transient_for in the window displaying the dialog.
    Cleanup is handled using gtk_widget_destroy.
    
    Destructors in the windows using the dialog no longer cleanup the dialog
    as it is assumed it will be either cleaned up after the response
    callback, or handled by the destroy_with_parent property set on the
    dialog itself.

 panels/printers/pp-details-dialog.c       |   8 +-
 panels/printers/pp-new-printer-dialog.c   |  22 +++--
 panels/printers/pp-ppd-selection-dialog.c | 156 ++++++++++++------------------
 panels/printers/pp-ppd-selection-dialog.h |   5 +-
 panels/printers/ppd-selection-dialog.ui   |  20 ++--
 5 files changed, 92 insertions(+), 119 deletions(-)
---
diff --git a/panels/printers/pp-details-dialog.c b/panels/printers/pp-details-dialog.c
index 8882a0f49..28b047234 100644
--- a/panels/printers/pp-details-dialog.c
+++ b/panels/printers/pp-details-dialog.c
@@ -174,7 +174,7 @@ ppd_selection_dialog_response_cb (GtkDialog *dialog,
         }
     }
 
-  g_clear_object (&self->pp_ppd_selection_dialog);
+  gtk_widget_destroy (GTK_WIDGET (self->pp_ppd_selection_dialog));
   self->pp_ppd_selection_dialog = NULL;
 }
 
@@ -231,11 +231,15 @@ select_ppd_in_dialog (PpDetailsDialog *self)
          }
 
         self->pp_ppd_selection_dialog = pp_ppd_selection_dialog_new (
-          GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))),
           self->all_ppds_list,
           manufacturer,
           ppd_selection_dialog_response_cb,
           self);
+
+        gtk_window_set_transient_for (GTK_WINDOW (self->pp_ppd_selection_dialog),
+                                      GTK_WINDOW (self));
+
+        gtk_dialog_run (GTK_DIALOG (self->pp_ppd_selection_dialog));
     }
 }
 
diff --git a/panels/printers/pp-new-printer-dialog.c b/panels/printers/pp-new-printer-dialog.c
index d26e5b7a7..4a62bf2f3 100644
--- a/panels/printers/pp-new-printer-dialog.c
+++ b/panels/printers/pp-new-printer-dialog.c
@@ -539,7 +539,6 @@ pp_new_printer_dialog_finalize (GObject *object)
   g_clear_pointer (&self->list, ppd_list_free);
   g_clear_object (&self->builder);
   g_clear_pointer (&self->local_cups_devices, g_ptr_array_unref);
-  g_clear_object (&self->ppd_selection_dialog);
   g_clear_object (&self->new_device);
   g_clear_object (&self->local_printer_icon);
   g_clear_object (&self->remote_printer_icon);
@@ -1902,15 +1901,14 @@ ppd_selection_cb (GtkDialog *_dialog,
   guint                      window_id = 0;
   gint                       acquisition_method;
 
-  if (response_id != GTK_RESPONSE_OK) {
+  if (response_id == GTK_RESPONSE_OK) {
+      ppd_name = pp_ppd_selection_dialog_get_ppd_name (self->ppd_selection_dialog);
+      ppd_display_name = pp_ppd_selection_dialog_get_ppd_display_name (self->ppd_selection_dialog);
+  }
+  else {
       emit_response (self, GTK_RESPONSE_CANCEL);
-      return;
   }
 
-  ppd_name = pp_ppd_selection_dialog_get_ppd_name (self->ppd_selection_dialog);
-  ppd_display_name = pp_ppd_selection_dialog_get_ppd_display_name (self->ppd_selection_dialog);
-  g_clear_object (&self->ppd_selection_dialog);
-
   if (ppd_name)
     {
       g_object_set (self->new_device, "device-ppd", ppd_name, NULL);
@@ -1980,6 +1978,8 @@ ppd_selection_cb (GtkDialog *_dialog,
 
       g_clear_object (&self->new_device);
     }
+
+  gtk_widget_destroy (GTK_WIDGET (self->ppd_selection_dialog));
 }
 
 static void
@@ -2018,11 +2018,15 @@ new_printer_dialog_response_cb (PpNewPrinterDialog *self,
             {
               self->new_device = pp_print_device_copy (device);
               self->ppd_selection_dialog =
-                pp_ppd_selection_dialog_new (self->parent,
-                                             self->list,
+                pp_ppd_selection_dialog_new (self->list,
                                              NULL,
                                              ppd_selection_cb,
                                              self);
+
+              gtk_window_set_transient_for (GTK_WINDOW (self->ppd_selection_dialog),
+                                            GTK_WINDOW (self->parent));
+
+              gtk_dialog_run (GTK_DIALOG (self->ppd_selection_dialog));
             }
           else
             {
diff --git a/panels/printers/pp-ppd-selection-dialog.c b/panels/printers/pp-ppd-selection-dialog.c
index f3ae05c7b..e7f110a38 100644
--- a/panels/printers/pp-ppd-selection-dialog.c
+++ b/panels/printers/pp-ppd-selection-dialog.c
@@ -49,10 +49,13 @@ enum
 
 
 struct _PpPPDSelectionDialog {
-  GObject parent_instance;
+  GtkDialog parent_instance;
 
-  GtkBuilder *builder;
-  GtkWidget  *dialog;
+  GtkButton   *ppd_selection_select_button;
+  GtkSpinner  *ppd_spinner;
+  GtkLabel    *progress_label;
+  GtkTreeView *ppd_selection_manufacturers_treeview;
+  GtkTreeView *ppd_selection_models_treeview;
 
   UserResponseCallback user_callback;
   gpointer             user_data;
@@ -64,7 +67,7 @@ struct _PpPPDSelectionDialog {
   PPDList *list;
 };
 
-G_DEFINE_TYPE (PpPPDSelectionDialog, pp_ppd_selection_dialog, G_TYPE_OBJECT)
+G_DEFINE_TYPE (PpPPDSelectionDialog, pp_ppd_selection_dialog, GTK_TYPE_DIALOG)
 
 static void
 manufacturer_selection_changed_cb (PpPPDSelectionDialog *self)
@@ -77,12 +80,12 @@ manufacturer_selection_changed_cb (PpPPDSelectionDialog *self)
   gchar        *manufacturer_name = NULL;
   gint          i, index;
 
-  treeview = GTK_TREE_VIEW (gtk_builder_get_object (self->builder, "ppd-selection-manufacturers-treeview"));
+  treeview = self->ppd_selection_manufacturers_treeview;
   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (treeview), &model, &iter))
     {
       gtk_tree_model_get (model, &iter,
-                         PPD_MANUFACTURERS_NAMES_COLUMN, &manufacturer_name,
-                         -1);
+                          PPD_MANUFACTURERS_NAMES_COLUMN, &manufacturer_name,
+                          -1);
     }
 
   if (manufacturer_name)
@@ -100,8 +103,7 @@ manufacturer_selection_changed_cb (PpPPDSelectionDialog *self)
 
       if (index >= 0)
         {
-          models_treeview = (GtkTreeView*)
-            gtk_builder_get_object (self->builder, "ppd-selection-models-treeview");
+          models_treeview = self->ppd_selection_models_treeview;
 
           store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
 
@@ -128,28 +130,27 @@ model_selection_changed_cb (PpPPDSelectionDialog *self)
   GtkTreeView  *treeview;
   GtkTreeModel *model;
   GtkTreeIter   iter;
-  GtkWidget    *widget;
+  GtkButton    *ppd_select_button;
   gchar        *model_name = NULL;
 
-  treeview = GTK_TREE_VIEW (gtk_builder_get_object (self->builder, "ppd-selection-models-treeview"));
+  treeview = self->ppd_selection_models_treeview;
   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (treeview), &model, &iter))
     {
       gtk_tree_model_get (model, &iter,
                           PPD_NAMES_COLUMN, &model_name,
-                         -1);
+                          -1);
     }
 
-  widget = (GtkWidget*)
-    gtk_builder_get_object (self->builder, "ppd-selection-select-button");
+  ppd_select_button = self->ppd_selection_select_button;
 
   if (model_name)
     {
-      gtk_widget_set_sensitive (widget, TRUE);
+      gtk_widget_set_sensitive (GTK_WIDGET (ppd_select_button), TRUE);
       g_free (model_name);
     }
   else
     {
-      gtk_widget_set_sensitive (widget, FALSE);
+      gtk_widget_set_sensitive (GTK_WIDGET (ppd_select_button), FALSE);
     }
 }
 
@@ -162,20 +163,14 @@ fill_ppds_list (PpPPDSelectionDialog *self)
   GtkTreeView      *treeview;
   GtkTreeIter       iter;
   GtkTreeIter      *preselect_iter = NULL;
-  GtkWidget        *widget;
   gint              i;
 
-  widget = (GtkWidget*)
-    gtk_builder_get_object (self->builder, "ppd-spinner");
-  gtk_widget_hide (widget);
-  gtk_spinner_stop (GTK_SPINNER (widget));
+  gtk_widget_hide (GTK_WIDGET (self->ppd_spinner));
+  gtk_spinner_stop (self->ppd_spinner);
 
-  widget = (GtkWidget*)
-    gtk_builder_get_object (self->builder, "progress-label");
-  gtk_widget_hide (widget);
+  gtk_widget_hide (GTK_WIDGET (self->progress_label));
 
-  treeview = (GtkTreeView*)
-    gtk_builder_get_object (self->builder, "ppd-selection-manufacturers-treeview");
+  treeview = self->ppd_selection_manufacturers_treeview;
 
   if (self->list)
     {
@@ -217,11 +212,9 @@ populate_dialog (PpPPDSelectionDialog *self)
   GtkCellRenderer   *renderer;
   GtkTreeView       *manufacturers_treeview;
   GtkTreeView       *models_treeview;
-  GtkWidget         *widget;
   GtkWidget         *header;
 
-  manufacturers_treeview = (GtkTreeView*)
-    gtk_builder_get_object (self->builder, "ppd-selection-manufacturers-treeview");
+  manufacturers_treeview = self->ppd_selection_manufacturers_treeview;
 
   renderer = gtk_cell_renderer_text_new ();
   gtk_cell_renderer_set_padding (renderer, 10, 0);
@@ -237,8 +230,7 @@ populate_dialog (PpPPDSelectionDialog *self)
   gtk_tree_view_append_column (manufacturers_treeview, column);
 
 
-  models_treeview = (GtkTreeView*)
-    gtk_builder_get_object (self->builder, "ppd-selection-models-treeview");
+  models_treeview = self->ppd_selection_models_treeview;
 
   renderer = gtk_cell_renderer_text_new ();
   gtk_cell_renderer_set_padding (renderer, 10, 0);
@@ -261,13 +253,12 @@ populate_dialog (PpPPDSelectionDialog *self)
   g_signal_connect_object (gtk_tree_view_get_selection (manufacturers_treeview),
                            "changed", G_CALLBACK (manufacturer_selection_changed_cb), self, 
G_CONNECT_SWAPPED);
 
-  gtk_widget_show (self->dialog);
-
   if (!self->list)
     {
-      widget = (GtkWidget*)
-        gtk_builder_get_object (self->builder, "ppd-spinner");
-      gtk_spinner_start (GTK_SPINNER (widget));
+      gtk_widget_show (GTK_WIDGET (self->ppd_spinner));
+      gtk_spinner_start (self->ppd_spinner);
+
+      gtk_widget_show (GTK_WIDGET (self->progress_label));
     }
   else
     {
@@ -284,12 +275,9 @@ ppd_selection_dialog_response_cb (PpPPDSelectionDialog *self,
   GtkTreeView      *models_treeview;
   GtkTreeIter       iter;
 
-  gtk_widget_hide (GTK_WIDGET (self->dialog));
-
   if (response_id == GTK_RESPONSE_OK)
     {
-      models_treeview = (GtkTreeView*)
-        gtk_builder_get_object (self->builder, "ppd-selection-models-treeview");
+      models_treeview = self->ppd_selection_models_treeview;
 
       if (models_treeview)
         {
@@ -302,52 +290,24 @@ ppd_selection_dialog_response_cb (PpPPDSelectionDialog *self,
                   gtk_tree_model_get (model, &iter,
                                       PPD_NAMES_COLUMN, &self->ppd_name,
                                       PPD_DISPLAY_NAMES_COLUMN, &self->ppd_display_name,
-                                 -1);
+                                      -1);
                 }
             }
         }
     }
 
-  self->user_callback (GTK_DIALOG (self->dialog), response_id, self->user_data);
+  self->user_callback (GTK_DIALOG (self), response_id, self->user_data);
 }
 
-static void
-pp_ppd_selection_dialog_finalize (GObject *object)
-{
-  PpPPDSelectionDialog *self = PP_PPD_SELECTION_DIALOG (object);
-
-  g_clear_object (&self->builder);
-  g_clear_pointer (&self->dialog, gtk_widget_destroy);
-
-  g_clear_pointer (&self->ppd_name, g_free);
-  g_clear_pointer (&self->ppd_name, g_free);
-  g_clear_pointer (&self->ppd_display_name, g_free);
-
-  G_OBJECT_CLASS (pp_ppd_selection_dialog_parent_class)->finalize (object);
-}
-
-static void
-pp_ppd_selection_dialog_class_init (PpPPDSelectionDialogClass *klass)
-{
-  GObjectClass *object_class;
-
-  object_class = G_OBJECT_CLASS (klass);
-  object_class->finalize = pp_ppd_selection_dialog_finalize;
-}
-
-
 PpPPDSelectionDialog *
-pp_ppd_selection_dialog_new (GtkWindow            *parent,
-                             PPDList              *ppd_list,
+pp_ppd_selection_dialog_new (PPDList              *ppd_list,
                              const gchar          *manufacturer,
                              UserResponseCallback  user_callback,
                              gpointer              user_data)
 {
   PpPPDSelectionDialog *self;
-  GtkWidget            *widget;
-  g_autoptr(GError)     error = NULL;
 
-  self = g_object_new (PP_TYPE_PPD_SELECTION_DIALOG, NULL);
+  self = g_object_new (pp_ppd_selection_dialog_get_type (), NULL);
 
   self->user_callback = user_callback;
   self->user_data = user_data;
@@ -356,42 +316,48 @@ pp_ppd_selection_dialog_new (GtkWindow            *parent,
 
   self->manufacturer = get_standard_manufacturers_name (manufacturer);
 
-  gtk_window_set_transient_for (GTK_WINDOW (self->dialog), GTK_WINDOW (parent));
+  /* connect signal */
+  g_signal_connect_object (self, "response", G_CALLBACK (ppd_selection_dialog_response_cb), self, 
G_CONNECT_SWAPPED);
 
-  widget = (GtkWidget*)
-    gtk_builder_get_object (self->builder, "ppd-spinner");
-  gtk_spinner_start (GTK_SPINNER (widget));
+  gtk_spinner_start (self->ppd_spinner);
 
   populate_dialog (self);
 
-  gtk_window_present (GTK_WINDOW (self->dialog));
-
-  return PP_PPD_SELECTION_DIALOG (self);
+  return self;
 }
 
 static void
-pp_ppd_selection_dialog_init (PpPPDSelectionDialog *self)
+pp_ppd_selection_dialog_dispose (GObject *object)
 {
-  g_autoptr(GError)     error = NULL;
-  gchar                *objects[] = { "ppd-selection-dialog", NULL };
-  guint                 builder_result;
+  PpPPDSelectionDialog *self = PP_PPD_SELECTION_DIALOG (object);
 
-  self->builder = gtk_builder_new ();
+  g_clear_pointer (&self->ppd_name, g_free);
+  g_clear_pointer (&self->ppd_display_name, g_free);
+  g_clear_pointer (&self->manufacturer, g_free);
 
-  builder_result = gtk_builder_add_objects_from_resource (self->builder,
-                                                          
"/org/gnome/control-center/printers/ppd-selection-dialog.ui",
-                                                          objects, &error);
+  G_OBJECT_CLASS (pp_ppd_selection_dialog_parent_class)->dispose (object);
+}
 
-  if (builder_result == 0)
-    {
-      g_warning ("Could not load ui: %s", error->message);
-    }
+void
+pp_ppd_selection_dialog_class_init (PpPPDSelectionDialogClass *klass)
+{
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+  GObjectClass   *object_class = G_OBJECT_CLASS (klass);
 
-  self->dialog = (GtkWidget *) gtk_builder_get_object (self->builder, "ppd-selection-dialog");
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/printers/ppd-selection-dialog.ui");
+  gtk_widget_class_bind_template_child (widget_class, PpPPDSelectionDialog, ppd_selection_select_button);
+  gtk_widget_class_bind_template_child (widget_class, PpPPDSelectionDialog, ppd_spinner);
+  gtk_widget_class_bind_template_child (widget_class, PpPPDSelectionDialog, progress_label);
+  gtk_widget_class_bind_template_child (widget_class, PpPPDSelectionDialog, 
ppd_selection_manufacturers_treeview);
+  gtk_widget_class_bind_template_child (widget_class, PpPPDSelectionDialog, ppd_selection_models_treeview);
 
-  /* connect signals */
-  g_signal_connect (self->dialog, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL);
-  g_signal_connect_object (self->dialog, "response", G_CALLBACK (ppd_selection_dialog_response_cb), self, 
G_CONNECT_SWAPPED);
+  object_class->dispose = pp_ppd_selection_dialog_dispose;
+}
+
+void
+pp_ppd_selection_dialog_init (PpPPDSelectionDialog *self)
+{
+  gtk_widget_init_template (GTK_WIDGET (self));
 }
 
 gchar *
diff --git a/panels/printers/pp-ppd-selection-dialog.h b/panels/printers/pp-ppd-selection-dialog.h
index 36c0342e1..5b4ee22c3 100644
--- a/panels/printers/pp-ppd-selection-dialog.h
+++ b/panels/printers/pp-ppd-selection-dialog.h
@@ -26,10 +26,9 @@
 G_BEGIN_DECLS
 
 #define PP_TYPE_PPD_SELECTION_DIALOG (pp_ppd_selection_dialog_get_type ())
-G_DECLARE_FINAL_TYPE (PpPPDSelectionDialog, pp_ppd_selection_dialog, PP, PPD_SELECTION_DIALOG, GObject)
+G_DECLARE_FINAL_TYPE (PpPPDSelectionDialog, pp_ppd_selection_dialog, PP, PPD_SELECTION_DIALOG, GtkDialog)
 
-PpPPDSelectionDialog *pp_ppd_selection_dialog_new                  (GtkWindow                 *parent,
-                                                                    PPDList                   *ppd_list,
+PpPPDSelectionDialog *pp_ppd_selection_dialog_new                  (PPDList                   *ppd_list,
                                                                     const gchar               *manufacturer,
                                                                     UserResponseCallback       user_callback,
                                                                     gpointer                   user_data);
diff --git a/panels/printers/ppd-selection-dialog.ui b/panels/printers/ppd-selection-dialog.ui
index b40a1b1ad..c89ce3563 100644
--- a/panels/printers/ppd-selection-dialog.ui
+++ b/panels/printers/ppd-selection-dialog.ui
@@ -2,7 +2,7 @@
 <!-- Generated with glade 3.18.3 -->
 <interface>
   <requires lib="gtk+" version="3.12"/>
-  <object class="GtkDialog" id="ppd-selection-dialog">
+  <template class="PpPPDSelectionDialog" parent="GtkDialog">
     <property name="width_request">600</property>
     <property name="height_request">400</property>
     <property name="can_focus">False</property>
@@ -23,7 +23,7 @@
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="ppd-selection-cancel-button">
+              <object class="GtkButton" id="ppd_selection_cancel_button">
                 <property name="label" translatable="yes">Cancel</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
@@ -36,7 +36,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="ppd-selection-select-button">
+              <object class="GtkButton" id="ppd_selection_select_button">
                 <property name="label" translatable="yes">Select</property>
                 <property name="visible">True</property>
                 <property name="sensitive">False</property>
@@ -54,7 +54,7 @@
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
                 <child>
-                  <object class="GtkSpinner" id="ppd-spinner">
+                  <object class="GtkSpinner" id="ppd_spinner">
                     <property name="visible">True</property>
                     <property name="width_request">24</property>
                     <property name="height_request">24</property>
@@ -68,7 +68,7 @@
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkLabel" id="progress-label">
+                  <object class="GtkLabel" id="progress_label">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="no_show_all">True</property>
@@ -112,7 +112,7 @@
                 <property name="hscrollbar_policy">never</property>
                 <property name="shadow_type">in</property>
                 <child>
-                  <object class="GtkTreeView" id="ppd-selection-manufacturers-treeview">
+                  <object class="GtkTreeView" id="ppd_selection_manufacturers_treeview">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <child internal-child="selection">
@@ -133,7 +133,7 @@
                 <property name="can_focus">True</property>
                 <property name="shadow_type">in</property>
                 <child>
-                  <object class="GtkTreeView" id="ppd-selection-models-treeview">
+                  <object class="GtkTreeView" id="ppd_selection_models_treeview">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <child internal-child="selection">
@@ -158,8 +158,8 @@
       </object>
     </child>
     <action-widgets>
-      <action-widget response="-6">ppd-selection-cancel-button</action-widget>
-      <action-widget response="-5">ppd-selection-select-button</action-widget>
+      <action-widget response="-6">ppd_selection_cancel_button</action-widget>
+      <action-widget response="-5">ppd_selection_select_button</action-widget>
     </action-widgets>
-  </object>
+  </template>
 </interface>


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