[glib] Menu markup: Support ids on submenu and section elements
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] Menu markup: Support ids on submenu and section elements
- Date: Sun, 25 Dec 2011 04:01:36 +0000 (UTC)
commit 37efbf4354969fdbca9ed71895309fb7fb95a55a
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Dec 24 22:58:16 2011 -0500
Menu markup: Support ids on submenu and section elements
This was supposed to work, but didn't.
Bug 666595.
gio/gmenumarkup.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 47 insertions(+), 7 deletions(-)
---
diff --git a/gio/gmenumarkup.c b/gio/gmenumarkup.c
index c0df3b6..867487d 100644
--- a/gio/gmenumarkup.c
+++ b/gio/gmenumarkup.c
@@ -118,6 +118,25 @@ add_string_attributes (GMenuItem *item,
}
}
+static gboolean
+find_id_attribute (const gchar **names,
+ const gchar **values,
+ const gchar **id)
+{
+ gint i;
+
+ for (i = 0; names[i]; i++)
+ {
+ if (strcmp (names[i], "id") == 0)
+ {
+ *id = values[i];
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
static void
g_menu_markup_start_element (GMarkupParseContext *context,
const gchar *element_name,
@@ -133,10 +152,8 @@ g_menu_markup_start_element (GMarkupParseContext *context,
attribute_names, attribute_values, error, \
first, __VA_ARGS__, G_MARKUP_COLLECT_INVALID)
#define OPTIONAL G_MARKUP_COLLECT_OPTIONAL
-#define STRDUP G_MARKUP_COLLECT_STRDUP
#define BOOLEAN G_MARKUP_COLLECT_BOOLEAN
#define STRING G_MARKUP_COLLECT_STRING
-#define NO_ATTRS() COLLECT (G_MARKUP_COLLECT_INVALID, NULL)
if (!(state->frame.menu || state->frame.item || state->string))
{
@@ -176,11 +193,19 @@ g_menu_markup_start_element (GMarkupParseContext *context,
{
GMenuItem *item;
GMenu *menu;
+ gchar *id;
menu = g_menu_new ();
item = g_menu_item_new_submenu (NULL, G_MENU_MODEL (menu));
add_string_attributes (item, attribute_names, attribute_values);
g_menu_markup_push_frame (state, menu, item);
+
+ if (find_id_attribute (attribute_names, attribute_values, &id))
+ {
+ if (state->objects)
+ g_hash_table_insert (state->objects, g_strdup (id), g_object_ref (menu));
+ }
+
return;
}
@@ -188,11 +213,19 @@ g_menu_markup_start_element (GMarkupParseContext *context,
{
GMenuItem *item;
GMenu *menu;
+ gchar *id;
menu = g_menu_new ();
item = g_menu_item_new_section (NULL, G_MENU_MODEL (menu));
add_string_attributes (item, attribute_names, attribute_values);
g_menu_markup_push_frame (state, menu, item);
+
+ if (find_id_attribute (attribute_names, attribute_values, &id))
+ {
+ if (state->objects)
+ g_hash_table_insert (state->objects, g_strdup (id), g_object_ref (menu));
+ }
+
return;
}
}
@@ -402,9 +435,12 @@ static GMarkupParser g_menu_subparser =
*
* If @objects is specified then it must be a #GHashTable that was
* created using g_hash_table_new_full() with g_str_hash(),
- * g_str_equal(), g_free() and g_object_unref(). Any named menus (ie:
- * those with an id='' attribute) that are encountered while parsing
- * will be added to this table. Each toplevel menu must be named.
+ * g_str_equal(), g_free() and g_object_unref().
+ * Any named menus (ie: <tag class="starttag">menu</tag>,
+ * <tag class="starttag">submenu</tag>,
+ * <tag class="starttag">section</tag> or <tag class="starttag">link</tag>
+ * elements with an id='' attribute) that are encountered while parsing
+ * will be added to this table. Each toplevel menu must be named.
*
* If @objects is %NULL then an empty hash table will be created.
*
@@ -485,9 +521,13 @@ g_menu_markup_parser_end (GMarkupParseContext *context)
*
* If @objects is specified then it must be a #GHashTable that was
* created using g_hash_table_new_full() with g_str_hash(),
- * g_str_equal(), g_free() and g_object_unref(). Any named menus (ie:
- * those with an * id='' attribute) that are encountered while parsing
+ * g_str_equal(), g_free() and g_object_unref().
+ * Any named menus (ie: <tag class="starttag">submenu</tag>,
+ * <tag class="starttag">section</tag> or <tag class="starttag">link</tag>
+ * elements with an id='' attribute) that are encountered while parsing
* will be added to this table.
+ * Note that toplevel <tag class="starttag">menu</tag> is not added to
+ * the hash table, even if it has an id attribute.
*
* If @objects is %NULL then named menus will not be supported.
*
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]