diff options
author | Felipe Borges <felipeborges@gnome.org> | 2017-02-24 11:32:59 +0100 |
---|---|---|
committer | Felipe Borges <felipeborges@gnome.org> | 2017-02-27 16:29:43 +0100 |
commit | 5302047ff1bf3c2d9dffe27d101fa23f7d32d52f (patch) | |
tree | 0c92f73a5a3720fe0252827389c075acc17f4f01 | |
parent | 4e2c2fcc41cf5bee851b236141cbdbde8567fd44 (diff) | |
download | gnome-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.c | 114 | ||||
-rw-r--r-- | panels/printers/pp-printer-entry.c | 11 | ||||
-rw-r--r-- | panels/printers/pp-printer-entry.h | 2 |
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 */ |