diff options
author | Lars Uebernickel <lars.uebernickel@canonical.com> | 2013-03-21 14:06:22 -0400 |
---|---|---|
committer | Lars Uebernickel <lars.uebernickel@canonical.com> | 2013-03-21 14:06:22 -0400 |
commit | 8232ab0e1f8b94148dbf78bc279342c0fe3f6db1 (patch) | |
tree | eeb44bb407a76e37ebede196919156c735613b60 | |
parent | 61d0f80f976768679c4f2912832a96572dea6262 (diff) | |
download | libayatana-indicator-8232ab0e1f8b94148dbf78bc279342c0fe3f6db1.tar.gz libayatana-indicator-8232ab0e1f8b94148dbf78bc279342c0fe3f6db1.tar.bz2 libayatana-indicator-8232ab0e1f8b94148dbf78bc279342c0fe3f6db1.zip |
indicator-ng: allow a dictionary as the root action's state
Hopefully, this is more straightforward to use than (sssb). It's also
extensible.
(sssb) is still supported for backwards compatibility, but I wouldn't recommend
using it anymore.
-rw-r--r-- | libindicator/indicator-ng.c | 31 | ||||
-rw-r--r-- | tests/indicator-test-service.c | 4 |
2 files changed, 23 insertions, 12 deletions
diff --git a/libindicator/indicator-ng.c b/libindicator/indicator-ng.c index f2b957b..1e95785 100644 --- a/libindicator/indicator-ng.c +++ b/libindicator/indicator-ng.c @@ -236,6 +236,10 @@ static void indicator_ng_update_entry (IndicatorNg *self) { GVariant *state; + const gchar *label = NULL; + const gchar *iconstr = NULL; + const gchar *accessible_desc = NULL; + gboolean visible = TRUE; g_return_if_fail (self->menu != NULL); g_return_if_fail (self->actions != NULL); @@ -250,20 +254,25 @@ indicator_ng_update_entry (IndicatorNg *self) state = g_action_group_get_action_state (self->actions, self->header_action); if (state && g_variant_is_of_type (state, G_VARIANT_TYPE ("(sssb)"))) { - const gchar *label; - const gchar *iconstr; - const gchar *accessible_desc; - gboolean visible; - g_variant_get (state, "(&s&s&sb)", &label, &iconstr, &accessible_desc, &visible); - - indicator_ng_set_label (self, label); - indicator_ng_set_icon_from_string (self, iconstr); - indicator_ng_set_accessible_desc (self, accessible_desc); - indicator_object_set_visible (INDICATOR_OBJECT (self), visible); + } + else if (state && g_variant_is_of_type (state, G_VARIANT_TYPE ("a{sv}"))) + { + g_variant_lookup (state, "label", "&s", &label); + g_variant_lookup (state, "icon", "&s", &iconstr); + g_variant_lookup (state, "accessible-desc", "&s", &accessible_desc); + g_variant_lookup (state, "visible", "b", &visible); } else - g_warning ("the action of the indicator menu item must have state with type (sssb)"); + g_warning ("the action of the indicator menu item must have state with type (sssb) or a{sv}"); + + if (label) + indicator_ng_set_label (self, label); + if (iconstr) + indicator_ng_set_icon_from_string (self, iconstr); + if (accessible_desc) + indicator_ng_set_accessible_desc (self, accessible_desc); + indicator_object_set_visible (INDICATOR_OBJECT (self), visible); if (state) g_variant_unref (state); diff --git a/tests/indicator-test-service.c b/tests/indicator-test-service.c index 0393677..a40945f 100644 --- a/tests/indicator-test-service.c +++ b/tests/indicator-test-service.c @@ -70,7 +70,9 @@ main (int argc, char **argv) GMenuItem *item; GMenu *submenu; GActionEntry entries[] = { - { "_header", NULL, NULL, "('Test', 'indicator-test', 'Test indicator', true)", NULL }, + { "_header", NULL, NULL, "{'label': <'Test'>," + " 'icon': <'indicator-test'>," + " 'accessible-desc': <'Test indicator'> }", NULL }, { "show", activate_show, NULL, NULL, NULL } }; GMainLoop *loop; |