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.
This commit is contained in:
parent
c86d1c09c8
commit
c239521e9d
5 changed files with 97 additions and 124 deletions
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,14 +1901,13 @@ ppd_selection_cb (GtkDialog *_dialog,
|
|||
guint window_id = 0;
|
||||
gint acquisition_method;
|
||||
|
||||
if (response_id != GTK_RESPONSE_OK) {
|
||||
emit_response (self, GTK_RESPONSE_CANCEL);
|
||||
return;
|
||||
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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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_dispose (GObject *object)
|
||||
{
|
||||
PpPPDSelectionDialog *self = PP_PPD_SELECTION_DIALOG (object);
|
||||
|
||||
g_clear_pointer (&self->ppd_name, g_free);
|
||||
g_clear_pointer (&self->ppd_display_name, g_free);
|
||||
g_clear_pointer (&self->manufacturer, g_free);
|
||||
|
||||
G_OBJECT_CLASS (pp_ppd_selection_dialog_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
void
|
||||
pp_ppd_selection_dialog_class_init (PpPPDSelectionDialogClass *klass)
|
||||
{
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
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);
|
||||
|
||||
object_class->dispose = pp_ppd_selection_dialog_dispose;
|
||||
}
|
||||
|
||||
void
|
||||
pp_ppd_selection_dialog_init (PpPPDSelectionDialog *self)
|
||||
{
|
||||
g_autoptr(GError) error = NULL;
|
||||
gchar *objects[] = { "ppd-selection-dialog", NULL };
|
||||
guint builder_result;
|
||||
|
||||
self->builder = gtk_builder_new ();
|
||||
|
||||
builder_result = gtk_builder_add_objects_from_resource (self->builder,
|
||||
"/org/gnome/control-center/printers/ppd-selection-dialog.ui",
|
||||
objects, &error);
|
||||
|
||||
if (builder_result == 0)
|
||||
{
|
||||
g_warning ("Could not load ui: %s", error->message);
|
||||
}
|
||||
|
||||
self->dialog = (GtkWidget *) gtk_builder_get_object (self->builder, "ppd-selection-dialog");
|
||||
|
||||
/* 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);
|
||||
gtk_widget_init_template (GTK_WIDGET (self));
|
||||
}
|
||||
|
||||
gchar *
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue