aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/indicator-printers-menu.c78
1 files changed, 60 insertions, 18 deletions
diff --git a/src/indicator-printers-menu.c b/src/indicator-printers-menu.c
index c5c2636..e0cfd4b 100644
--- a/src/indicator-printers-menu.c
+++ b/src/indicator-printers-menu.c
@@ -2,6 +2,7 @@
#include "indicator-printers-menu.h"
#include <gio/gio.h>
+#include <cups/cups.h>
G_DEFINE_TYPE (IndicatorPrintersMenu, indicator_printers_menu, G_TYPE_OBJECT)
@@ -13,6 +14,7 @@ G_DEFINE_TYPE (IndicatorPrintersMenu, indicator_printers_menu, G_TYPE_OBJECT)
struct _IndicatorPrintersMenuPrivate
{
DbusmenuMenuitem *root;
+ GHashTable *printers; /* printer name -> dbusmenuitem */
};
@@ -21,6 +23,11 @@ dispose (GObject *object)
{
IndicatorPrintersMenuPrivate *priv = PRINTERS_MENU_PRIVATE (object);
+ if (priv->printers) {
+ g_hash_table_unref (priv->printers);
+ priv->printers = NULL;
+ }
+
g_clear_object (&priv->root);
G_OBJECT_CLASS (indicator_printers_menu_parent_class)->dispose (object);
@@ -72,28 +79,42 @@ show_system_settings (DbusmenuMenuitem *menuitem,
g_object_unref (appinfo);
}
-
static void
add_printer_menuitem (IndicatorPrintersMenu *self,
- const gchar *printer)
+ const char *printer,
+ int state,
+ int njobs)
{
IndicatorPrintersMenuPrivate *priv = PRINTERS_MENU_PRIVATE (self);
- DbusmenuMenuitem *child;
-
- child = dbusmenu_menuitem_new ();
- dbusmenu_menuitem_property_set (child, "indicator-icon-name", "printer");
- dbusmenu_menuitem_property_set (child, "indicator-label", printer);
- dbusmenu_menuitem_property_set (child, "indicator-right", "Paused");
- dbusmenu_menuitem_property_set (child, "type", "indicator-item");
- g_signal_connect_data (child,
- "item-activated",
+ DbusmenuMenuitem *item;
+
+ item = dbusmenu_menuitem_new ();
+ dbusmenu_menuitem_property_set (item, "type", "indicator-item");
+ dbusmenu_menuitem_property_set (item, "indicator-icon-name", "printer");
+ dbusmenu_menuitem_property_set (item, "indicator-label", printer);
+ dbusmenu_menuitem_property_set_bool (item, "visible", TRUE);
+
+ switch (state) {
+ case IPP_PRINTER_STOPPED:
+ dbusmenu_menuitem_property_set (item, "indicator-right", "Paused");
+ dbusmenu_menuitem_property_set_bool (item, "indicator-right-is-lozenge", FALSE);
+ break;
+
+ case IPP_PRINTER_PROCESSING: {
+ gchar *jobstr = g_strdup_printf ("%d", njobs);
+ dbusmenu_menuitem_property_set (item, "indicator-right", jobstr);
+ dbusmenu_menuitem_property_set_bool (item, "indicator-right-is-lozenge", TRUE);
+ g_free (jobstr);
+ break;
+ }
+ }
+
+ g_signal_connect_data (item, "item-activated",
G_CALLBACK (show_system_settings),
- g_strdup (printer),
- (GClosureNotify) g_free,
- 0);
+ g_strdup (printer), (GClosureNotify) g_free, 0);
- dbusmenu_menuitem_child_append(priv->root, child);
- g_object_unref (child);
+ dbusmenu_menuitem_child_append(priv->root, item);
+ g_hash_table_insert (priv->printers, g_strdup (printer), item);
}
@@ -101,10 +122,31 @@ static void
indicator_printers_menu_init (IndicatorPrintersMenu *self)
{
IndicatorPrintersMenuPrivate *priv = PRINTERS_MENU_PRIVATE (self);
+ int ndests, njobs, i, state;
+ cups_dest_t *dests;
+ cups_job_t *jobs;
priv->root = dbusmenu_menuitem_new ();
- add_printer_menuitem (self, "canon-mono-duplex");
- add_printer_menuitem (self, "kitchen");
+
+ priv->printers = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ g_free,
+ g_object_unref);
+
+ /* create initial menu items */
+ ndests = cupsGetDests (&dests);
+ for (i = 0; i < ndests; i++) {
+ njobs = cupsGetJobs (&jobs, dests[i].name, 1, CUPS_WHICHJOBS_ACTIVE);
+ state = atoi (cupsGetOption ("printer-state",
+ dests[i].num_options,
+ dests[i].options));
+
+ if (njobs > 0)
+ add_printer_menuitem (self, dests[i].name, state, njobs);
+
+ cupsFreeJobs (njobs, jobs);
+ }
+ cupsFreeDests (ndests, dests);
}