aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/indicator-printers-menu.c118
-rw-r--r--src/indicator-printers-menu.h5
-rw-r--r--src/indicator-printers-service.c21
3 files changed, 119 insertions, 25 deletions
diff --git a/src/indicator-printers-menu.c b/src/indicator-printers-menu.c
index 95bee79..a8152cd 100644
--- a/src/indicator-printers-menu.c
+++ b/src/indicator-printers-menu.c
@@ -4,8 +4,6 @@
#include <gio/gio.h>
#include <cups/cups.h>
-#include "cups-notifier.h"
-
G_DEFINE_TYPE (IndicatorPrintersMenu, indicator_printers_menu, G_TYPE_OBJECT)
@@ -21,6 +19,15 @@ struct _IndicatorPrintersMenuPrivate
};
+enum {
+ PROP_0,
+ PROP_CUPS_NOTIFIER,
+ NUM_PROPERTIES
+};
+
+GParamSpec *properties[NUM_PROPERTIES];
+
+
static void
dispose (GObject *object)
{
@@ -38,6 +45,46 @@ dispose (GObject *object)
}
+void
+set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ IndicatorPrintersMenu *self = INDICATOR_PRINTERS_MENU (object);
+
+ switch (property_id) {
+ case PROP_CUPS_NOTIFIER:
+ indicator_printers_menu_set_cups_notifier (self,
+ g_value_get_object (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+
+void
+get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ IndicatorPrintersMenu *self = INDICATOR_PRINTERS_MENU (object);
+
+ switch (property_id) {
+ case PROP_CUPS_NOTIFIER:
+ g_value_set_object (value,
+ indicator_printers_menu_get_cups_notifier (self));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+
static void
indicator_printers_menu_class_init (IndicatorPrintersMenuClass *klass)
{
@@ -46,6 +93,16 @@ indicator_printers_menu_class_init (IndicatorPrintersMenuClass *klass)
g_type_class_add_private (klass, sizeof (IndicatorPrintersMenuPrivate));
object_class->dispose = dispose;
+ object_class->get_property = get_property;
+ object_class->set_property = set_property;
+
+ properties[PROP_CUPS_NOTIFIER] = g_param_spec_object ("cups-notifier",
+ "Cups Notifier",
+ "A cups notifier object",
+ CUPS_TYPE_NOTIFIER,
+ G_PARAM_READWRITE);
+
+ g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
}
@@ -194,7 +251,6 @@ indicator_printers_menu_init (IndicatorPrintersMenu *self)
IndicatorPrintersMenuPrivate *priv = PRINTERS_MENU_PRIVATE (self);
int ndests, i;
cups_dest_t *dests;
- GError *error = NULL;
priv->root = dbusmenu_menuitem_new ();
@@ -203,27 +259,6 @@ indicator_printers_menu_init (IndicatorPrintersMenu *self)
g_free,
g_object_unref);
- priv->cups_notifier = cups_notifier_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
- 0,
- NULL,
- "/org/cups/cupsd/Notifier",
- NULL,
- &error);
- if (error) {
- g_warning ("Error creating cups notify handler: %s", error->message);
- g_clear_error (&error);
- }
- else {
- g_signal_connect (priv->cups_notifier, "job-created",
- G_CALLBACK (update_job), self);
- g_signal_connect (priv->cups_notifier, "job-state",
- G_CALLBACK (update_job), self);
- g_signal_connect (priv->cups_notifier, "job-completed",
- G_CALLBACK (update_job), self);
- g_signal_connect (priv->cups_notifier, "printer-state-changed",
- G_CALLBACK (on_printer_state_changed), self);
- }
-
/* create initial menu items */
ndests = cupsGetDests (&dests);
for (i = 0; i < ndests; i++) {
@@ -253,3 +288,38 @@ indicator_printers_menu_get_root (IndicatorPrintersMenu *self)
return priv->root;
}
+
+CupsNotifier *
+indicator_printers_menu_get_cups_notifier (IndicatorPrintersMenu *self)
+{
+ IndicatorPrintersMenuPrivate *priv = PRINTERS_MENU_PRIVATE (self);
+ return priv->cups_notifier;
+}
+
+
+void
+indicator_printers_menu_set_cups_notifier (IndicatorPrintersMenu *self,
+ CupsNotifier *cups_notifier)
+{
+ IndicatorPrintersMenuPrivate *priv = PRINTERS_MENU_PRIVATE (self);
+
+ if (priv->cups_notifier) {
+ g_object_disconnect (priv->cups_notifier,
+ "any-signal", update_job, self,
+ "any-signal", on_printer_state_changed, self,
+ NULL);
+ g_object_unref (priv->cups_notifier);
+ }
+
+ priv->cups_notifier = cups_notifier;
+
+ if (priv->cups_notifier) {
+ g_object_connect (priv->cups_notifier,
+ "signal::job-created", update_job, self,
+ "signal::job-state", update_job, self,
+ "signal::job-completed", update_job, self,
+ "signal::printer-state-changed", on_printer_state_changed, self,
+ NULL);
+ }
+}
+
diff --git a/src/indicator-printers-menu.h b/src/indicator-printers-menu.h
index bca9b0c..8e1a44f 100644
--- a/src/indicator-printers-menu.h
+++ b/src/indicator-printers-menu.h
@@ -4,6 +4,8 @@
#include <glib-object.h>
#include <libdbusmenu-glib/dbusmenu-glib.h>
+#include "cups-notifier.h"
+
G_BEGIN_DECLS
#define INDICATOR_TYPE_PRINTERS_MENU indicator_printers_menu_get_type()
@@ -46,6 +48,9 @@ GType indicator_printers_menu_get_type (void) G_GNUC_CONST;
IndicatorPrintersMenu *indicator_printers_menu_new (void);
DbusmenuMenuitem * indicator_printers_menu_get_root (IndicatorPrintersMenu *menu);
+CupsNotifier * indicator_printers_menu_get_cups_notifier (IndicatorPrintersMenu *self);
+void indicator_printers_menu_set_cups_notifier (IndicatorPrintersMenu *self,
+ CupsNotifier *cups_notifier);
G_END_DECLS
diff --git a/src/indicator-printers-service.c b/src/indicator-printers-service.c
index f390f36..ce89dd0 100644
--- a/src/indicator-printers-service.c
+++ b/src/indicator-printers-service.c
@@ -21,6 +21,7 @@
#include <gtk/gtk.h>
#include "dbus-names.h"
+#include "cups-notifier.h"
#include "indicator-printers-menu.h"
@@ -36,7 +37,9 @@ int main (int argc, char *argv[])
{
IndicatorService *service;
DbusmenuServer *menuserver;
+ CupsNotifier *cups_notifier;
IndicatorPrintersMenu *menu;
+ GError *error = NULL;
gtk_init (&argc, &argv);
@@ -47,7 +50,22 @@ int main (int argc, char *argv[])
G_CALLBACK (service_shutdown),
NULL);
- menu = indicator_printers_menu_new ();
+ cups_notifier = cups_notifier_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+ 0,
+ NULL,
+ CUPS_DBUS_PATH,
+ NULL,
+ &error);
+ if (error) {
+ g_warning ("Error creating cups notify handler: %s", error->message);
+ g_error_free (error);
+ g_object_unref (service);
+ return 1;
+ }
+
+ menu = g_object_new (INDICATOR_TYPE_PRINTERS_MENU,
+ "cups-notifier", cups_notifier,
+ NULL);
menuserver = dbusmenu_server_new (INDICATOR_PRINTERS_DBUS_OBJECT_PATH);
dbusmenu_server_set_root (menuserver,
@@ -57,6 +75,7 @@ int main (int argc, char *argv[])
g_object_unref (menu);
g_object_unref (menuserver);
+ g_object_unref (cups_notifier);
g_object_unref (service);
return 0;
}