summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog24
-rw-r--r--ChangeLog.pre-2-1024
-rw-r--r--ChangeLog.pre-2-424
-rw-r--r--ChangeLog.pre-2-624
-rw-r--r--ChangeLog.pre-2-824
-rw-r--r--demos/gtk-demo/appwindow.c32
-rw-r--r--gtk/gtkaction.c2
-rw-r--r--gtk/gtkuimanager.c225
-rw-r--r--gtk/gtkuimanager.h2
-rw-r--r--tests/merge-1.ui36
-rw-r--r--tests/merge-2.ui38
-rw-r--r--tests/merge-3.ui32
-rw-r--r--tests/testactions.c80
13 files changed, 346 insertions, 221 deletions
diff --git a/ChangeLog b/ChangeLog
index 6f25b59035..2588d50fac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2003-08-26 Matthias Clasen <maclas@gmx.de>
+
+ * gtk/gtkuimanager.[hc] (gtk_ui_manager_add_ui_from_string): Use gssize
+ for length, not gsize.
+
+ * gtk/gtkuimanager.c: Refactor the XML format a bit: rename <Root> to
+ <ui> and make it optional in strings. Rename verb to action, <dockitem>
+ to <toolbar>, <menu> to <menubar>, <submenu> to <menu>.
+
+ * demos/gtk-demo/appwindow.c:
+ * tests/testactions.c:
+ * tests/testmerge.c:
+ * tests/merge-1.ui:
+ * tests/merge-2.ui:
+ * tests/merge-3.ui: Adjust to the new XML format.
+
Mon Aug 25 19:55:55 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_update_layout_width):
@@ -21,10 +37,12 @@ Mon Aug 25 19:55:55 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtk.h:
* tests/testmerge.c:
* tests/testactions.c:
- * demos/gtk-demo/appwindow.c: Replace all uses of GtkMenuMerge by GtkUIManager.
+ * demos/gtk-demo/appwindow.c: Replace all uses of GtkMenuMerge by
+ GtkUIManager.
- * demos/gtk-demo/appwindow.c: Make GtkMenuMerge demo less intimidating: add comments to
- entries array, remove newlines from ui definition. Don't use the ::add_widget signal.
+ * demos/gtk-demo/appwindow.c: Make GtkMenuMerge demo less intimidating:
+ add comments to entries array, remove newlines from ui definition. Don't
+ use the ::add_widget signal.
Mon Aug 25 17:28:04 2003 Owen Taylor <otaylor@redhat.com>
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 6f25b59035..2588d50fac 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,19 @@
+2003-08-26 Matthias Clasen <maclas@gmx.de>
+
+ * gtk/gtkuimanager.[hc] (gtk_ui_manager_add_ui_from_string): Use gssize
+ for length, not gsize.
+
+ * gtk/gtkuimanager.c: Refactor the XML format a bit: rename <Root> to
+ <ui> and make it optional in strings. Rename verb to action, <dockitem>
+ to <toolbar>, <menu> to <menubar>, <submenu> to <menu>.
+
+ * demos/gtk-demo/appwindow.c:
+ * tests/testactions.c:
+ * tests/testmerge.c:
+ * tests/merge-1.ui:
+ * tests/merge-2.ui:
+ * tests/merge-3.ui: Adjust to the new XML format.
+
Mon Aug 25 19:55:55 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_update_layout_width):
@@ -21,10 +37,12 @@ Mon Aug 25 19:55:55 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtk.h:
* tests/testmerge.c:
* tests/testactions.c:
- * demos/gtk-demo/appwindow.c: Replace all uses of GtkMenuMerge by GtkUIManager.
+ * demos/gtk-demo/appwindow.c: Replace all uses of GtkMenuMerge by
+ GtkUIManager.
- * demos/gtk-demo/appwindow.c: Make GtkMenuMerge demo less intimidating: add comments to
- entries array, remove newlines from ui definition. Don't use the ::add_widget signal.
+ * demos/gtk-demo/appwindow.c: Make GtkMenuMerge demo less intimidating:
+ add comments to entries array, remove newlines from ui definition. Don't
+ use the ::add_widget signal.
Mon Aug 25 17:28:04 2003 Owen Taylor <otaylor@redhat.com>
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 6f25b59035..2588d50fac 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,19 @@
+2003-08-26 Matthias Clasen <maclas@gmx.de>
+
+ * gtk/gtkuimanager.[hc] (gtk_ui_manager_add_ui_from_string): Use gssize
+ for length, not gsize.
+
+ * gtk/gtkuimanager.c: Refactor the XML format a bit: rename <Root> to
+ <ui> and make it optional in strings. Rename verb to action, <dockitem>
+ to <toolbar>, <menu> to <menubar>, <submenu> to <menu>.
+
+ * demos/gtk-demo/appwindow.c:
+ * tests/testactions.c:
+ * tests/testmerge.c:
+ * tests/merge-1.ui:
+ * tests/merge-2.ui:
+ * tests/merge-3.ui: Adjust to the new XML format.
+
Mon Aug 25 19:55:55 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_update_layout_width):
@@ -21,10 +37,12 @@ Mon Aug 25 19:55:55 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtk.h:
* tests/testmerge.c:
* tests/testactions.c:
- * demos/gtk-demo/appwindow.c: Replace all uses of GtkMenuMerge by GtkUIManager.
+ * demos/gtk-demo/appwindow.c: Replace all uses of GtkMenuMerge by
+ GtkUIManager.
- * demos/gtk-demo/appwindow.c: Make GtkMenuMerge demo less intimidating: add comments to
- entries array, remove newlines from ui definition. Don't use the ::add_widget signal.
+ * demos/gtk-demo/appwindow.c: Make GtkMenuMerge demo less intimidating:
+ add comments to entries array, remove newlines from ui definition. Don't
+ use the ::add_widget signal.
Mon Aug 25 17:28:04 2003 Owen Taylor <otaylor@redhat.com>
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 6f25b59035..2588d50fac 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,19 @@
+2003-08-26 Matthias Clasen <maclas@gmx.de>
+
+ * gtk/gtkuimanager.[hc] (gtk_ui_manager_add_ui_from_string): Use gssize
+ for length, not gsize.
+
+ * gtk/gtkuimanager.c: Refactor the XML format a bit: rename <Root> to
+ <ui> and make it optional in strings. Rename verb to action, <dockitem>
+ to <toolbar>, <menu> to <menubar>, <submenu> to <menu>.
+
+ * demos/gtk-demo/appwindow.c:
+ * tests/testactions.c:
+ * tests/testmerge.c:
+ * tests/merge-1.ui:
+ * tests/merge-2.ui:
+ * tests/merge-3.ui: Adjust to the new XML format.
+
Mon Aug 25 19:55:55 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_update_layout_width):
@@ -21,10 +37,12 @@ Mon Aug 25 19:55:55 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtk.h:
* tests/testmerge.c:
* tests/testactions.c:
- * demos/gtk-demo/appwindow.c: Replace all uses of GtkMenuMerge by GtkUIManager.
+ * demos/gtk-demo/appwindow.c: Replace all uses of GtkMenuMerge by
+ GtkUIManager.
- * demos/gtk-demo/appwindow.c: Make GtkMenuMerge demo less intimidating: add comments to
- entries array, remove newlines from ui definition. Don't use the ::add_widget signal.
+ * demos/gtk-demo/appwindow.c: Make GtkMenuMerge demo less intimidating:
+ add comments to entries array, remove newlines from ui definition. Don't
+ use the ::add_widget signal.
Mon Aug 25 17:28:04 2003 Owen Taylor <otaylor@redhat.com>
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 6f25b59035..2588d50fac 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,19 @@
+2003-08-26 Matthias Clasen <maclas@gmx.de>
+
+ * gtk/gtkuimanager.[hc] (gtk_ui_manager_add_ui_from_string): Use gssize
+ for length, not gsize.
+
+ * gtk/gtkuimanager.c: Refactor the XML format a bit: rename <Root> to
+ <ui> and make it optional in strings. Rename verb to action, <dockitem>
+ to <toolbar>, <menu> to <menubar>, <submenu> to <menu>.
+
+ * demos/gtk-demo/appwindow.c:
+ * tests/testactions.c:
+ * tests/testmerge.c:
+ * tests/merge-1.ui:
+ * tests/merge-2.ui:
+ * tests/merge-3.ui: Adjust to the new XML format.
+
Mon Aug 25 19:55:55 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtktextview.c (gtk_text_view_update_layout_width):
@@ -21,10 +37,12 @@ Mon Aug 25 19:55:55 2003 Owen Taylor <otaylor@redhat.com>
* gtk/gtk.h:
* tests/testmerge.c:
* tests/testactions.c:
- * demos/gtk-demo/appwindow.c: Replace all uses of GtkMenuMerge by GtkUIManager.
+ * demos/gtk-demo/appwindow.c: Replace all uses of GtkMenuMerge by
+ GtkUIManager.
- * demos/gtk-demo/appwindow.c: Make GtkMenuMerge demo less intimidating: add comments to
- entries array, remove newlines from ui definition. Don't use the ::add_widget signal.
+ * demos/gtk-demo/appwindow.c: Make GtkMenuMerge demo less intimidating:
+ add comments to entries array, remove newlines from ui definition. Don't
+ use the ::add_widget signal.
Mon Aug 25 17:28:04 2003 Owen Taylor <otaylor@redhat.com>
diff --git a/demos/gtk-demo/appwindow.c b/demos/gtk-demo/appwindow.c
index 916f1ae444..c3f36f7082 100644
--- a/demos/gtk-demo/appwindow.c
+++ b/demos/gtk-demo/appwindow.c
@@ -101,39 +101,39 @@ static GtkActionGroupEntry entries[] = {
static guint n_entries = G_N_ELEMENTS (entries);
static const gchar *ui_info =
-"<Root>"
-" <menu name='MenuBar'>"
-" <submenu name='FileMenu'>"
+"<ui>"
+" <menubar name='MenuBar'>"
+" <menu name='FileMenu'>"
" <menuitem name='New'/>"
" <menuitem name='Open'/>"
" <menuitem name='Save'/>"
" <menuitem name='SaveAs'/>"
" <separator name='Sep1'/>"
" <menuitem name='Quit'/>"
-" </submenu>"
-" <submenu name='PreferencesMenu'>"
-" <submenu name='ColorMenu'>"
+" </menu>"
+" <menu name='PreferencesMenu'>"
+" <menu name='ColorMenu'>"
" <menuitem name='Red'/>"
" <menuitem name='Green'/>"
" <menuitem name='Blue'/>"
-" </submenu>"
-" <submenu name='ShapeMenu'>"
+" </menu>"
+" <menu name='ShapeMenu'>"
" <menuitem name='Square'/>"
" <menuitem name='Rectangle'/>"
" <menuitem name='Oval'/>"
-" </submenu>"
-" </submenu>"
-" <submenu name='HelpMenu'>"
+" </menu>"
+" </menu>"
+" <menu name='HelpMenu'>"
" <menuitem name='About'/>"
-" </submenu>"
-" </menu>"
-" <dockitem name='ToolBar'>"
+" </menu>"
+" </menubar>"
+" <toolbar name='ToolBar'>"
" <toolitem name='Open'/>"
" <toolitem name='Quit'/>"
" <separator name='Sep1'/>"
" <toolitem name='Logo'/>"
-" </dockitem>"
-"</Root>";
+" </toolbar>"
+"</ui>";
diff --git a/gtk/gtkaction.c b/gtk/gtkaction.c
index 580742d76f..cd3b5c3cab 100644
--- a/gtk/gtkaction.c
+++ b/gtk/gtkaction.c
@@ -428,7 +428,7 @@ gtk_action_sync_property (GtkAction *action,
property = g_param_spec_get_name (pspec);
- g_value_init(&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+ g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
g_object_get_property (G_OBJECT (action), property, &value);
g_object_set_property (G_OBJECT (proxy), property, &value);
diff --git a/gtk/gtkuimanager.c b/gtk/gtkuimanager.c
index 5f7b3e78ea..3932b8e3ba 100644
--- a/gtk/gtkuimanager.c
+++ b/gtk/gtkuimanager.c
@@ -212,7 +212,7 @@ gtk_ui_manager_init (GtkUIManager *self)
merge_id = gtk_ui_manager_next_merge_id (self);
- node = get_child_node (self, NULL, "Root", 4,
+ node = get_child_node (self, NULL, "ui", 4,
GTK_UI_MANAGER_ROOT, TRUE, FALSE);
gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (node), merge_id, 0);
node = get_child_node (self, self->private_data->root_node, "popups", 6,
@@ -567,7 +567,7 @@ start_element_handler (GMarkupParseContext *context,
gint i;
const gchar *node_name;
- GQuark verb_quark;
+ GQuark action_quark;
gboolean top;
gboolean raise_error = TRUE;
@@ -576,7 +576,7 @@ start_element_handler (GMarkupParseContext *context,
/* work out a name for this node. Either the name attribute, or
* element name */
node_name = element_name;
- verb_quark = 0;
+ action_quark = 0;
top = FALSE;
for (i = 0; attribute_names[i] != NULL; i++)
{
@@ -584,34 +584,34 @@ start_element_handler (GMarkupParseContext *context,
{
node_name = attribute_values[i];
}
- else if (!strcmp (attribute_names[i], "verb"))
+ else if (!strcmp (attribute_names[i], "action"))
{
- verb_quark = g_quark_from_string (attribute_values[i]);
+ action_quark = g_quark_from_string (attribute_values[i]);
}
else if (!strcmp (attribute_names[i], "pos"))
{
top = !strcmp (attribute_values[i], "top");
}
}
- /* if no verb, then set it to the node's name */
- if (verb_quark == 0)
- verb_quark = g_quark_from_string (node_name);
+ /* if no action, then set it to the node's name */
+ if (action_quark == 0)
+ action_quark = g_quark_from_string (node_name);
switch (element_name[0])
{
- case 'R':
- if (ctx->state == STATE_START && !strcmp (element_name, "Root"))
+ case 'u':
+ if (ctx->state == STATE_START && !strcmp (element_name, "ui"))
{
ctx->state = STATE_ROOT;
ctx->current = self->private_data->root_node;
raise_error = FALSE;
gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
- ctx->merge_id, verb_quark);
+ ctx->merge_id, action_quark);
}
break;
case 'm':
- if (ctx->state == STATE_ROOT && !strcmp (element_name, "menu"))
+ if (ctx->state == STATE_ROOT && !strcmp (element_name, "menubar"))
{
ctx->state = STATE_MENU;
ctx->current = get_child_node (self, ctx->current,
@@ -619,14 +619,30 @@ start_element_handler (GMarkupParseContext *context,
GTK_UI_MANAGER_MENUBAR,
TRUE, FALSE);
if (NODE_INFO (ctx->current)->action_name == 0)
- NODE_INFO (ctx->current)->action_name = verb_quark;
+ NODE_INFO (ctx->current)->action_name = action_quark;
gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
- ctx->merge_id, verb_quark);
+ ctx->merge_id, action_quark);
NODE_INFO (ctx->current)->dirty = TRUE;
raise_error = FALSE;
}
+ else if (ctx->state == STATE_MENU && !strcmp (element_name, "menu"))
+ {
+ ctx->state = STATE_MENU;
+ ctx->current = get_child_node (self, ctx->current,
+ node_name, strlen (node_name),
+ GTK_UI_MANAGER_MENU,
+ TRUE, top);
+ if (NODE_INFO (ctx->current)->action_name == 0)
+ NODE_INFO (ctx->current)->action_name = action_quark;
+
+ gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
+ ctx->merge_id, action_quark);
+ NODE_INFO (ctx->current)->dirty = TRUE;
+
+ raise_error = FALSE;
+ }
else if (ctx->state == STATE_MENU && !strcmp (element_name, "menuitem"))
{
GNode *node;
@@ -637,33 +653,15 @@ start_element_handler (GMarkupParseContext *context,
GTK_UI_MANAGER_MENUITEM,
TRUE, top);
if (NODE_INFO (node)->action_name == 0)
- NODE_INFO (node)->action_name = verb_quark;
+ NODE_INFO (node)->action_name = action_quark;
gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (node),
- ctx->merge_id, verb_quark);
+ ctx->merge_id, action_quark);
NODE_INFO (node)->dirty = TRUE;
raise_error = FALSE;
}
break;
- case 'd':
- if (ctx->state == STATE_ROOT && !strcmp (element_name, "dockitem"))
- {
- ctx->state = STATE_TOOLBAR;
- ctx->current = get_child_node (self, ctx->current,
- node_name, strlen (node_name),
- GTK_UI_MANAGER_TOOLBAR,
- TRUE, FALSE);
- if (NODE_INFO (ctx->current)->action_name == 0)
- NODE_INFO (ctx->current)->action_name = verb_quark;
-
- gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
- ctx->merge_id, verb_quark);
- NODE_INFO (ctx->current)->dirty = TRUE;
-
- raise_error = FALSE;
- }
- break;
case 'p':
if (ctx->state == STATE_ROOT && !strcmp (element_name, "popups"))
{
@@ -674,7 +672,7 @@ start_element_handler (GMarkupParseContext *context,
TRUE, FALSE);
gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
- ctx->merge_id, verb_quark);
+ ctx->merge_id, action_quark);
NODE_INFO (ctx->current)->dirty = TRUE;
raise_error = FALSE;
@@ -687,10 +685,10 @@ start_element_handler (GMarkupParseContext *context,
GTK_UI_MANAGER_MENU,
TRUE, FALSE);
if (NODE_INFO (ctx->current)->action_name == 0)
- NODE_INFO (ctx->current)->action_name = verb_quark;
+ NODE_INFO (ctx->current)->action_name = action_quark;
gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
- ctx->merge_id, verb_quark);
+ ctx->merge_id, action_quark);
NODE_INFO (ctx->current)->dirty = TRUE;
raise_error = FALSE;
@@ -710,30 +708,14 @@ start_element_handler (GMarkupParseContext *context,
TRUE, top);
gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
- ctx->merge_id, verb_quark);
+ ctx->merge_id, action_quark);
NODE_INFO (ctx->current)->dirty = TRUE;
raise_error = FALSE;
}
break;
case 's':
- if (ctx->state == STATE_MENU && !strcmp (element_name, "submenu"))
- {
- ctx->state = STATE_MENU;
- ctx->current = get_child_node (self, ctx->current,
- node_name, strlen (node_name),
- GTK_UI_MANAGER_MENU,
- TRUE, top);
- if (NODE_INFO (ctx->current)->action_name == 0)
- NODE_INFO (ctx->current)->action_name = verb_quark;
-
- gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
- ctx->merge_id, verb_quark);
- NODE_INFO (ctx->current)->dirty = TRUE;
-
- raise_error = FALSE;
- }
- else if ((ctx->state == STATE_MENU || ctx->state == STATE_TOOLBAR) &&
+ if ((ctx->state == STATE_MENU || ctx->state == STATE_TOOLBAR) &&
!strcmp (element_name, "separator"))
{
GNode *node;
@@ -747,17 +729,33 @@ start_element_handler (GMarkupParseContext *context,
GTK_UI_MANAGER_SEPARATOR,
TRUE, top);
if (NODE_INFO (node)->action_name == 0)
- NODE_INFO (node)->action_name = verb_quark;
+ NODE_INFO (node)->action_name = action_quark;
gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (node),
- ctx->merge_id, verb_quark);
+ ctx->merge_id, action_quark);
NODE_INFO (node)->dirty = TRUE;
raise_error = FALSE;
}
break;
case 't':
- if (ctx->state == STATE_TOOLBAR && !strcmp (element_name, "toolitem"))
+ if (ctx->state == STATE_ROOT && !strcmp (element_name, "toolbar"))
+ {
+ ctx->state = STATE_TOOLBAR;
+ ctx->current = get_child_node (self, ctx->current,
+ node_name, strlen (node_name),
+ GTK_UI_MANAGER_TOOLBAR,
+ TRUE, FALSE);
+ if (NODE_INFO (ctx->current)->action_name == 0)
+ NODE_INFO (ctx->current)->action_name = action_quark;
+
+ gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
+ ctx->merge_id, action_quark);
+ NODE_INFO (ctx->current)->dirty = TRUE;
+
+ raise_error = FALSE;
+ }
+ else if (ctx->state == STATE_TOOLBAR && !strcmp (element_name, "toolitem"))
{
GNode *node;
@@ -767,10 +765,10 @@ start_element_handler (GMarkupParseContext *context,
GTK_UI_MANAGER_TOOLITEM,
TRUE, top);
if (NODE_INFO (node)->action_name == 0)
- NODE_INFO (node)->action_name = verb_quark;
+ NODE_INFO (node)->action_name = action_quark;
gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (node),
- ctx->merge_id, verb_quark);
+ ctx->merge_id, action_quark);
NODE_INFO (node)->dirty = TRUE;
raise_error = FALSE;
@@ -880,6 +878,56 @@ static GMarkupParser ui_parser = {
};
+static gboolean
+xml_isspace (char c)
+{
+ return c == ' ' || c == '\t' || c == '\n' || c == '\r';
+}
+
+static guint
+add_ui_from_string (GtkUIManager *self,
+ const gchar *buffer,
+ gssize length,
+ gboolean needs_root,
+ GError **error)
+{
+ ParseContext ctx = { 0 };
+ GMarkupParseContext *context;
+
+ ctx.state = STATE_START;
+ ctx.self = self;
+ ctx.current = NULL;
+ ctx.merge_id = gtk_ui_manager_next_merge_id (self);
+
+ context = g_markup_parse_context_new (&ui_parser, 0, &ctx, NULL);
+
+ if (needs_root)
+ if (!g_markup_parse_context_parse (context, "<ui>", -1, error))
+ goto error;
+
+ if (!g_markup_parse_context_parse (context, buffer, length, error))
+ goto error;
+
+ if (needs_root)
+ if (!g_markup_parse_context_parse (context, "</ui>", -1, error))
+ goto error;
+
+ if (!g_markup_parse_context_end_parse (context, error))
+ goto error;
+
+ g_markup_parse_context_free (context);
+
+ gtk_ui_manager_queue_update (self);
+
+ return ctx.merge_id;
+
+ error:
+
+ g_markup_parse_context_free (context);
+
+ return 0;
+}
+
/**
* gtk_ui_manager_add_ui_from_string:
* @self: a #GtkUIManager object
@@ -899,41 +947,28 @@ static GMarkupParser ui_parser = {
guint
gtk_ui_manager_add_ui_from_string (GtkUIManager *self,
const gchar *buffer,
- gsize length,
+ gssize length,
GError **error)
{
- ParseContext ctx = { 0 };
- GMarkupParseContext *context;
- gboolean res = TRUE;
+ gboolean needs_root = TRUE;
+ const gchar *p;
+ const gchar *end;
g_return_val_if_fail (GTK_IS_UI_MANAGER (self), FALSE);
g_return_val_if_fail (buffer != NULL, FALSE);
- ctx.state = STATE_START;
- ctx.self = self;
- ctx.current = NULL;
- ctx.merge_id = gtk_ui_manager_next_merge_id (self);
-
- context = g_markup_parse_context_new (&ui_parser, 0, &ctx, NULL);
if (length < 0)
length = strlen (buffer);
- if (g_markup_parse_context_parse (context, buffer, length, error))
- {
- if (!g_markup_parse_context_end_parse (context, error))
- res = FALSE;
- }
- else
- res = FALSE;
+ p = buffer;
+ end = buffer + length;
+ while (p != end && xml_isspace (*p))
+ ++p;
- g_markup_parse_context_free (context);
-
- gtk_ui_manager_queue_update (self);
-
- if (res)
- return ctx.merge_id;
-
- return 0;
+ if (end - p >= 4 && strncmp (p, "<ui>", 4) == 0)
+ needs_root = FALSE;
+
+ return add_ui_from_string (self, buffer, length, needs_root, error);
}
/**
@@ -963,7 +998,7 @@ gtk_ui_manager_add_ui_from_file (GtkUIManager *self,
if (!g_file_get_contents (filename, &buffer, &length, error))
return 0;
- res = gtk_ui_manager_add_ui_from_string (self, buffer, length, error);
+ res = add_ui_from_string (self, buffer, length, FALSE, error);
g_free (buffer);
return res;
@@ -1572,25 +1607,25 @@ gtk_ui_manager_dirty_all (GtkUIManager *self)
static const gchar *open_tag_format[] = {
"%*s<UNDECIDED>\n",
- "%*s<Root>\n",
- "%*s<menu name=\"%s\">\n",
- "%*s<submenu name=\"%s\" verb=\"%s\">\n",
- "%*s<dockitem name=\"%s\">\n",
+ "%*s<ui>\n",
+ "%*s<menubar name=\"%s\">\n",
+ "%*s<menu name=\"%s\" action=\"%s\">\n",
+ "%*s<toolbar name=\"%s\">\n",
"%*s<placeholder name=\"%s\">\n",
"%*s<placeholder name=\"%s\">\n",
"%*s<popups>\n",
- "%*s<menuitem name=\"%s\" verb=\"%s\"/>\n",
- "%*s<toolitem name=\"%s\" verb=\"%s\"/>\n",
+ "%*s<menuitem name=\"%s\" action=\"%s\"/>\n",
+ "%*s<toolitem name=\"%s\" action=\"%s\"/>\n",
"%*s<separator/>\n",
"%*s<popup name=\"%s\">\n"
};
static const gchar *close_tag_format[] = {
"%*s</UNDECIDED>\n",
- "%*s</Root>\n",
+ "%*s</ui>\n",
+ "%*s</menubar>\n",
"%*s</menu>\n",
- "%*s</submenu>\n",
- "%*s</dockitem>\n",
+ "%*s</toolbar>\n",
"%*s</placeholder>\n",
"%*s</placeholder>\n",
"%*s</popups>\n",
diff --git a/gtk/gtkuimanager.h b/gtk/gtkuimanager.h
index 90e4e52191..a6c1e6dfe4 100644
--- a/gtk/gtkuimanager.h
+++ b/gtk/gtkuimanager.h
@@ -95,7 +95,7 @@ GtkWidget *gtk_ui_manager_get_widget (GtkUIManager *self,
* interface */
guint gtk_ui_manager_add_ui_from_string (GtkUIManager *self,
const gchar *buffer,
- gsize length,
+ gssize length,
GError **error);
guint gtk_ui_manager_add_ui_from_file (GtkUIManager *self,
const gchar *filename,
diff --git a/tests/merge-1.ui b/tests/merge-1.ui
index 8ff6a72b2b..30fac10f8c 100644
--- a/tests/merge-1.ui
+++ b/tests/merge-1.ui
@@ -1,20 +1,22 @@
<!--*- xml -*-->
-<Root>
- <menu>
- <submenu name="FileMenu" verb="StockFileMenuAction">
- <menuitem name="Open" verb="OpenAction" />
- </submenu>
- <submenu name="EditMenu" verb="StockEditMenuAction">
- <menuitem name="Cut" verb="CutAction" />
- </submenu>
+<ui>
+ <menubar>
+ <menu name="FileMenu" action="StockFileMenuAction">
+ <menuitem name="Open" action="OpenAction" />
+ </menu>
+ <menu name="EditMenu" action="StockEditMenuAction">
+ <menuitem name="Cut" action="CutAction" />
+ </menu>
<placeholder name="TestPlaceholder" />
- </menu>
- <dockitem name="toolbar1">
- <placeholder name="ToolbarPlaceholder" />
- <toolitem name="NewButton" verb="NewAction" />
- <toolitem name="CutButton" verb="CutAction" />
- <toolitem name="CopyButton" verb="CopyAction" />
- <toolitem name="PasteButton" verb="PasteAction" />
+ </menubar>
+ <toolbar name="toolbar1">
+ <placeholder name="ToolbarPlaceholder">
+ <toolitem name="nb2" action="NewAction" />
+ </placeholder>
+ <toolitem name="NewButton" action="NewAction" />
+ <toolitem name="CutButton" action="CutAction" />
+ <toolitem name="CopyButton" action="CopyAction" />
+ <toolitem name="PasteButton" action="PasteAction" />
<placeholder name="JustifyToolItems"/>
- </dockitem>
-</Root>
+ </toolbar>
+</ui>
diff --git a/tests/merge-2.ui b/tests/merge-2.ui
index cf32ecfcc4..8a059298d1 100644
--- a/tests/merge-2.ui
+++ b/tests/merge-2.ui
@@ -1,27 +1,27 @@
<!--*- xml -*-->
-<Root>
- <menu>
- <submenu name="FileMenu" verb="StockFileMenuAction">
- <menuitem name="New" verb="NewAction" pos="top" />
+<ui>
+ <menubar>
+ <menu name="FileMenu" action="StockFileMenuAction">
+ <menuitem name="New" action="NewAction" pos="top" />
<separator />
- <menuitem name="Quit" verb="QuitAction" />
- </submenu>
- <submenu name="HelpMenu" verb="StockHelpMenuAction">
- <menuitem name="About" verb="AboutAction" />
- </submenu>
- </menu>
- <dockitem name="toolbar1">
+ <menuitem name="Quit" action="QuitAction" />
+ </menu>
+ <menu name="HelpMenu" action="StockHelpMenuAction">
+ <menuitem name="About" action="AboutAction" />
+ </menu>
+ </menubar>
+ <toolbar name="toolbar1">
<placeholder name="ToolbarPlaceholder">
- <toolitem name="Quit" verb="QuitAction" />
+ <toolitem name="Quit" action="QuitAction" />
<separator />
</placeholder>
- </dockitem>
+ </toolbar>
<popups>
- <popup name="FileMenu" verb="StockFileMenuAction">
- <menuitem name="New" verb="NewAction" pos="top" />
- <submenu name="HelpMenu" verb="StockHelpMenuAction">
- <menuitem name="About" verb="AboutAction" />
- </submenu>
+ <popup name="FileMenu" action="StockFileMenuAction">
+ <menuitem name="New" action="NewAction" pos="top" />
+ <menu name="HelpMenu" action="StockHelpMenuAction">
+ <menuitem name="About" action="AboutAction" />
+ </menu>
</popup>
</popups>
-</Root>
+</ui>
diff --git a/tests/merge-3.ui b/tests/merge-3.ui
index 397930d27e..9fce79cb21 100644
--- a/tests/merge-3.ui
+++ b/tests/merge-3.ui
@@ -1,23 +1,23 @@
<!--*- xml -*-->
-<Root>
- <menu>
- <submenu name="FileMenu" verb="StockFileMenuAction">
- <menuitem name="New" verb="New2Action" />
- </submenu>
+<ui>
+ <menubar>
+ <menu name="FileMenu" action="StockFileMenuAction">
+ <menuitem name="New" action="New2Action" />
+ </menu>
<placeholder name="TestPlaceholder">
- <submenu name="Test">
- <menuitem name="Cut" verb="CutAction" />
- </submenu>
+ <menu name="Test">
+ <menuitem name="Cut" action="CutAction" />
+ </menu>
</placeholder>
- </menu>
- <dockitem name="toolbar1">
+ </menubar>
+ <toolbar name="toolbar1">
<placeholder name="JustifyToolItems">
<separator name="first-sep"/>
- <toolitem name="Left" verb="justify-left"/>
- <toolitem name="Centre" verb="justify-center"/>
- <toolitem name="Right" verb="justify-right"/>
- <toolitem name="Fill" verb="justify-fill"/>
+ <toolitem name="Left" action="justify-left"/>
+ <toolitem name="Centre" action="justify-center"/>
+ <toolitem name="Right" action="justify-right"/>
+ <toolitem name="Fill" action="justify-fill"/>
<separator name="second-sep" />
</placeholder>
- </dockitem>
-</Root>
+ </toolbar>
+</ui>
diff --git a/tests/testactions.c b/tests/testactions.c
index 131d0ccd20..9a3ae08200 100644
--- a/tests/testactions.c
+++ b/tests/testactions.c
@@ -141,58 +141,56 @@ static guint n_entries = G_N_ELEMENTS (entries);
/* XML description of the menus for the test app. The parser understands
* a subset of the Bonobo UI XML format, and uses GMarkup for parsing */
static const gchar *ui_info =
-"<Root>\n"
-" <menu>\n"
-" <submenu name=\"Menu _1\" verb=\"Menu1Action\">\n"
-" <menuitem name=\"cut\" verb=\"cut\" />\n"
-" <menuitem name=\"copy\" verb=\"copy\" />\n"
-" <menuitem name=\"paste\" verb=\"paste\" />\n"
+" <menubar>\n"
+" <menu name=\"Menu _1\" action=\"Menu1Action\">\n"
+" <menuitem name=\"cut\" action=\"cut\" />\n"
+" <menuitem name=\"copy\" action=\"copy\" />\n"
+" <menuitem name=\"paste\" action=\"paste\" />\n"
" <separator name=\"sep1\" />\n"
-" <menuitem name=\"bold1\" verb=\"bold\" />\n"
-" <menuitem name=\"bold2\" verb=\"bold\" />\n"
+" <menuitem name=\"bold1\" action=\"bold\" />\n"
+" <menuitem name=\"bold2\" action=\"bold\" />\n"
" <separator name=\"sep2\" />\n"
-" <menuitem name=\"toggle-cnp\" verb=\"toggle-cnp\" />\n"
+" <menuitem name=\"toggle-cnp\" action=\"toggle-cnp\" />\n"
" <separator name=\"sep3\" />\n"
-" <menuitem name=\"quit\" verb=\"quit\" />\n"
-" </submenu>\n"
-" <submenu name=\"Menu _2\" verb=\"Menu2Action\">\n"
-" <menuitem name=\"cut\" verb=\"cut\" />\n"
-" <menuitem name=\"copy\" verb=\"copy\" />\n"
-" <menuitem name=\"paste\" verb=\"paste\" />\n"
+" <menuitem name=\"quit\" action=\"quit\" />\n"
+" </menu>\n"
+" <menu name=\"Menu _2\" action=\"Menu2Action\">\n"
+" <menuitem name=\"cut\" action=\"cut\" />\n"
+" <menuitem name=\"copy\" action=\"copy\" />\n"
+" <menuitem name=\"paste\" action=\"paste\" />\n"
" <separator name=\"sep4\"/>\n"
-" <menuitem name=\"bold\" verb=\"bold\" />\n"
+" <menuitem name=\"bold\" action=\"bold\" />\n"
" <separator name=\"sep5\"/>\n"
-" <menuitem name=\"justify-left\" verb=\"justify-left\" />\n"
-" <menuitem name=\"justify-center\" verb=\"justify-center\" />\n"
-" <menuitem name=\"justify-right\" verb=\"justify-right\" />\n"
-" <menuitem name=\"justify-fill\" verb=\"justify-fill\" />\n"
+" <menuitem name=\"justify-left\" action=\"justify-left\" />\n"
+" <menuitem name=\"justify-center\" action=\"justify-center\" />\n"
+" <menuitem name=\"justify-right\" action=\"justify-right\" />\n"
+" <menuitem name=\"justify-fill\" action=\"justify-fill\" />\n"
" <separator name=\"sep6\"/>\n"
-" <menuitem name=\"customise-accels\" verb=\"customise-accels\" />\n"
+" <menuitem name=\"customise-accels\" action=\"customise-accels\" />\n"
" <separator name=\"sep7\"/>\n"
-" <menuitem verb=\"toolbar-icons\" />\n"
-" <menuitem verb=\"toolbar-text\" />\n"
-" <menuitem verb=\"toolbar-both\" />\n"
-" <menuitem verb=\"toolbar-both-horiz\" />\n"
+" <menuitem action=\"toolbar-icons\" />\n"
+" <menuitem action=\"toolbar-text\" />\n"
+" <menuitem action=\"toolbar-both\" />\n"
+" <menuitem action=\"toolbar-both-horiz\" />\n"
" <separator name=\"sep8\"/>\n"
-" <menuitem verb=\"toolbar-small-icons\" />\n"
-" <menuitem verb=\"toolbar-large-icons\" />\n"
-" </submenu>\n"
-" </menu>\n"
-" <dockitem name=\"toolbar\">\n"
-" <toolitem name=\"cut\" verb=\"cut\" />\n"
-" <toolitem name=\"copy\" verb=\"copy\" />\n"
-" <toolitem name=\"paste\" verb=\"paste\" />\n"
+" <menuitem action=\"toolbar-small-icons\" />\n"
+" <menuitem action=\"toolbar-large-icons\" />\n"
+" </menu>\n"
+" </menubar>\n"
+" <toolbar name=\"toolbar\">\n"
+" <toolitem name=\"cut\" action=\"cut\" />\n"
+" <toolitem name=\"copy\" action=\"copy\" />\n"
+" <toolitem name=\"paste\" action=\"paste\" />\n"
" <separator name=\"sep9\" />\n"
-" <toolitem name=\"bold\" verb=\"bold\" />\n"
+" <toolitem name=\"bold\" action=\"bold\" />\n"
" <separator name=\"sep10\" />\n"
-" <toolitem name=\"justify-left\" verb=\"justify-left\" />\n"
-" <toolitem name=\"justify-center\" verb=\"justify-center\" />\n"
-" <toolitem name=\"justify-right\" verb=\"justify-right\" />\n"
-" <toolitem name=\"justify-fill\" verb=\"justify-fill\" />\n"
+" <toolitem name=\"justify-left\" action=\"justify-left\" />\n"
+" <toolitem name=\"justify-center\" action=\"justify-center\" />\n"
+" <toolitem name=\"justify-right\" action=\"justify-right\" />\n"
+" <toolitem name=\"justify-fill\" action=\"justify-fill\" />\n"
" <separator name=\"sep11\"/>\n"
-" <toolitem name=\"quit\" verb=\"quit\" />\n"
-" </dockitem>\n"
-"</Root>\n";
+" <toolitem name=\"quit\" action=\"quit\" />\n"
+" </toolbar>\n";
static void
add_widget (GtkUIManager *merge,