[gnome-control-center/wip/feborges/new-printers-panel: 21/21] printers: introduce PpDetailsDialog



commit fa1e96e4693f24886c799ef2a93e3824100bd322
Author: Felipe Borges <felipeborges gnome org>
Date:   Mon Jun 13 11:29:50 2016 +0200

    printers: introduce PpDetailsDialog
    
    This dialog handles the editing of printer properties such as
    name, location, automatic discovery of driver, manual selection
    of printer driver, and manual selection of ppd file.

 panels/printers/Makefile.am            |    2 +
 panels/printers/details-dialog.ui      |  163 ++++++++++++++
 panels/printers/pp-details-dialog.c    |  365 ++++++++++++++++++++++++++++++++
 panels/printers/pp-details-dialog.h    |   43 ++++
 panels/printers/pp-printer-entry.c     |   30 +++
 panels/printers/printer-entry.ui       |   11 +
 panels/printers/printers.gresource.xml |    1 +
 7 files changed, 615 insertions(+), 0 deletions(-)
---
diff --git a/panels/printers/Makefile.am b/panels/printers/Makefile.am
index 6163d4b..71d856b 100644
--- a/panels/printers/Makefile.am
+++ b/panels/printers/Makefile.am
@@ -42,6 +42,8 @@ libprinters_la_SOURCES =              \
        pp-options-dialog.h             \
        pp-job.c                        \
        pp-job.h                        \
+       pp-details-dialog.c             \
+       pp-details-dialog.h             \
        pp-jobs-dialog.c                \
        pp-jobs-dialog.h                \
        pp-authentication-dialog.c      \
diff --git a/panels/printers/details-dialog.ui b/panels/printers/details-dialog.ui
new file mode 100644
index 0000000..3ef919a
--- /dev/null
+++ b/panels/printers/details-dialog.ui
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface>
+  <requires lib="gtk+" version="3.12"/>
+  <object class="GtkDialog" id="details-dialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">0</property>
+    <property name="resizable">False</property>
+    <property name="modal">True</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">dialog</property>
+    <property name="use-header-bar">1</property>
+    <child internal-child="vbox">
+      <object class="GtkBox">
+        <property name="margin">20</property>
+        <property name="halign">center</property>
+        <child>
+          <object class="GtkGrid">
+            <property name="row-spacing">10</property>
+            <property name="column-spacing">10</property>
+            <child>
+              <object class="GtkLabel">
+                <property name="label" translatable="yes">Name</property>
+                <property name="halign">end</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
+              </object>
+              <packing>
+                <property name="left-attach">0</property>
+                <property name="top-attach">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="printer-name-entry">
+                <property name="halign">fill</property>
+                <property name="width_request">320</property>
+              </object>
+              <packing>
+                <property name="left-attach">1</property>
+                <property name="top-attach">0</property>
+              </packing>
+            </child>
+
+            <child>
+              <object class="GtkLabel">
+                <property name="label" translatable="yes">Location</property>
+                <property name="halign">end</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
+              </object>
+              <packing>
+                <property name="left-attach">0</property>
+                <property name="top-attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="printer-location-entry">
+                <property name="width_request">320</property>
+                <property name="halign">fill</property>
+              </object>
+              <packing>
+                <property name="left-attach">1</property>
+                <property name="top-attach">2</property>
+              </packing>
+            </child>
+
+            <child>
+              <object class="GtkLabel">
+                <property name="label" translatable="yes">Address</property>
+                <property name="halign">end</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
+              </object>
+              <packing>
+                <property name="left-attach">0</property>
+                <property name="top-attach">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="printer-address-label">
+                <property name="label">192.168.0.1</property>
+                <property name="halign">start</property>
+              </object>
+              <packing>
+                <property name="left-attach">1</property>
+                <property name="top-attach">3</property>
+              </packing>
+            </child>
+
+            <child>
+              <object class="GtkLabel">
+                <property name="label" translatable="yes">Driver</property>
+                <property name="halign">end</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
+              </object>
+              <packing>
+                <property name="left-attach">0</property>
+                <property name="top-attach">4</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="printer-model-label">
+                <property name="label">HP Inkjet Delux 9000</property>
+                <property name="halign">start</property>
+              </object>
+              <packing>
+                <property name="left-attach">1</property>
+                <property name="top-attach">4</property>
+              </packing>
+            </child>
+
+            <child>
+              <object class="GtkButtonBox">
+                <property name="orientation">vertical</property>
+                <property name="spacing">10</property>
+                <property name="halign">start</property>
+                <child>
+                  <object class="GtkButton" id="search-for-drivers-button">
+                    <property name="label" translatable="yes">Search for Drivers</property>
+                    <property name="halign">fill</property>
+                  </object>
+                </child>
+
+                <child>
+                  <object class="GtkButton" id="select-from-database-button">
+                    <property name="label" translatable="yes">Select from Database…</property>
+                    <property name="halign">fill</property>
+                  </object>
+                </child>
+
+                <child>
+                  <object class="GtkButton" id="install-ppd-button">
+                    <property name="label" translatable="yes">Install PPD File…</property>
+                    <property name="halign">fill</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="left-attach">1</property>
+                <property name="top-attach">5</property>
+              </packing>
+
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+
+  <object class="GtkSizeGroup">
+    <property name="mode">horizontal</property>
+    <widgets>
+      <widget name="search-for-drivers-button"/>
+      <widget name="select-from-database-button"/>
+      <widget name="install-ppd-button"/>
+    </widgets>
+  </object>
+</interface>
diff --git a/panels/printers/pp-details-dialog.c b/panels/printers/pp-details-dialog.c
new file mode 100644
index 0000000..a190e13
--- /dev/null
+++ b/panels/printers/pp-details-dialog.c
@@ -0,0 +1,365 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright 2016  Red Hat, Inc,
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Felipe Borges <feborges redhat com>
+ */
+
+#include "config.h"
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+#include <gtk/gtk.h>
+
+#include <cups/cups.h>
+#include <cups/ppd.h>
+
+#include "cc-editable-entry.h"
+#include "pp-details-dialog.h"
+#include "pp-ppd-selection-dialog.h"
+#include "pp-utils.h"
+
+struct _PpDetailsDialog {
+  GtkBuilder *builder;
+  GtkWidget  *parent;
+
+  GtkWidget  *dialog;
+
+  UserResponseCallback user_callback;
+  gpointer             user_data;
+
+  gchar        *printer_name;
+  gchar        *ppd_file_name;
+  PPDList      *all_ppds_list;
+  GCancellable *get_all_ppds_cancellable;
+
+  /* Dialogs */
+  PpPPDSelectionDialog *pp_ppd_selection_dialog;
+};
+
+static gboolean
+printer_name_edit_cb (GtkWidget *entry,
+                      GdkEventFocus *event,
+                      PpDetailsDialog *dialog)
+{
+  const gchar *new_name;
+
+  // FIXME: update the header bar title
+
+  new_name = gtk_entry_get_text (GTK_ENTRY (entry));
+
+  printer_rename (dialog->printer_name, new_name); // FIXME: it has to be async
+
+  dialog->printer_name = g_strdup (new_name);
+
+  return FALSE;
+}
+
+static gboolean
+printer_location_edit_cb (GtkWidget *entry,
+                          GdkEventFocus *event,
+                          PpDetailsDialog *dialog)
+{
+  const gchar             *location;
+
+  location = gtk_entry_get_text (GTK_ENTRY (entry));
+
+  // FIXME: do this async
+  // FIXME: actualize printers list
+  printer_set_location (dialog->printer_name, location);
+
+  return FALSE;
+}
+
+static void
+search_for_drivers (GtkButton       *button,
+                    PpDetailsDialog *dialog)
+{
+  g_print ("search_for_drivers\n");
+}
+
+static void
+set_ppd_cb (gchar    *printer_name,
+            gboolean  success,
+            gpointer  user_data)
+{
+  PpDetailsDialog *dialog = (PpDetailsDialog*) user_data;
+  GtkWidget *widget;
+
+  widget = (GtkWidget *) gtk_builder_get_object (dialog->builder, "printer-model-label");
+  gtk_label_set_text (GTK_LABEL (widget), dialog->ppd_file_name);
+}
+
+static void
+ppd_selection_dialog_response_cb (GtkDialog *dialog,
+                                  gint       response_id,
+                                  gpointer   user_data)
+{
+  PpDetailsDialog *self = (PpDetailsDialog*) user_data;
+
+  if (response_id == GTK_RESPONSE_OK)
+    {
+      gchar *ppd_name;
+
+      ppd_name = pp_ppd_selection_dialog_get_ppd_name (self->pp_ppd_selection_dialog);
+
+      if (self->printer_name && ppd_name)
+        {
+          GCancellable *cancellable;
+
+          cancellable = g_cancellable_new ();
+
+          printer_set_ppd_async (self->printer_name,
+                                 ppd_name,
+                                 cancellable,
+                                 set_ppd_cb,
+                                 self);
+
+          self->ppd_file_name = g_strdup (ppd_name);
+        }
+
+      g_free (ppd_name);
+    }
+
+  pp_ppd_selection_dialog_free (self->pp_ppd_selection_dialog);
+  self->pp_ppd_selection_dialog = NULL;
+}
+
+static void
+select_ppd_in_dialog (GtkButton       *button,
+                      PpDetailsDialog *self)
+{
+  gchar                  *device_id = NULL;
+  gchar                  *manufacturer = NULL;
+
+  self->ppd_file_name = g_strdup (cupsGetPPD (self->printer_name));
+
+  if (!self->pp_ppd_selection_dialog)
+    {
+      device_id =
+        get_ppd_attribute (self->ppd_file_name,
+                           "1284DeviceID");
+
+      if (device_id)
+        {
+          manufacturer = get_tag_value (device_id, "mfg");
+          if (!manufacturer)
+            manufacturer = get_tag_value (device_id, "manufacturer");
+          }
+
+        if (manufacturer == NULL)
+          {
+            manufacturer =
+              get_ppd_attribute (self->ppd_file_name,
+                                 "Manufacturer");
+          }
+
+        if (manufacturer == NULL)
+          {
+            manufacturer = g_strdup ("Raw");
+          }
+
+      self->pp_ppd_selection_dialog = pp_ppd_selection_dialog_new (
+        GTK_WINDOW (gtk_widget_get_toplevel (self->dialog)),
+        NULL,
+        manufacturer,
+        ppd_selection_dialog_response_cb,
+        self);
+
+      g_free (manufacturer);
+      g_free (device_id);
+    }
+}
+
+static void
+select_ppd_manually (GtkButton       *button,
+                     PpDetailsDialog *self)
+{
+  GtkFileFilter          *filter;
+  GtkWidget              *dialog;
+
+  dialog = gtk_file_chooser_dialog_new (_("Select PPD File"),
+                                        GTK_WINDOW (self->dialog),
+                                        GTK_FILE_CHOOSER_ACTION_OPEN,
+                                        _("_Cancel"), GTK_RESPONSE_CANCEL,
+                                        _("_Open"), GTK_RESPONSE_ACCEPT,
+                                        NULL);
+
+  filter = gtk_file_filter_new ();
+  gtk_file_filter_set_name (filter,
+    _("PostScript Printer Description files (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *.PPD.GZ)"));
+  gtk_file_filter_add_pattern (filter, "*.ppd");
+  gtk_file_filter_add_pattern (filter, "*.PPD");
+  gtk_file_filter_add_pattern (filter, "*.ppd.gz");
+  gtk_file_filter_add_pattern (filter, "*.PPD.gz");
+  gtk_file_filter_add_pattern (filter, "*.PPD.GZ");
+
+  gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter);
+
+  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+      gchar *ppd_filename;
+
+      ppd_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+
+      if (self->printer_name && ppd_filename)
+        {
+          GCancellable *cancellable;
+
+          cancellable = g_cancellable_new ();
+
+          printer_set_ppd_file_async (self->printer_name,
+                                      ppd_filename,
+                                      cancellable,
+                                      set_ppd_cb,
+                                      self);
+        }
+
+      g_free (ppd_filename);
+    }
+
+  gtk_widget_destroy (dialog);
+}
+
+static void
+get_all_ppds_async_cb (PPDList  *ppds,
+                       gpointer  user_data)
+{
+  PpDetailsDialog *self = user_data;
+
+  self->all_ppds_list = ppds;
+
+  if (self->pp_ppd_selection_dialog)
+    pp_ppd_selection_dialog_set_ppd_list (self->pp_ppd_selection_dialog,
+                                          self->all_ppds_list);
+
+  g_object_unref (self->get_all_ppds_cancellable);
+  self->get_all_ppds_cancellable = NULL;
+}
+
+PpDetailsDialog *
+pp_details_dialog_new (GtkWindow            *parent,
+                       UserResponseCallback  user_callback,
+                       gpointer              user_data,
+                       gchar                *printer_name,
+                       gchar                *printer_location,
+                       gchar                *printer_address,
+                       gchar                *printer_make_and_model,
+                       gboolean              sensitive)
+{
+  PpDetailsDialog *dialog;
+  GtkWidget       *widget;
+  GError          *error = NULL;
+  gchar           *objects[] = { "details-dialog", NULL };
+  gchar           *title;
+  gchar           *printer_url;
+  guint            builder_result;
+
+  dialog = g_new0 (PpDetailsDialog, 1);
+
+  dialog->builder = gtk_builder_new ();
+  dialog->parent = GTK_WIDGET (parent);
+
+  builder_result = gtk_builder_add_objects_from_resource (dialog->builder,
+                                                          
"/org/gnome/control-center/printers/details-dialog.ui",
+                                                          objects, &error);
+  if (builder_result == 0)
+    {
+      g_warning ("Could not load ui: %s", error->message);
+      g_error_free (error);
+      return NULL;
+    }
+
+  dialog->dialog = (GtkWidget *) gtk_builder_get_object (dialog->builder, "details-dialog");
+  dialog->user_callback = user_callback;
+  dialog->user_data = user_data;
+  dialog->printer_name = g_strdup (printer_name);
+  dialog->ppd_file_name = NULL;
+
+  title = g_strdup_printf (C_("Printer Details dialog title", "%s Details"), printer_name);
+  gtk_window_set_title (GTK_WINDOW (dialog->dialog), title);
+
+  widget = (GtkWidget *) gtk_builder_get_object (dialog->builder, "printer-address-label");
+  printer_url = g_strdup_printf ("<a href=\"http://%s\";>%s</a>", printer_address, printer_address);
+  gtk_label_set_markup (GTK_LABEL (widget), printer_url);
+  g_free (printer_url);
+
+  /* connect signals */
+  widget = (GtkWidget *) gtk_builder_get_object (dialog->builder, "printer-name-entry");
+  gtk_entry_set_text (GTK_ENTRY (widget), printer_name);
+  g_signal_connect (widget, "focus-out-event", G_CALLBACK (printer_name_edit_cb), dialog);
+
+  widget = (GtkWidget *) gtk_builder_get_object (dialog->builder, "printer-location-entry");
+  gtk_entry_set_text (GTK_ENTRY (widget), printer_location);
+  g_signal_connect (widget, "focus-out-event", G_CALLBACK (printer_location_edit_cb), dialog);
+
+  widget = (GtkWidget *) gtk_builder_get_object (dialog->builder, "printer-model-label");
+  gtk_label_set_text (GTK_LABEL (widget), printer_make_and_model);
+
+  widget = (GtkWidget *) gtk_builder_get_object (dialog->builder, "search-for-drivers-button");
+  g_signal_connect (widget, "clicked", G_CALLBACK (search_for_drivers), dialog);
+
+  widget = (GtkWidget *) gtk_builder_get_object (dialog->builder, "select-from-database-button");
+  g_signal_connect (widget, "clicked", G_CALLBACK (select_ppd_in_dialog), dialog);
+
+  widget = (GtkWidget *) gtk_builder_get_object (dialog->builder, "install-ppd-button");
+  g_signal_connect (widget, "clicked", G_CALLBACK (select_ppd_manually), dialog);
+
+  gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog), GTK_WINDOW (parent));
+  gtk_widget_show_all (GTK_WIDGET (dialog->dialog));
+
+  if (dialog->all_ppds_list == NULL)
+    {
+      dialog->get_all_ppds_cancellable = g_cancellable_new ();
+      get_all_ppds_async (dialog->get_all_ppds_cancellable, get_all_ppds_async_cb, dialog);
+    }
+
+  return dialog;
+}
+
+void
+pp_details_dialog_free (PpDetailsDialog *dialog)
+{
+  gtk_widget_destroy (GTK_WIDGET (dialog->dialog));
+  dialog->dialog = NULL;
+
+  g_object_unref (dialog->builder);
+  dialog->builder = NULL;
+
+  g_free (dialog->printer_name);
+  dialog->printer_name = NULL;
+
+  if (dialog->all_ppds_list)
+    {
+      ppd_list_free (dialog->all_ppds_list);
+      dialog->all_ppds_list = NULL;
+    }
+
+  if (dialog->get_all_ppds_cancellable)
+    {
+      g_cancellable_cancel (dialog->get_all_ppds_cancellable);
+      g_object_unref (dialog->get_all_ppds_cancellable);
+      dialog->get_all_ppds_cancellable = NULL;
+    }
+
+  g_free (dialog);
+}
diff --git a/panels/printers/pp-details-dialog.h b/panels/printers/pp-details-dialog.h
new file mode 100644
index 0000000..5d9d10a
--- /dev/null
+++ b/panels/printers/pp-details-dialog.h
@@ -0,0 +1,43 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright 2016  Red Hat, Inc,
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Felipe Borges <feborges redhat com>
+ */
+
+#ifndef __PP_DETAILS_DIALOG_H__
+#define __PP_DETAILS_DIALOG_H__
+
+#include <gtk/gtk.h>
+#include "pp-utils.h"
+
+G_BEGIN_DECLS
+
+typedef struct _PpDetailsDialog PpDetailsDialog;
+
+PpDetailsDialog *pp_details_dialog_new  (GtkWindow            *parent,
+                                         UserResponseCallback  user_callback,
+                                         gpointer              user_data,
+                                         gchar                *printer_name,
+                                         gchar                *printer_location,
+                                         gchar                *printer_address,
+                                         gchar                *printer_make_and_model,
+                                         gboolean              sensitive);
+void             pp_details_dialog_free (PpDetailsDialog      *dialog);
+
+G_END_DECLS
+
+#endif
diff --git a/panels/printers/pp-printer-entry.c b/panels/printers/pp-printer-entry.c
index be8c403..cc817af 100644
--- a/panels/printers/pp-printer-entry.c
+++ b/panels/printers/pp-printer-entry.c
@@ -24,6 +24,7 @@
 #include <glib/gi18n-lib.h>
 #include <glib/gstdio.h>
 
+#include "pp-details-dialog.h"
 #include "pp-options-dialog.h"
 #include "pp-jobs-dialog.h"
 #include "pp-utils.h"
@@ -56,6 +57,7 @@ struct _PpPrinterEntry
   GtkCheckButton *printer_default_checkbutton;
 
   /* Dialogs */
+  PpDetailsDialog *pp_details_dialog;
   PpOptionsDialog *pp_options_dialog;
   PpJobsDialog    *pp_jobs_dialog;
 };
@@ -262,6 +264,32 @@ supply_levels_draw_cb (GtkWidget   *widget,
 }
 
 static void
+details_dialog_cb (GtkDialog  *dialog,
+                  gint        response_id,
+                  gpointer    user_data)
+{
+  PpPrinterEntry *self = PP_PRINTER_ENTRY (user_data);
+
+  pp_details_dialog_free (self->pp_details_dialog);
+  self->pp_details_dialog = NULL;
+}
+
+static void
+on_show_printer_details_dialog (GtkButton      *button,
+                               PpPrinterEntry *self)
+{
+  self->pp_details_dialog = pp_details_dialog_new (
+    GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))),
+    details_dialog_cb,
+    self,
+    self->printer_name,
+    self->printer_location,
+    self->printer_hostname,
+    self->printer_make_and_model,
+    TRUE);
+}
+
+static void
 printer_options_dialog_cb (GtkDialog *dialog,
                         gint       response_id,
                         gpointer   user_data)
@@ -483,6 +511,7 @@ pp_printer_entry_new (cups_dest_t  printer)
 
   update_jobs_count (self);
 
+  self->pp_details_dialog = NULL;
   self->pp_options_dialog = NULL;
   self->pp_jobs_dialog = NULL;
 
@@ -510,6 +539,7 @@ pp_printer_entry_class_init (PpPrinterEntryClass *klass)
   gtk_widget_class_bind_template_child (widget_class, PpPrinterEntry, printer_default_checkbutton);
   gtk_widget_class_bind_template_child (widget_class, PpPrinterEntry, show_jobs_dialog_button);
 
+  gtk_widget_class_bind_template_callback (widget_class, on_show_printer_details_dialog);
   gtk_widget_class_bind_template_callback (widget_class, on_show_printer_options_dialog);
   gtk_widget_class_bind_template_callback (widget_class, set_as_default_printer);
   gtk_widget_class_bind_template_callback (widget_class, remove_printer);
diff --git a/panels/printers/printer-entry.ui b/panels/printers/printer-entry.ui
index 4ac3b35..e6f5592 100644
--- a/panels/printers/printer-entry.ui
+++ b/panels/printers/printer-entry.ui
@@ -18,6 +18,17 @@
           </packing>
         </child>
         <child>
+          <object class="GtkModelButton">
+            <property name="visible">True</property>
+           <property name="text" translatable="yes">Printer Details</property>
+           <signal name="clicked" handler="on_show_printer_details_dialog"/>
+         </object>
+          <packing>
+            <property name="left-attach">1</property>
+            <property name="top-attach">1</property>
+          </packing>
+        </child>
+        <child>
           <object class="GtkCheckButton" id="printer_default_checkbutton">
             <property name="visible">True</property>
             <property name="valign">center</property>
diff --git a/panels/printers/printers.gresource.xml b/panels/printers/printers.gresource.xml
index 68d9a29..ae0c7fa 100644
--- a/panels/printers/printers.gresource.xml
+++ b/panels/printers/printers.gresource.xml
@@ -4,6 +4,7 @@
     <file preprocess="xml-stripblanks">authentication-dialog.ui</file>
     <file preprocess="xml-stripblanks">jobs-dialog.ui</file>
     <file preprocess="xml-stripblanks">new-printer-dialog.ui</file>
+    <file preprocess="xml-stripblanks">details-dialog.ui</file>
     <file preprocess="xml-stripblanks">options-dialog.ui</file>
     <file preprocess="xml-stripblanks">ppd-selection-dialog.ui</file>
     <file preprocess="xml-stripblanks">printer-entry.ui</file>


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