aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2013-01-25 10:29:57 +0100
committerLars Uebernickel <lars.uebernickel@canonical.com>2013-01-25 10:29:57 +0100
commit82ecfaaa89684a7504913fb039d0dd8302c82ec9 (patch)
tree65332ebc3eb241dd03bc377dc7360720c95e5363
parentf02ca5a6b148d7ab6c33692da84f4601af4fd8c8 (diff)
downloadlibayatana-indicator-82ecfaaa89684a7504913fb039d0dd8302c82ec9.tar.gz
libayatana-indicator-82ecfaaa89684a7504913fb039d0dd8302c82ec9.tar.bz2
libayatana-indicator-82ecfaaa89684a7504913fb039d0dd8302c82ec9.zip
indicator-ng: require header item to have x-canonical-type set
-rw-r--r--libindicator/indicator-ng.c53
-rw-r--r--tests/indicator-test-service.c1
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);