aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@canonical.com>2009-09-08 20:18:08 -0500
committerTed Gould <ted@canonical.com>2009-09-08 20:18:08 -0500
commit990756858a90aec22d0e1bf001a97208fc1a699f (patch)
treef43f61d0f8d8c62d09987ae06606ce95fb5d3407
parente7abefb09efca68e2101def3ff445d546fe74bac (diff)
downloadayatana-indicator-messages-990756858a90aec22d0e1bf001a97208fc1a699f.tar.gz
ayatana-indicator-messages-990756858a90aec22d0e1bf001a97208fc1a699f.tar.bz2
ayatana-indicator-messages-990756858a90aec22d0e1bf001a97208fc1a699f.zip
Adding in support for properties changing on the indicator menu item on the visualization side of things.
-rw-r--r--src/indicator-messages.c67
1 files changed, 52 insertions, 15 deletions
diff --git a/src/indicator-messages.c b/src/indicator-messages.c
index 42f2707..3dbc217 100644
--- a/src/indicator-messages.c
+++ b/src/indicator-messages.c
@@ -140,6 +140,39 @@ setup_icon_proxy (gpointer userdata)
return FALSE;
}
+typedef struct _indicator_item_t indicator_item_t;
+struct _indicator_item_t {
+ GtkWidget * icon;
+ GtkWidget * label;
+ GtkWidget * right;
+};
+
+/* Whenever we have a property change on a DbusmenuMenuitem
+ we need to be responsive to that. */
+static void
+indicator_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, indicator_item_t * mi_data)
+{
+ if (!g_strcmp0(prop, INDICATOR_MENUITEM_PROP_LABEL)) {
+ /* Set the main label */
+ gtk_label_set_text(GTK_LABEL(mi_data->label), value);
+ } else if (!g_strcmp0(prop, INDICATOR_MENUITEM_PROP_RIGHT)) {
+ /* Set the right label */
+ gtk_label_set_text(GTK_LABEL(mi_data->right), value);
+ } else if (!g_strcmp0(prop, INDICATOR_MENUITEM_PROP_ICON)) {
+ /* We don't use the value here, which is probably less efficient,
+ but it's easier to use the easy function. And since th value
+ is already cached, shouldn't be a big deal really. */
+ GdkPixbuf * pixbuf = dbusmenu_menuitem_property_get_image(newitem, INDICATOR_MENUITEM_PROP_ICON);
+ if (pixbuf != NULL) {
+ gtk_image_set_from_pixbuf(GTK_IMAGE(mi_data->icon), pixbuf);
+ }
+ } else {
+ g_warning("Indicator Item property '%s' unknown", prop);
+ }
+
+ return;
+}
+
/* We have a small little menuitem type that handles all
of the fun stuff for indicators. Mostly this is the
shifting over and putting the icon in with some right
@@ -147,6 +180,8 @@ setup_icon_proxy (gpointer userdata)
static gboolean
new_indicator_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client)
{
+ indicator_item_t * mi_data = g_new0(indicator_item_t, 1);
+
g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE);
g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE);
/* Note: not checking parent, it's reasonable for it to be NULL */
@@ -156,34 +191,36 @@ new_indicator_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm
GtkWidget * hbox = gtk_hbox_new(FALSE, 4);
/* Icon, probably someone's face or avatar on an IM */
- GtkWidget * icon = gtk_image_new();
+ mi_data->icon = gtk_image_new();
GdkPixbuf * pixbuf = dbusmenu_menuitem_property_get_image(newitem, INDICATOR_MENUITEM_PROP_ICON);
if (pixbuf != NULL) {
- gtk_image_set_from_pixbuf(GTK_IMAGE(icon), pixbuf);
+ gtk_image_set_from_pixbuf(GTK_IMAGE(mi_data->icon), pixbuf);
}
- gtk_misc_set_alignment(GTK_MISC(icon), 0.0, 0.5);
- gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0);
- gtk_widget_show(icon);
+ gtk_misc_set_alignment(GTK_MISC(mi_data->icon), 0.0, 0.5);
+ gtk_box_pack_start(GTK_BOX(hbox), mi_data->icon, FALSE, FALSE, 0);
+ gtk_widget_show(mi_data->icon);
/* Label, probably a username, chat room or mailbox name */
- GtkWidget * label = gtk_label_new(dbusmenu_menuitem_property_get(newitem, INDICATOR_MENUITEM_PROP_LABEL));
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
- gtk_widget_show(label);
+ mi_data->label = gtk_label_new(dbusmenu_menuitem_property_get(newitem, INDICATOR_MENUITEM_PROP_LABEL));
+ gtk_misc_set_alignment(GTK_MISC(mi_data->label), 0.0, 0.5);
+ gtk_box_pack_start(GTK_BOX(hbox), mi_data->label, TRUE, TRUE, 0);
+ gtk_widget_show(mi_data->label);
/* Usually either the time or the count on the individual
item. */
- GtkWidget * right = gtk_label_new(dbusmenu_menuitem_property_get(newitem, INDICATOR_MENUITEM_PROP_RIGHT));
- gtk_size_group_add_widget(indicator_right_group, right);
- gtk_misc_set_alignment(GTK_MISC(right), 1.0, 0.5);
- gtk_box_pack_start(GTK_BOX(hbox), right, FALSE, FALSE, 0);
- gtk_widget_show(right);
+ mi_data->right = gtk_label_new(dbusmenu_menuitem_property_get(newitem, INDICATOR_MENUITEM_PROP_RIGHT));
+ gtk_size_group_add_widget(indicator_right_group, mi_data->right);
+ gtk_misc_set_alignment(GTK_MISC(mi_data->right), 1.0, 0.5);
+ gtk_box_pack_start(GTK_BOX(hbox), mi_data->right, FALSE, FALSE, 0);
+ gtk_widget_show(mi_data->right);
gtk_container_add(GTK_CONTAINER(gmi), hbox);
gtk_widget_show(hbox);
dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent);
- /* TODO: Handle changes */
+
+ g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(indicator_prop_change_cb), mi_data);
+ g_signal_connect(G_OBJECT(newitem), "destroyed", G_CALLBACK(g_free), mi_data);
return TRUE;
}