[gnome-control-center] Printers: Add commandline action "authenticate-jobs"
- From: Marek Kašík <mkasik src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] Printers: Add commandline action "authenticate-jobs"
- Date: Tue, 20 Feb 2018 00:14:12 +0000 (UTC)
commit aa0819894fb32bd3b94743e88afb6eff2e363102
Author: Marek Kasik <mkasik redhat com>
Date: Fri Feb 16 17:04:39 2018 +0100
Printers: Add commandline action "authenticate-jobs"
Add action "authenticate-jobs" to printers panel which
gets printer name as a parameter and asks user for
credentials.
Syntax for trigerring this action looks like:
"gnome-control-center printers authenticate-jobs my-local-printer".
https://bugzilla.gnome.org/show_bug.cgi?id=758170
panels/printers/cc-printers-panel.c | 95 ++++++++++++++++++++++++++++++++++---
1 file changed, 88 insertions(+), 7 deletions(-)
---
diff --git a/panels/printers/cc-printers-panel.c b/panels/printers/cc-printers-panel.c
index f24f29861..2d87dac07 100644
--- a/panels/printers/cc-printers-panel.c
+++ b/panels/printers/cc-printers-panel.c
@@ -107,6 +107,8 @@ struct _CcPrintersPanelPrivate
gchar *deleted_printer_name;
GHashTable *printer_entries;
+ gboolean entries_filled;
+ GVariant *action;
GtkSizeGroup *size_group;
@@ -122,11 +124,50 @@ typedef struct
GCancellable *cancellable;
} SetPPDItem;
+enum {
+ PROP_0,
+ PROP_PARAMETERS
+};
+
static void actualize_printers_list (CcPrintersPanel *self);
static void update_sensitivity (gpointer user_data);
static void detach_from_cups_notifier (gpointer data);
static void free_dests (CcPrintersPanel *self);
+static void
+execute_action (CcPrintersPanel *self,
+ GVariant *action)
+{
+ CcPrintersPanelPrivate *priv = self->priv;
+ PpPrinterEntry *printer_entry;
+ const gchar *action_name;
+ const gchar *printer_name;
+ GVariant *variant;
+ gint count;
+
+ count = g_variant_n_children (action);
+ if (count == 2)
+ {
+ g_variant_get_child (action, 0, "v", &variant);
+ action_name = g_variant_get_string (variant, NULL);
+ g_variant_unref (variant);
+
+ /* authenticate-jobs printer-name */
+ if (g_strcmp0 (action_name, "authenticate-jobs") == 0)
+ {
+ g_variant_get_child (action, 1, "v", &variant);
+ printer_name = g_variant_get_string (variant, NULL);
+ g_variant_unref (variant);
+
+ printer_entry = PP_PRINTER_ENTRY (g_hash_table_lookup (priv->printer_entries, printer_name));
+ if (printer_entry != NULL)
+ pp_printer_entry_authenticate_jobs (printer_entry);
+ else
+ g_warning ("Could not find printer \"%s\"!", printer_name);
+ }
+ }
+}
+
static void
cc_printers_panel_get_property (GObject *object,
guint property_id,
@@ -135,21 +176,42 @@ cc_printers_panel_get_property (GObject *object,
{
switch (property_id)
{
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
cc_printers_panel_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
+ CcPrintersPanel *self = CC_PRINTERS_PANEL (object);
+ CcPrintersPanelPrivate *priv = self->priv;
+ GVariant *parameters;
+
switch (property_id)
{
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ case PROP_PARAMETERS:
+ parameters = g_value_get_variant (value);
+ if (parameters != NULL && g_variant_n_children (parameters) > 0)
+ {
+ if (priv->entries_filled)
+ {
+ execute_action (CC_PRINTERS_PANEL (object), parameters);
+ }
+ else
+ {
+ if (priv->action != NULL)
+ g_variant_unref (priv->action);
+ priv->action = g_variant_ref (parameters);
+ }
+ }
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
@@ -284,6 +346,9 @@ cc_printers_panel_dispose (GObject *object)
NULL);
}
+ if (priv->action != NULL)
+ g_variant_unref (priv->action);
+
g_clear_pointer (&priv->printer_entries, g_hash_table_destroy);
G_OBJECT_CLASS (cc_printers_panel_parent_class)->dispose (object);
@@ -316,6 +381,8 @@ cc_printers_panel_class_init (CcPrintersPanelClass *klass)
object_class->finalize = cc_printers_panel_finalize;
panel_class->get_help_uri = cc_printers_panel_get_help_uri;
+
+ g_object_class_override_property (object_class, PROP_PARAMETERS, "parameters");
}
static void
@@ -886,6 +953,18 @@ actualize_printers_list_cb (GObject *source_object,
add_printer_entry (self, priv->dests[i]);
}
+ if (!priv->entries_filled)
+ {
+ if (priv->action != NULL)
+ {
+ execute_action (self, priv->action);
+ g_variant_unref (priv->action);
+ priv->action = NULL;
+ }
+
+ priv->entries_filled = TRUE;
+ }
+
update_sensitivity (user_data);
}
@@ -1276,6 +1355,8 @@ cc_printers_panel_init (CcPrintersPanel *self)
g_str_equal,
g_free,
NULL);
+ priv->entries_filled = FALSE;
+ priv->action = NULL;
priv->actualize_printers_list_cancellable = g_cancellable_new ();
priv->cups_status_check_cancellable = g_cancellable_new ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]