summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Borges <felipeborges@gnome.org>2017-02-24 11:32:59 +0100
committerFelipe Borges <felipeborges@gnome.org>2017-02-27 16:29:43 +0100
commit5302047ff1bf3c2d9dffe27d101fa23f7d32d52f (patch)
tree0c92f73a5a3720fe0252827389c075acc17f4f01
parent4e2c2fcc41cf5bee851b236141cbdbde8567fd44 (diff)
downloadgnome-control-center-5302047ff1bf3c2d9dffe27d101fa23f7d32d52f.tar.gz
printers: Subscribe to jobs notifications
The previous implementation of the panel was unable to individually update a PpPrinterEntry jobs count and its PpJobsDialog. These changes make the job notifications trigger updates in the PpPrinterEntry UIs, keeping track of job events on the go. https://bugzilla.gnome.org/show_bug.cgi?id=779079
-rw-r--r--panels/printers/cc-printers-panel.c114
-rw-r--r--panels/printers/pp-printer-entry.c11
-rw-r--r--panels/printers/pp-printer-entry.h2
3 files changed, 118 insertions, 9 deletions
diff --git a/panels/printers/cc-printers-panel.c b/panels/printers/cc-printers-panel.c
index 9d7b3f5cd..7cc0ec3d6 100644
--- a/panels/printers/cc-printers-panel.c
+++ b/panels/printers/cc-printers-panel.c
@@ -38,6 +38,7 @@
#include "pp-utils.h"
#include "pp-cups.h"
#include "pp-printer-entry.h"
+#include "pp-job.h"
CC_PANEL_REGISTER (CcPrintersPanel, cc_printers_panel)
@@ -250,6 +251,58 @@ cc_printers_panel_class_init (CcPrintersPanelClass *klass)
}
static void
+on_get_job_attributes_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ CcPrintersPanel *self = (CcPrintersPanel*) user_data;
+ CcPrintersPanelPrivate *priv;
+ const gchar *job_originating_user_name;
+ const gchar *job_printer_uri;
+ GVariant *attributes;
+ GVariant *username;
+ GVariant *printer_uri;
+ GError *error = NULL;
+
+ priv = PRINTERS_PANEL_PRIVATE (self);
+
+ attributes = pp_job_get_attributes_finish (PP_JOB (source_object), res, &error);
+ g_object_unref (source_object);
+
+ if (attributes != NULL)
+ {
+ if ((username = g_variant_lookup_value (attributes, "job-originating-user-name", G_VARIANT_TYPE ("as"))) != NULL)
+ {
+ if ((printer_uri = g_variant_lookup_value (attributes, "job-printer-uri", G_VARIANT_TYPE ("as"))) != NULL)
+ {
+ job_originating_user_name = g_variant_get_string (g_variant_get_child_value (username, 0), NULL);
+ job_printer_uri = g_variant_get_string (g_variant_get_child_value (printer_uri, 0), NULL);
+
+ if (job_originating_user_name != NULL && job_printer_uri != NULL &&
+ g_strcmp0 (job_originating_user_name, cupsUser ()) == 0 &&
+ g_strrstr (job_printer_uri, "/") != 0 &&
+ priv->dests != NULL)
+ {
+ PpPrinterEntry *printer_entry;
+ gchar *printer_name;
+
+ printer_name = g_strrstr (job_printer_uri, "/") + 1;
+ printer_entry = PP_PRINTER_ENTRY (g_hash_table_lookup (priv->printer_entries, printer_name));
+
+ pp_printer_entry_update_jobs_count (printer_entry);
+ }
+
+ g_variant_unref (printer_uri);
+ }
+
+ g_variant_unref (username);
+ }
+
+ g_variant_unref (attributes);
+ }
+}
+
+static void
on_cups_notification (GDBusConnection *connection,
const char *sender_name,
const char *object_path,
@@ -259,7 +312,22 @@ on_cups_notification (GDBusConnection *connection,
gpointer user_data)
{
CcPrintersPanel *self = (CcPrintersPanel*) user_data;
+ gboolean printer_is_accepting_jobs;
+ gchar *printer_name = NULL;
gchar *text = NULL;
+ gchar *printer_uri = NULL;
+ gchar *printer_state_reasons = NULL;
+ PpJob *job;
+ gchar *job_state_reasons = NULL;
+ gchar *job_name = NULL;
+ guint job_id;
+ gint printer_state;
+ gint job_state;
+ gint job_impressions_completed;
+ static gchar *requested_attrs[] = {
+ "job-printer-uri",
+ "job-originating-user-name",
+ NULL };
if (g_strcmp0 (signal_name, "PrinterAdded") != 0 &&
g_strcmp0 (signal_name, "PrinterDeleted") != 0 &&
@@ -271,13 +339,47 @@ on_cups_notification (GDBusConnection *connection,
if (g_variant_n_children (parameters) == 1)
g_variant_get (parameters, "(&s)", &text);
- else if (g_strcmp0 (signal_name, "PrinterAdded") == 0 ||
- g_strcmp0 (signal_name, "PrinterDeleted") == 0 ||
- g_strcmp0 (signal_name, "PrinterStateChanged") == 0 ||
- g_strcmp0 (signal_name, "PrinterStopped") == 0 ||
- g_strcmp0 (signal_name, "JobCreated") == 0 ||
- g_strcmp0 (signal_name, "JobCompleted") == 0)
+ else if (g_variant_n_children (parameters) == 6)
+ {
+ g_variant_get (parameters, "(&s&s&su&sb)",
+ &text,
+ &printer_uri,
+ &printer_name,
+ &printer_state,
+ &printer_state_reasons,
+ &printer_is_accepting_jobs);
+ }
+ else if (g_variant_n_children (parameters) == 11)
+ {
+ g_variant_get (parameters, "(&s&s&su&sbuu&s&su)",
+ &text,
+ &printer_uri,
+ &printer_name,
+ &printer_state,
+ &printer_state_reasons,
+ &printer_is_accepting_jobs,
+ &job_id,
+ &job_state,
+ &job_state_reasons,
+ &job_name,
+ &job_impressions_completed);
+ }
+
+ if (g_strcmp0 (signal_name, "PrinterAdded") == 0 ||
+ g_strcmp0 (signal_name, "PrinterDeleted") == 0 ||
+ g_strcmp0 (signal_name, "PrinterStateChanged") == 0 ||
+ g_strcmp0 (signal_name, "PrinterStopped") == 0)
actualize_printers_list (self);
+ else if (g_strcmp0 (signal_name, "JobCreated") == 0 ||
+ g_strcmp0 (signal_name, "JobCompleted") == 0)
+ {
+ job = g_object_new (PP_TYPE_JOB, "id", job_id, NULL);
+ pp_job_get_attributes_async (job,
+ requested_attrs,
+ NULL,
+ on_get_job_attributes_cb,
+ self);
+ }
}
static gchar *subscription_events[] = {
diff --git a/panels/printers/pp-printer-entry.c b/panels/printers/pp-printer-entry.c
index cc33ed201..136512cf6 100644
--- a/panels/printers/pp-printer-entry.c
+++ b/panels/printers/pp-printer-entry.c
@@ -390,8 +390,8 @@ remove_printer (GtkButton *button,
printer_delete (self->printer_name);
}
-static void
-update_jobs_count (PpPrinterEntry *self)
+void
+pp_printer_entry_update_jobs_count (PpPrinterEntry *self)
{
cups_job_t *jobs = NULL;
gchar *button_label;
@@ -414,6 +414,11 @@ update_jobs_count (PpPrinterEntry *self)
gtk_button_set_label (GTK_BUTTON (self->show_jobs_dialog_button), button_label);
gtk_widget_set_sensitive (self->show_jobs_dialog_button, num_jobs > 0);
+ if (self->pp_jobs_dialog != NULL)
+ {
+ pp_jobs_dialog_update (self->pp_jobs_dialog);
+ }
+
g_free (button_label);
}
@@ -707,7 +712,7 @@ pp_printer_entry_new (cups_dest_t printer,
g_signal_connect (self->supply_drawing_area, "draw", G_CALLBACK (supply_levels_draw_cb), inklevel);
- update_jobs_count (self);
+ pp_printer_entry_update_jobs_count (self);
gtk_widget_set_sensitive (GTK_WIDGET (self->printer_default_checkbutton), self->is_authorized);
gtk_widget_set_sensitive (GTK_WIDGET (self->remove_printer_menuitem), self->is_authorized);
diff --git a/panels/printers/pp-printer-entry.h b/panels/printers/pp-printer-entry.h
index 87ab996df..8f37d80e9 100644
--- a/panels/printers/pp-printer-entry.h
+++ b/panels/printers/pp-printer-entry.h
@@ -34,4 +34,6 @@ GType pp_printer_entry_get_type (void);
PpPrinterEntry *pp_printer_entry_new (cups_dest_t printer,
gboolean is_authorized);
+void pp_printer_entry_update_jobs_count (PpPrinterEntry *self);
+
#endif /* PP_PRINTER_ENTRY_H */