diff options
author | Felipe Borges <felipeborges@gnome.org> | 2017-01-23 12:30:10 +0100 |
---|---|---|
committer | Felipe Borges <felipeborges@gnome.org> | 2017-02-13 19:40:09 +0100 |
commit | 7e3d89e13a0b1771ab2f26e75d231ec13fb98c8b (patch) | |
tree | 2de998f8ee72e48a5f24034a099a3a35031f8443 | |
parent | 37e37961e5577da0b4fbff78c4d2a03fa7618779 (diff) | |
download | gnome-control-center-7e3d89e13a0b1771ab2f26e75d231ec13fb98c8b.tar.gz |
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.
https://bugzilla.gnome.org/show_bug.cgi?id=767600
-rw-r--r-- | panels/printers/Makefile.am | 2 | ||||
-rw-r--r-- | panels/printers/cc-printers-panel.c | 2 | ||||
-rw-r--r-- | panels/printers/details-dialog.ui | 200 | ||||
-rw-r--r-- | panels/printers/pp-details-dialog.c | 447 | ||||
-rw-r--r-- | panels/printers/pp-details-dialog.h | 47 | ||||
-rw-r--r-- | panels/printers/pp-printer-entry.c | 32 | ||||
-rw-r--r-- | panels/printers/printer-entry.ui | 11 | ||||
-rw-r--r-- | panels/printers/printers.gresource.xml | 1 |
8 files changed, 741 insertions, 1 deletions
diff --git a/panels/printers/Makefile.am b/panels/printers/Makefile.am index 229149c54..575cda38c 100644 --- a/panels/printers/Makefile.am +++ b/panels/printers/Makefile.am @@ -45,6 +45,8 @@ libprinters_la_SOURCES = \ pp-job.h \ pp-jobs-dialog.c \ pp-jobs-dialog.h \ + pp-details-dialog.c \ + pp-details-dialog.h \ pp-samba.c \ pp-samba.h \ pp-print-device.c \ diff --git a/panels/printers/cc-printers-panel.c b/panels/printers/cc-printers-panel.c index c41182f8c..9a17682cf 100644 --- a/panels/printers/cc-printers-panel.c +++ b/panels/printers/cc-printers-panel.c @@ -525,7 +525,7 @@ enum static void on_printer_changed (PpPrinterEntry *printer_entry, - gpointer user_data) + gpointer user_data) { actualize_printers_list (user_data); } diff --git a/panels/printers/details-dialog.ui b/panels/printers/details-dialog.ui new file mode 100644 index 000000000..c90a2368f --- /dev/null +++ b/panels/printers/details-dialog.ui @@ -0,0 +1,200 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.18.3 --> +<interface> + <requires lib="gtk+" version="3.12"/> + <template class="PpDetailsDialog" parent="GtkDialog"> + <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> + <signal name="response" handler="printer_name_edit_cb" swapped="yes"/> + <signal name="response" handler="printer_location_edit_cb" swapped="yes"/> + <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> + <signal name="focus-out-event" handler="printer_name_edit_cb"/> + <signal name="changed" handler="printer_name_changed"/> + </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">1</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="printer_location_entry"> + <property name="width_request">320</property> + <property name="halign">fill</property> + <signal name="focus-out-event" handler="printer_location_edit_cb"/> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</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">2</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">2</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">3</property> + </packing> + </child> + <child> + <object class="GtkStack" id="printer_model_stack"> + <property name="halign">start</property> + <child> + <object class="GtkLabel" id="printer_model_label"> + <property name="halign">start</property> + <property name="label">HP Inkjet Delux 9000</property> + </object> + <packing> + <property name="name">printer_model_label</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="halign">start</property> + <property name="spacing">5</property> + <child> + <object class="GtkSpinner"> + <property name="active">True</property> + <property name="halign">start</property> + </object> + </child> + <child> + <object class="GtkLabel"> + <property name="halign">start</property> + <property name="label" translatable="yes">Searching for preferred drivers…</property> + </object> + </child> + </object> + <packing> + <property name="name">loading</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</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> + <signal name="clicked" handler="search_for_drivers"/> + </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> + <signal name="clicked" handler="select_ppd_in_dialog"/> + </object> + </child> + + <child> + <object class="GtkButton" id="install_ppd_button"> + <property name="label" translatable="yes">Install PPD File…</property> + <property name="halign">fill</property> + <signal name="clicked" handler="select_ppd_manually"/> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">4</property> + </packing> + + </child> + </object> + </child> + </object> + </child> + </template> + + <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 000000000..e530713d0 --- /dev/null +++ b/panels/printers/pp-details-dialog.c @@ -0,0 +1,447 @@ +/* -*- 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 { + GtkDialog parent; + + GtkEntry *printer_name_entry; + GtkEntry *printer_location_entry; + GtkLabel *printer_address_label; + GtkLabel *printer_model_label; + GtkStack *printer_model_stack; + GtkWidget *search_for_drivers_button; + + gchar *printer_name; + gchar *printer_location; + gchar *ppd_file_name; + PPDList *all_ppds_list; + GCancellable *get_all_ppds_cancellable; + GCancellable *get_ppd_names_cancellable; + + /* Dialogs */ + PpPPDSelectionDialog *pp_ppd_selection_dialog; +}; + +struct _PpDetailsDialogClass +{ + GtkDialogClass parent_class; +}; + +G_DEFINE_TYPE (PpDetailsDialog, pp_details_dialog, GTK_TYPE_DIALOG); + +static gboolean +printer_name_edit_cb (GtkWidget *entry, + GdkEventFocus *event, + PpDetailsDialog *self) +{ + const gchar *new_name; + + new_name = gtk_entry_get_text (GTK_ENTRY (self->printer_name_entry)); + if (g_strcmp0 (self->printer_name, new_name) != 0) + { + printer_rename (self->printer_name, new_name); + + self->printer_name = g_strdup (new_name); + } + + return FALSE; +} + +static void +printer_name_changed (GtkEditable *editable, + gpointer user_data) +{ + PpDetailsDialog *self = (PpDetailsDialog *) user_data; + GtkWidget *widget; + const gchar *name; + gchar *title; + + name = gtk_entry_get_text (GTK_ENTRY (self->printer_name_entry)); + + /* Translators: This is the title of the dialog. %s is the printer name. */ + title = g_strdup_printf (_("%s Details"), name); + + widget = gtk_dialog_get_header_bar (GTK_DIALOG (self)); + gtk_header_bar_set_title (GTK_HEADER_BAR (widget), title); + + g_free (title); +} + +static gboolean +printer_location_edit_cb (GtkWidget *entry, + GdkEventFocus *event, + PpDetailsDialog *self) +{ + const gchar *location; + + location = gtk_entry_get_text (GTK_ENTRY (self->printer_location_entry)); + if (g_strcmp0 (self->printer_location, location) != 0) + { + printer_set_location (self->printer_name, location); + + self->printer_location = g_strdup (location); + } + + return FALSE; +} + +static void +ppd_names_free (gpointer user_data) +{ + PPDName **names = (PPDName **) user_data; + gint i; + + if (names) + { + for (i = 0; names[i]; i++) + { + g_free (names[i]->ppd_name); + g_free (names[i]->ppd_display_name); + g_free (names[i]); + } + + g_free (names); + } +} + +static void set_ppd_cb (gchar *printer_name, gboolean success, gpointer user_data); + +static void +get_ppd_names_cb (PPDName **names, + const gchar *printer_name, + gboolean cancelled, + gpointer user_data) +{ + PpDetailsDialog *self = (PpDetailsDialog*) user_data; + + if (!cancelled) + { + if (names != NULL) + { + gtk_label_set_text (self->printer_model_label, names[0]->ppd_display_name); + printer_set_ppd_async (printer_name, + names[0]->ppd_name, + self->get_ppd_names_cancellable, + set_ppd_cb, + self); + ppd_names_free (names); + } + else + { + gtk_label_set_text (self->printer_model_label, _("No suitable driver found")); + } + + gtk_stack_set_visible_child_name (self->printer_model_stack, "printer_model_label"); + } +} + +static void +search_for_drivers (GtkButton *button, + PpDetailsDialog *self) +{ + gtk_stack_set_visible_child_name (self->printer_model_stack, "loading"); + gtk_widget_set_sensitive (self->search_for_drivers_button, FALSE); + + self->get_ppd_names_cancellable = g_cancellable_new (); + get_ppd_names_async (self->printer_name, + 1, + self->get_ppd_names_cancellable, + get_ppd_names_cb, + self); +} + +static void +set_ppd_cb (gchar *printer_name, + gboolean success, + gpointer user_data) +{ + PpDetailsDialog *self = (PpDetailsDialog*) user_data; + + gtk_label_set_text (GTK_LABEL (self->printer_model_label), self->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); + + g_clear_pointer (&self->ppd_file_name, g_free); + 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 +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; +} + +static void +select_ppd_in_dialog (GtkButton *button, + PpDetailsDialog *self) +{ + gchar *device_id = NULL; + gchar *manufacturer = NULL; + + g_clear_pointer (&self->ppd_file_name, g_free); + 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"); + } + + if (self->all_ppds_list == NULL) + { + self->get_all_ppds_cancellable = g_cancellable_new (); + get_all_ppds_async (self->get_all_ppds_cancellable, get_all_ppds_async_cb, 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); + + 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), + 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) + { + printer_set_ppd_file_async (self->printer_name, + ppd_filename, + NULL, + set_ppd_cb, + self); + } + + g_free (ppd_filename); + } + + gtk_widget_destroy (dialog); +} + +static void +pp_details_dialog_init (PpDetailsDialog *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +static void +pp_details_dialog_class_init (PpDetailsDialogClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/printers/details-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, PpDetailsDialog, printer_name_entry); + gtk_widget_class_bind_template_child (widget_class, PpDetailsDialog, printer_location_entry); + gtk_widget_class_bind_template_child (widget_class, PpDetailsDialog, printer_address_label); + gtk_widget_class_bind_template_child (widget_class, PpDetailsDialog, printer_model_label); + gtk_widget_class_bind_template_child (widget_class, PpDetailsDialog, printer_model_stack); + gtk_widget_class_bind_template_child (widget_class, PpDetailsDialog, search_for_drivers_button); + + gtk_widget_class_bind_template_callback (widget_class, printer_name_edit_cb); + gtk_widget_class_bind_template_callback (widget_class, printer_name_changed); + gtk_widget_class_bind_template_callback (widget_class, printer_location_edit_cb); + gtk_widget_class_bind_template_callback (widget_class, search_for_drivers); + gtk_widget_class_bind_template_callback (widget_class, select_ppd_in_dialog); + gtk_widget_class_bind_template_callback (widget_class, select_ppd_manually); +} + +PpDetailsDialog * +pp_details_dialog_new (GtkWindow *parent, + gchar *printer_name, + gchar *printer_location, + gchar *printer_address, + gchar *printer_make_and_model, + gboolean sensitive) +{ + PpDetailsDialog *self; + gchar *title; + gchar *printer_url; + + self = g_object_new (PP_DETAILS_DIALOG_TYPE, + "transient-for", parent, + "use-header-bar", TRUE, + NULL); + + self->printer_name = g_strdup (printer_name); + self->printer_location = g_strdup (printer_location); + self->ppd_file_name = NULL; + + /* Translators: This is the title of the dialog. %s is the printer name. */ + title = g_strdup_printf (_("%s Details"), printer_name); + gtk_window_set_title (GTK_WINDOW (self), title); + + printer_url = g_strdup_printf ("<a href=\"http://%s:%d\">%s</a>", printer_address, ippPort (), printer_address); + gtk_label_set_markup (GTK_LABEL (self->printer_address_label), printer_url); + g_free (printer_url); + + gtk_entry_set_text (GTK_ENTRY (self->printer_name_entry), printer_name); + gtk_entry_set_text (GTK_ENTRY (self->printer_location_entry), printer_location); + gtk_label_set_text (GTK_LABEL (self->printer_model_label), printer_make_and_model); + + gtk_widget_set_sensitive (gtk_dialog_get_content_area (GTK_DIALOG (self)), sensitive); + + return self; +} + +void +pp_details_dialog_free (PpDetailsDialog *self) +{ + if (self != NULL) + { + g_clear_pointer (&self->printer_name, g_free); + g_clear_pointer (&self->printer_location, g_free); + g_clear_pointer (&self->ppd_file_name, g_free); + + if (self->all_ppds_list != NULL) + { + ppd_list_free (self->all_ppds_list); + self->all_ppds_list = NULL; + } + + if (self->get_all_ppds_cancellable != NULL) + { + g_cancellable_cancel (self->get_all_ppds_cancellable); + g_clear_object (&self->get_all_ppds_cancellable); + } + + if (self->get_ppd_names_cancellable != NULL) + { + g_cancellable_cancel (self->get_ppd_names_cancellable); + g_object_unref (self->get_ppd_names_cancellable); + self->get_ppd_names_cancellable = NULL; + } + + gtk_widget_destroy (GTK_WIDGET (self)); + } +} diff --git a/panels/printers/pp-details-dialog.h b/panels/printers/pp-details-dialog.h new file mode 100644 index 000000000..266ce5afe --- /dev/null +++ b/panels/printers/pp-details-dialog.h @@ -0,0 +1,47 @@ +/* -*- 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 + +#define PP_DETAILS_DIALOG_TYPE (pp_details_dialog_get_type ()) +#define PP_DETAILS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PP_DETAILS_DIALOG_TYPE, PpDetailsDialog)) + +typedef struct _PpDetailsDialog PpDetailsDialog; +typedef struct _PpDetailsDialogClass PpDetailsDialogClass; + +GType pp_details_dialog_get_type (void); + +PpDetailsDialog *pp_details_dialog_new (GtkWindow *parent, + 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 94d2acc34..7b76d72e0 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" @@ -61,6 +62,7 @@ struct _PpPrinterEntry GtkLabel *error_status; /* Dialogs */ + PpDetailsDialog *pp_details_dialog; PpOptionsDialog *pp_options_dialog; PpJobsDialog *pp_jobs_dialog; }; @@ -283,6 +285,35 @@ 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; + + g_signal_emit_by_name (self, "printer-changed"); +} + +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))), + self->printer_name, + self->printer_location, + self->printer_hostname, + self->printer_make_and_model, + self->is_authorized); + + g_signal_connect (self->pp_details_dialog, "response", G_CALLBACK (details_dialog_cb), self); + gtk_widget_show_all (GTK_WIDGET (self->pp_details_dialog)); +} + +static void printer_options_dialog_cb (GtkDialog *dialog, gint response_id, gpointer user_data) @@ -685,6 +716,7 @@ pp_printer_entry_class_init (PpPrinterEntryClass *klass) gtk_widget_class_bind_template_child (widget_class, PpPrinterEntry, error_status); gtk_widget_class_bind_template_child (widget_class, PpPrinterEntry, printer_error); + 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 1716de146..31cbc82aa 100644 --- a/panels/printers/printer-entry.ui +++ b/panels/printers/printer-entry.ui @@ -21,6 +21,17 @@ </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 68d9a29b3..ae0c7fa3d 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> |