From 82ecfaaa89684a7504913fb039d0dd8302c82ec9 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Fri, 25 Jan 2013 10:29:57 +0100 Subject: indicator-ng: require header item to have x-canonical-type set --- libindicator/indicator-ng.c | 53 ++++++++++++++++++++++++++++++------------ tests/indicator-test-service.c | 1 + 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/libindicator/indicator-ng.c b/libindicator/indicator-ng.c index 003ec70..05ece8d 100644 --- a/libindicator/indicator-ng.c +++ b/libindicator/indicator-ng.c @@ -219,6 +219,23 @@ indicator_ng_update_entry (IndicatorNg *self) g_variant_unref (state); } +static gboolean +indicator_ng_menu_item_is_of_type (GMenuModel *menu, + gint index, + const gchar *expected_type) +{ + gchar *type; + gboolean has_type = FALSE; + + if (g_menu_model_get_item_attribute (menu, index, "x-canonical-type", "s", &type)) + { + has_type = g_str_equal (type, expected_type); + g_free (type); + } + + return has_type; +} + static void indicator_ng_menu_changed (GMenuModel *menu, gint position, @@ -240,26 +257,32 @@ indicator_ng_menu_changed (GMenuModel *menu, if (added) { - GMenuModel *popup; - gchar *action; - g_clear_pointer (&self->header_action, g_free); - if (g_menu_model_get_item_attribute (self->menu, 0, G_MENU_ATTRIBUTE_ACTION, "s", &action) && - g_str_has_prefix (action, "indicator.")) - { - self->header_action = g_strdup (action + 10); - } - popup = g_menu_model_get_item_link (self->menu, 0, G_MENU_LINK_SUBMENU); - if (popup) + if (indicator_ng_menu_item_is_of_type (self->menu, 0, "com.canonical.indicator.root")) { - gtk_menu_shell_bind_model (GTK_MENU_SHELL (self->entry.menu), popup, NULL, TRUE); - g_object_unref (popup); - } + GMenuModel *popup; + gchar *action; - indicator_ng_update_entry (self); + if (g_menu_model_get_item_attribute (self->menu, 0, G_MENU_ATTRIBUTE_ACTION, "s", &action) && + g_str_has_prefix (action, "indicator.")) + { + self->header_action = g_strdup (action + 10); + } - g_free (action); + popup = g_menu_model_get_item_link (self->menu, 0, G_MENU_LINK_SUBMENU); + if (popup) + { + gtk_menu_shell_bind_model (GTK_MENU_SHELL (self->entry.menu), popup, NULL, TRUE); + g_object_unref (popup); + } + + indicator_ng_update_entry (self); + + g_free (action); + } + else + g_warning ("indicator menu item must be of type 'com.canonical.indicator.root'"); } } diff --git a/tests/indicator-test-service.c b/tests/indicator-test-service.c index 3a6a0b2..0393677 100644 --- a/tests/indicator-test-service.c +++ b/tests/indicator-test-service.c @@ -81,6 +81,7 @@ main (int argc, char **argv) submenu = g_menu_new (); g_menu_append (submenu, "Show", "indicator.show"); item = g_menu_item_new (NULL, "indicator._header"); + g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.root"); g_menu_item_set_submenu (item, G_MENU_MODEL (submenu)); indicator.menu = g_menu_new (); g_menu_append_item (indicator.menu, item); -- cgit v1.2.3