diff options
author | Mario Sanchez Prada <mario@endlessm.com> | 2016-04-29 12:05:21 +0100 |
---|---|---|
committer | Mario Sanchez Prada <mario@endlessm.com> | 2017-02-17 13:42:45 +0000 |
commit | e2c49b02310293c7b69b37ffee5e68f405ce4ef5 (patch) | |
tree | 193cf1c7012545a99e5daa1deee53ffc0b396cf3 | |
parent | 0d66080a32c804073c8603512b06200a309edaba (diff) | |
download | gnome-control-center-wip/msanchez/printers-clean-heads.tar.gz |
printers: Expose the newly added 'Clean' maintenance command to userswip/msanchez/printers-clean-heads
Add an extra button "Clean Print Heads" that will be shown when the relevant
maintenance command is available for a printer, to bring this feature back.
Additionally, this commit adds a 'parameters' attribute to PpMaintenanceCommand,
which is needed as the "Clean" command requires to at least be passed "all" as
its single parameter: https://www.cups.org/doc/spec-command.html#Clean
https://bugzilla.gnome.org/show_bug.cgi?id=764620
-rw-r--r-- | panels/printers/pp-maintenance-command.c | 24 | ||||
-rw-r--r-- | panels/printers/pp-maintenance-command.h | 1 | ||||
-rw-r--r-- | panels/printers/pp-new-printer.c | 1 | ||||
-rw-r--r-- | panels/printers/pp-printer-entry.c | 95 | ||||
-rw-r--r-- | panels/printers/printer-entry.ui | 14 |
5 files changed, 132 insertions, 3 deletions
diff --git a/panels/printers/pp-maintenance-command.c b/panels/printers/pp-maintenance-command.c index 2b0b86479..e7073146b 100644 --- a/panels/printers/pp-maintenance-command.c +++ b/panels/printers/pp-maintenance-command.c @@ -39,6 +39,7 @@ struct _PpMaintenanceCommandPrivate { gchar *printer_name; gchar *command; + gchar *parameters; gchar *title; }; @@ -48,6 +49,7 @@ enum { PROP_0 = 0, PROP_PRINTER_NAME, PROP_COMMAND, + PROP_PARAMETERS, PROP_TITLE }; @@ -60,6 +62,7 @@ pp_maintenance_command_finalize (GObject *object) g_clear_pointer (&priv->printer_name, g_free); g_clear_pointer (&priv->command, g_free); + g_clear_pointer (&priv->parameters, g_free); g_clear_pointer (&priv->title, g_free); G_OBJECT_CLASS (pp_maintenance_command_parent_class)->finalize (object); @@ -83,6 +86,9 @@ pp_maintenance_command_get_property (GObject *object, case PROP_COMMAND: g_value_set_string (value, self->priv->command); break; + case PROP_PARAMETERS: + g_value_set_string (value, self->priv->parameters); + break; case PROP_TITLE: g_value_set_string (value, self->priv->title); break; @@ -112,6 +118,10 @@ pp_maintenance_command_set_property (GObject *object, g_free (self->priv->command); self->priv->command = g_value_dup_string (value); break; + case PROP_PARAMETERS: + g_free (self->priv->parameters); + self->priv->parameters = g_value_dup_string (value); + break; case PROP_TITLE: g_free (self->priv->title); self->priv->title = g_value_dup_string (value); @@ -149,6 +159,13 @@ pp_maintenance_command_class_init (PpMaintenanceCommandClass *klass) NULL, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_PARAMETERS, + g_param_spec_string ("parameters", + "Optional parameters", + "Optional parameters for the maintenance command", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_TITLE, g_param_spec_string ("title", "Command title", @@ -168,11 +185,13 @@ pp_maintenance_command_init (PpMaintenanceCommand *command) PpMaintenanceCommand * pp_maintenance_command_new (const gchar *printer_name, const gchar *command, + const gchar *parameters, const gchar *title) { return g_object_new (PP_TYPE_MAINTENANCE_COMMAND, "printer-name", printer_name, "command", command, + "parameters", parameters, "title", title, NULL); } @@ -219,7 +238,10 @@ _pp_maintenance_command_execute_thread (GTask *task, file = fdopen (fd, "w"); fprintf (file, "#CUPS-COMMAND\n"); - fprintf (file, "%s\n", priv->command); + fprintf (file, "%s", priv->command); + if (priv->parameters) + fprintf (file, " %s", priv->parameters); + fprintf (file, "\n"); fclose (file); response = cupsDoFileRequest (CUPS_HTTP_DEFAULT, request, "/", file_name); diff --git a/panels/printers/pp-maintenance-command.h b/panels/printers/pp-maintenance-command.h index cf9a44e9f..5069a0120 100644 --- a/panels/printers/pp-maintenance-command.h +++ b/panels/printers/pp-maintenance-command.h @@ -52,6 +52,7 @@ GType pp_maintenance_command_get_type (void) G_GNUC_C PpMaintenanceCommand *pp_maintenance_command_new (const gchar *printer_name, const gchar *command, + const gchar *parameters, const gchar *title); void pp_maintenance_command_execute_async (PpMaintenanceCommand *command, diff --git a/panels/printers/pp-new-printer.c b/panels/printers/pp-new-printer.c index d84cc1ff3..cc0d259ab 100644 --- a/panels/printers/pp-new-printer.c +++ b/panels/printers/pp-new-printer.c @@ -1315,6 +1315,7 @@ printer_configure_async (PpNewPrinter *new_printer) PpMaintenanceCommand *command; command = pp_maintenance_command_new (priv->name, "autoconfigure", + NULL, /* Translators: Name of job which makes printer to autoconfigure itself */ _("Automatic configuration")); diff --git a/panels/printers/pp-printer-entry.c b/panels/printers/pp-printer-entry.c index 7b76d72e0..45303a95a 100644 --- a/panels/printers/pp-printer-entry.c +++ b/panels/printers/pp-printer-entry.c @@ -25,6 +25,7 @@ #include <glib/gstdio.h> #include "pp-details-dialog.h" +#include "pp-maintenance-command.h" #include "pp-options-dialog.h" #include "pp-jobs-dialog.h" #include "pp-utils.h" @@ -46,6 +47,10 @@ struct _PpPrinterEntry gboolean is_authorized; gint printer_state; + /* Maintenance commands */ + PpMaintenanceCommand *clean_command; + GCancellable *check_clean_heads_cancellable; + /* Widgets */ GtkImage *printer_icon; GtkLabel *printer_status; @@ -56,6 +61,7 @@ struct _PpPrinterEntry GtkLabel *printer_location_address_label; GtkDrawingArea *supply_drawing_area; GtkWidget *show_jobs_dialog_button; + GtkWidget *clean_heads_menuitem; GtkCheckButton *printer_default_checkbutton; GtkModelButton *remove_printer_menuitem; GtkBox *printer_error; @@ -346,6 +352,79 @@ set_as_default_printer (GtkToggleButton *button, } static void +check_clean_heads_maintenance_command_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + PpMaintenanceCommand *command = (PpMaintenanceCommand *) source_object; + gboolean is_supported = FALSE; + GError *error = NULL; + + is_supported = pp_maintenance_command_is_supported_finish (command, res, &error); + if (error != NULL) + { + g_debug ("Could not check 'Clean' maintenance command: %s", error->message); + g_error_free (error); + goto out; + } + + if (is_supported) + { + PpPrinterEntry *self = PP_PRINTER_ENTRY (user_data); + gtk_widget_show (GTK_WIDGET (self->clean_heads_menuitem)); + } + + out: + g_object_unref (source_object); +} + +static void +check_clean_heads_maintenance_command (PpPrinterEntry *self) +{ + if (self->clean_command == NULL) + return; + + g_object_ref (self->clean_command); + self->check_clean_heads_cancellable = g_cancellable_new (); + + pp_maintenance_command_is_supported_async (self->clean_command, + self->check_clean_heads_cancellable, + check_clean_heads_maintenance_command_cb, + self); +} + +static void +clean_heads_maintenance_command_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + PpPrinterEntry *self = PP_PRINTER_ENTRY (user_data); + PpMaintenanceCommand *command = (PpMaintenanceCommand *) source_object; + GError *error = NULL; + + if (!pp_maintenance_command_execute_finish (command, res, &error)) + { + g_warning ("Error cleaning print heads for %s: %s", self->printer_name, error->message); + g_error_free (error); + } + g_object_unref (source_object); +} + +static void +clean_heads (GtkButton *button, + PpPrinterEntry *self) +{ + if (self->clean_command == NULL) + return; + + g_object_ref (self->clean_command); + pp_maintenance_command_execute_async (self->clean_command, + NULL, + clean_heads_maintenance_command_cb, + self); +} + +static void remove_printer (GtkButton *button, PpPrinterEntry *self) { @@ -637,6 +716,13 @@ pp_printer_entry_new (cups_dest_t printer, self->printer_hostname = printer_get_hostname (printer_type, self->printer_uri, printer_uri); + self->clean_command = pp_maintenance_command_new (self->printer_name, + "Clean", + "all", + /* Translators: Name of job which makes printer to clean its heads */ + _("Clean print heads")); + check_clean_heads_maintenance_command (self); + gtk_image_set_from_icon_name (self->printer_icon, printer_icon_name, GTK_ICON_SIZE_DIALOG); gtk_label_set_text (self->printer_status, printer_status); g_free (printer_status); @@ -691,6 +777,13 @@ pp_printer_entry_dispose (GObject *object) g_clear_pointer (&self->printer_make_and_model, g_free); g_clear_pointer (&self->printer_hostname, g_free); + if (self->check_clean_heads_cancellable) + { + g_cancellable_cancel (self->check_clean_heads_cancellable); + g_clear_object (&self->check_clean_heads_cancellable); + } + g_clear_object (&self->clean_command); + G_OBJECT_CLASS (pp_printer_entry_parent_class)->dispose (object); } @@ -712,6 +805,7 @@ pp_printer_entry_class_init (PpPrinterEntryClass *klass) gtk_widget_class_bind_template_child (widget_class, PpPrinterEntry, supply_drawing_area); 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_child (widget_class, PpPrinterEntry, clean_heads_menuitem); gtk_widget_class_bind_template_child (widget_class, PpPrinterEntry, remove_printer_menuitem); gtk_widget_class_bind_template_child (widget_class, PpPrinterEntry, error_status); gtk_widget_class_bind_template_child (widget_class, PpPrinterEntry, printer_error); @@ -719,6 +813,7 @@ pp_printer_entry_class_init (PpPrinterEntryClass *klass) 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, clean_heads); gtk_widget_class_bind_template_callback (widget_class, remove_printer); gtk_widget_class_bind_template_callback (widget_class, show_jobs_dialog); gtk_widget_class_bind_template_callback (widget_class, restart_printer); diff --git a/panels/printers/printer-entry.ui b/panels/printers/printer-entry.ui index 31cbc82aa..b788db8b5 100644 --- a/panels/printers/printer-entry.ui +++ b/panels/printers/printer-entry.ui @@ -44,7 +44,17 @@ <property name="width">3</property> </packing> </child> - + <child> + <object class="GtkModelButton" id="clean_heads_menuitem"> + <property name="visible">False</property> + <property name="text" translatable="yes" comments="Translators: This button executes command which cleans print heads of the printer.">Clean Print Heads</property> + <signal name="clicked" handler="clean_heads"/> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + </packing> + </child> <child> <object class="GtkModelButton" id="remove_printer_menuitem"> <property name="visible">True</property> @@ -53,7 +63,7 @@ </object> <packing> <property name="left-attach">1</property> - <property name="top-attach">3</property> + <property name="top-attach">4</property> </packing> </child> </object> |