GQuark action_quark;
};
-static void gtk_ui_manager_class_init (GtkUIManagerClass *class);
-static void gtk_ui_manager_init (GtkUIManager *self);
-static void gtk_ui_manager_finalize (GObject *object);
-static void gtk_ui_manager_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void gtk_ui_manager_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-static void gtk_ui_manager_queue_update (GtkUIManager *self);
-static void gtk_ui_manager_dirty_all (GtkUIManager *self);
-
-static GNode *get_child_node (GtkUIManager *self,
- GNode *parent,
- const gchar *childname,
- gint childname_length,
- GtkUIManagerNodeType node_type,
- gboolean create,
- gboolean top);
-static GNode *gtk_ui_manager_get_node (GtkUIManager *self,
- const gchar *path,
- GtkUIManagerNodeType node_type,
- gboolean create);
-static guint gtk_ui_manager_next_merge_id (GtkUIManager *self);
-
-static void gtk_ui_manager_node_prepend_ui_reference (GtkUIManagerNode *node,
- guint merge_id,
- GQuark action_quark);
-static void gtk_ui_manager_node_remove_ui_reference (GtkUIManagerNode *node,
- guint merge_id);
+static void gtk_ui_manager_class_init (GtkUIManagerClass *class);
+static void gtk_ui_manager_init (GtkUIManager *self);
+static void gtk_ui_manager_finalize (GObject *object);
+static void gtk_ui_manager_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void gtk_ui_manager_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void queue_update (GtkUIManager *self);
+static void dirty_all_nodes (GtkUIManager *self);
+static GNode *get_child_node (GtkUIManager *self,
+ GNode *parent,
+ const gchar *childname,
+ gint childname_length,
+ GtkUIManagerNodeType node_type,
+ gboolean create,
+ gboolean top);
+static GNode *get_node (GtkUIManager *self,
+ const gchar *path,
+ GtkUIManagerNodeType node_type,
+ gboolean create);
+
+static void node_prepend_ui_reference (GtkUIManagerNode *node,
+ guint merge_id,
+ GQuark action_quark);
+static void node_remove_ui_reference (GtkUIManagerNode *node,
+ guint merge_id);
enum
/**
* GtkUIManager:add-tearoffs:
*
- * The add-tearoffs property controls whether generated menus
+ * The "add-tearoffs" property controls whether generated menus
* have tearoff menu items.
*
* Note that this only affects regular menus. Generated popup
* GtkUIManager::changed:
* @merge: a #GtkUIManager
*
- * The changed signal is emitted whenever the merged UI changes.
+ * The "changed" signal is emitted whenever the merged UI changes.
*
* Since: 2.4
*/
self->private_data->add_tearoffs = FALSE;
- merge_id = gtk_ui_manager_next_merge_id (self);
+ merge_id = gtk_ui_manager_new_merge_id (self);
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_prepend_ui_reference (NODE_INFO (node), merge_id, 0);
}
static void
* @self: a #GtkUIManager
* @add_tearoffs: whether tearoff menu items are added
*
- * Sets the add_tearoffs property, which controls whether menus
+ * Sets the "add_tearoffs" property, which controls whether menus
* generated by this #GtkUIManager will have tearoff menu items.
*
* Note that this only affects regular menus. Generated popup
{
self->private_data->add_tearoffs = add_tearoffs;
- /* dirty all nodes */
- gtk_ui_manager_dirty_all (self);
+ dirty_all_nodes (self);
g_object_notify (G_OBJECT (self), "add_tearoffs");
}
g_list_insert (self->private_data->action_groups, action_group, pos);
/* dirty all nodes, as action bindings may change */
- gtk_ui_manager_dirty_all (self);
+ dirty_all_nodes (self);
}
/**
g_object_unref (action_group);
/* dirty all nodes, as action bindings may change */
- gtk_ui_manager_dirty_all (self);
+ dirty_all_nodes (self);
}
/**
* widget */
gtk_ui_manager_ensure_update (self);
- node = gtk_ui_manager_get_node (self, path, GTK_UI_MANAGER_UNDECIDED, FALSE);
+ node = get_node (self, path, GTK_UI_MANAGER_UNDECIDED, FALSE);
if (node == NULL)
return NULL;
* the action */
gtk_ui_manager_ensure_update (self);
- node = gtk_ui_manager_get_node (self, path, GTK_UI_MANAGER_UNDECIDED, FALSE);
+ node = get_node (self, path, GTK_UI_MANAGER_UNDECIDED, FALSE);
if (node == NULL)
return NULL;
}
static GNode *
-gtk_ui_manager_get_node (GtkUIManager *self,
- const gchar *path,
- GtkUIManagerNodeType node_type,
- gboolean create)
+get_node (GtkUIManager *self,
+ const gchar *path,
+ GtkUIManagerNodeType node_type,
+ gboolean create)
{
const gchar *pos, *end;
GNode *parent, *node;
return node;
}
-static guint
-gtk_ui_manager_next_merge_id (GtkUIManager *self)
+/**
+ * gtk_ui_manager_new_merge_id:
+ * @self: a #GtkUIManager
+ *
+ * Returns an unused merge id, suitable for use with
+ * gtk_ui_manager_add_ui().
+ *
+ * Return value: an unused merge id.
+ *
+ * Since: 2.4
+ **/
+guint
+gtk_ui_manager_new_merge_id (GtkUIManager *self)
{
self->private_data->last_merge_id++;
}
static void
-gtk_ui_manager_node_prepend_ui_reference (GtkUIManagerNode *node,
- guint merge_id,
- GQuark action_quark)
+node_prepend_ui_reference (GtkUIManagerNode *node,
+ guint merge_id,
+ GQuark action_quark)
{
NodeUIReference *reference;
}
static void
-gtk_ui_manager_node_remove_ui_reference (GtkUIManagerNode *node,
- guint merge_id)
+node_remove_ui_reference (GtkUIManagerNode *node,
+ guint merge_id)
{
GList *p;
ctx->current = self->private_data->root_node;
raise_error = FALSE;
- gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
- ctx->merge_id, action_quark);
+ node_prepend_ui_reference (NODE_INFO (ctx->current),
+ ctx->merge_id, action_quark);
}
break;
case 'm':
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_prepend_ui_reference (NODE_INFO (ctx->current),
+ ctx->merge_id, action_quark);
NODE_INFO (ctx->current)->dirty = TRUE;
raise_error = 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_prepend_ui_reference (NODE_INFO (ctx->current),
+ ctx->merge_id, action_quark);
NODE_INFO (ctx->current)->dirty = TRUE;
raise_error = FALSE;
if (NODE_INFO (node)->action_name == 0)
NODE_INFO (node)->action_name = action_quark;
- gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (node),
- ctx->merge_id, action_quark);
+ node_prepend_ui_reference (NODE_INFO (node),
+ ctx->merge_id, action_quark);
NODE_INFO (node)->dirty = TRUE;
raise_error = 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_prepend_ui_reference (NODE_INFO (ctx->current),
+ ctx->merge_id, action_quark);
NODE_INFO (ctx->current)->dirty = TRUE;
raise_error = FALSE;
GTK_UI_MANAGER_MENU_PLACEHOLDER,
TRUE, top);
- gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (ctx->current),
- ctx->merge_id, action_quark);
+ node_prepend_ui_reference (NODE_INFO (ctx->current),
+ ctx->merge_id, action_quark);
NODE_INFO (ctx->current)->dirty = TRUE;
raise_error = FALSE;
if (NODE_INFO (node)->action_name == 0)
NODE_INFO (node)->action_name = action_quark;
- gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (node),
- ctx->merge_id, action_quark);
+ node_prepend_ui_reference (NODE_INFO (node),
+ ctx->merge_id, action_quark);
NODE_INFO (node)->dirty = TRUE;
raise_error = 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_prepend_ui_reference (NODE_INFO (ctx->current),
+ ctx->merge_id, action_quark);
NODE_INFO (ctx->current)->dirty = TRUE;
raise_error = FALSE;
if (NODE_INFO (node)->action_name == 0)
NODE_INFO (node)->action_name = action_quark;
- gtk_ui_manager_node_prepend_ui_reference (NODE_INFO (node),
- ctx->merge_id, action_quark);
+ node_prepend_ui_reference (NODE_INFO (node),
+ ctx->merge_id, action_quark);
NODE_INFO (node)->dirty = TRUE;
raise_error = FALSE;
ctx.state = STATE_START;
ctx.self = self;
ctx.current = NULL;
- ctx.merge_id = gtk_ui_manager_next_merge_id (self);
+ ctx.merge_id = gtk_ui_manager_new_merge_id (self);
context = g_markup_parse_context_new (&ui_parser, 0, &ctx, NULL);
g_markup_parse_context_free (context);
- gtk_ui_manager_queue_update (self);
+ queue_update (self);
g_signal_emit (self, merge_signals[CHANGED], 0);
return res;
}
+/**
+ * gtk_ui_manager_add_ui:
+ * @self: a #GtkUIManager
+ * @merge_id: the merge id for the merged UI, see gtk_ui_manager_new_merge_id()
+ * @path: a path
+ * @name: the name for the added UI element
+ * @action: the name of the action to be proxied, or %NULL to add a separator
+ *
+ * Adds a UI element to the current contents of @self. The path must lead to
+ * a place where a menuitem or toolitem can be inserted. If @action is %NULL,
+ * a separator is inserted, otherwise a menuitem or toolitem.
+ *
+ * Since: 2.4
+ **/
+void
+gtk_ui_manager_add_ui (GtkUIManager *self,
+ guint merge_id,
+ const gchar *path,
+ const gchar *name,
+ const gchar *action)
+{
+ GNode *node;
+ GNode *child;
+ GtkUIManagerNodeType type;
+ GQuark action_quark = 0;
+
+ g_return_if_fail (GTK_IS_UI_MANAGER (self));
+ g_return_if_fail (merge_id > 0);
+
+ node = get_node (self, path, GTK_UI_MANAGER_UNDECIDED, FALSE);
+
+ if (node == NULL)
+ return;
+
+ switch (NODE_INFO (node)->type)
+ {
+ case GTK_UI_MANAGER_MENU:
+ case GTK_UI_MANAGER_POPUP:
+ case GTK_UI_MANAGER_MENU_PLACEHOLDER:
+ if (action != NULL)
+ type = GTK_UI_MANAGER_MENUITEM;
+ else
+ type = GTK_UI_MANAGER_SEPARATOR;
+ break;
+ case GTK_UI_MANAGER_TOOLBAR:
+ case GTK_UI_MANAGER_TOOLBAR_PLACEHOLDER:
+ if (action != NULL)
+ type = GTK_UI_MANAGER_TOOLITEM;
+ else
+ type = GTK_UI_MANAGER_SEPARATOR;
+ break;
+ default:
+ return;
+ }
+
+ if (name == NULL)
+ {
+ switch (type)
+ {
+ case GTK_UI_MANAGER_MENUITEM:
+ name = "menuitem";
+ break;
+ case GTK_UI_MANAGER_TOOLITEM:
+ name = "toolitem";
+ break;
+ case GTK_UI_MANAGER_SEPARATOR:
+ name = "separator";
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ }
+
+ child = get_child_node (self, node,
+ name, strlen (name),
+ type, TRUE, FALSE);
+
+ if (action != NULL)
+ action_quark = g_quark_from_string (action);
+
+ node_prepend_ui_reference (NODE_INFO (child),
+ merge_id, action_quark);
+
+ if (NODE_INFO (node)->action_name == 0)
+ NODE_INFO (child)->action_name = action_quark;
+
+ NODE_INFO (child)->dirty = TRUE;
+
+ queue_update (self);
+}
+
static gboolean
remove_ui (GNode *node,
gpointer user_data)
{
guint merge_id = GPOINTER_TO_UINT (user_data);
- gtk_ui_manager_node_remove_ui_reference (NODE_INFO (node), merge_id);
+ node_remove_ui_reference (NODE_INFO (node), merge_id);
return FALSE; /* continue */
}
gtk_ui_manager_remove_ui (GtkUIManager *self,
guint merge_id)
{
- g_node_traverse (self->private_data->root_node, G_POST_ORDER, G_TRAVERSE_ALL, -1,
+ g_node_traverse (self->private_data->root_node,
+ G_POST_ORDER, G_TRAVERSE_ALL, -1,
remove_ui, GUINT_TO_POINTER (merge_id));
- gtk_ui_manager_queue_update (self);
+ queue_update (self);
g_signal_emit (self, merge_signals[CHANGED], 0);
}
}
static void
-gtk_ui_manager_queue_update (GtkUIManager *self)
+queue_update (GtkUIManager *self)
{
if (self->private_data->update_tag != 0)
return;
}
static void
-gtk_ui_manager_dirty_all (GtkUIManager *self)
+dirty_all_nodes (GtkUIManager *self)
{
- g_node_traverse (self->private_data->root_node, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
+ g_node_traverse (self->private_data->root_node,
+ G_PRE_ORDER, G_TRAVERSE_ALL, -1,
dirty_traverse_func, NULL);
- gtk_ui_manager_queue_update (self);
+ queue_update (self);
}
static const gchar *open_tag_format[] = {
* gtk_ui_manager_get_ui:
* @self: a #GtkUIManager
*
- * Creates an XML representation of the merged ui.
+ * Creates a <link linkend="XML-UI">description</link> of the merged UI.
*
* Return value: A newly allocated string containing an XML representation of
- * the merged ui.
+ * the merged UI.
*
* Since: 2.4
**/