aboutsummaryrefslogtreecommitdiff
path: root/src/indicator-printers.c
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2012-01-14 06:47:32 +0100
committerLars Uebernickel <lars.uebernickel@canonical.com>2012-01-14 06:47:32 +0100
commit9025561994ab31a85b47f825cd096be86dd57299 (patch)
tree6562bc26355eeda9b171b7442028f04d5576857b /src/indicator-printers.c
parent7657cf8bcc934bd5d4456fb1cc04a88c6c4c8bca (diff)
downloadayatana-indicator-printers-9025561994ab31a85b47f825cd096be86dd57299.tar.gz
ayatana-indicator-printers-9025561994ab31a85b47f825cd096be86dd57299.tar.bz2
ayatana-indicator-printers-9025561994ab31a85b47f825cd096be86dd57299.zip
Use a custom menu item which shows printer status on the right
Diffstat (limited to 'src/indicator-printers.c')
-rw-r--r--src/indicator-printers.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/indicator-printers.c b/src/indicator-printers.c
index 1f59b27..a384ef5 100644
--- a/src/indicator-printers.c
+++ b/src/indicator-printers.c
@@ -19,6 +19,7 @@
#include "config.h"
#include "indicator-printers.h"
+#include "indicator-menu-item.h"
#include "dbus-names.h"
#include <gtk/gtk.h>
@@ -78,16 +79,79 @@ indicator_printers_class_init (IndicatorPrintersClass *klass)
}
+static gboolean
+is_string_property (const gchar *name,
+ const gchar *prop,
+ GVariant *value)
+{
+ return !g_strcmp0 (name, prop) &&
+ g_variant_is_of_type (value, G_VARIANT_TYPE_STRING);
+}
+
+
+static void
+indicator_prop_change_cb (DbusmenuMenuitem *mi,
+ gchar *prop,
+ GVariant *value,
+ gpointer user_data)
+{
+ IndicatorMenuItem *menuitem = user_data;
+
+ if (is_string_property (prop, "indicator-label", value))
+ indicator_menu_item_set_label (menuitem, g_variant_get_string (value, NULL));
+ else if (is_string_property (prop, "indicator-right", value))
+ indicator_menu_item_set_right (menuitem, g_variant_get_string (value, NULL));
+}
+
+
+static gboolean
+new_indicator_item (DbusmenuMenuitem *newitem,
+ DbusmenuMenuitem *parent,
+ DbusmenuClient *client,
+ gpointer user_data)
+{
+ GtkWidget *menuitem;
+ const gchar *text, *right_text;
+
+ text = dbusmenu_menuitem_property_get (newitem, "indicator-label");
+ right_text = dbusmenu_menuitem_property_get (newitem, "indicator-right");
+
+ menuitem = g_object_new (INDICATOR_TYPE_MENU_ITEM,
+ "label", text,
+ "right", right_text,
+ NULL);
+ gtk_widget_show_all (menuitem);
+
+ dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client),
+ newitem,
+ GTK_MENU_ITEM (menuitem),
+ parent);
+
+ g_signal_connect(G_OBJECT(newitem),
+ "property-changed",
+ G_CALLBACK(indicator_prop_change_cb),
+ menuitem);
+
+ return TRUE;
+}
+
+
static void
indicator_printers_init (IndicatorPrinters *io)
{
IndicatorPrintersPrivate *priv = INDICATOR_PRINTERS_GET_PRIVATE (io);
DbusmenuGtkMenu *menu;
+ DbusmenuClient *client;
GtkImage *image;
menu = dbusmenu_gtkmenu_new(INDICATOR_PRINTERS_DBUS_NAME,
INDICATOR_PRINTERS_DBUS_OBJECT_PATH);
+ client = DBUSMENU_CLIENT (dbusmenu_gtkmenu_get_client (menu));
+ dbusmenu_client_add_type_handler(client,
+ "indicator-item",
+ new_indicator_item);
+
image = indicator_image_helper ("printer-symbolic");
gtk_widget_show (GTK_WIDGET (image));