+static guint ui_id = 0;
+static GtkActionGroup *dag = NULL;
+
+static void
+ensure_update (GtkUIManager *manager)
+{
+ GTimer *timer;
+ double seconds;
+ gulong microsecs;
+
+ timer = g_timer_new ();
+ g_timer_start (timer);
+
+ gtk_ui_manager_ensure_update (manager);
+
+ g_timer_stop (timer);
+ seconds = g_timer_elapsed (timer, µsecs);
+ g_timer_destroy (timer);
+
+ g_print ("Time: %fs\n", seconds);
+}
+
+static void
+add_cb (GtkWidget *button,
+ GtkUIManager *manager)
+{
+ GtkWidget *spinbutton;
+ GtkAction *action;
+ int i, num;
+ char *name, *label;
+
+ if (ui_id != 0 || dag != NULL)
+ return;
+
+ spinbutton = g_object_get_data (G_OBJECT (button), "spinbutton");
+ num = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinbutton));
+
+ dag = gtk_action_group_new ("DynamicActions");
+ gtk_ui_manager_insert_action_group (manager, dag, 0);
+
+ ui_id = gtk_ui_manager_new_merge_id (manager);
+
+ for (i = 0; i < num; i++)
+ {
+ name = g_strdup_printf ("DynAction%u", i);
+ label = g_strdup_printf ("Dynamic Item %d", i);
+
+ action = g_object_new (GTK_TYPE_ACTION,
+ "name", name,
+ "label", label,
+ NULL);
+ gtk_action_group_add_action (dag, action);
+ g_object_unref (action);
+
+ gtk_ui_manager_add_ui (manager, ui_id, "/menubar/DynamicMenu",
+ name, name,
+ GTK_UI_MANAGER_MENUITEM, FALSE);
+ }
+
+ ensure_update (manager);
+}
+
+static void
+remove_cb (GtkWidget *button,
+ GtkUIManager *manager)
+{
+ if (ui_id == 0 || dag == NULL)
+ return;
+
+ gtk_ui_manager_remove_ui (manager, ui_id);
+ ensure_update (manager);
+ ui_id = 0;
+
+ gtk_ui_manager_remove_action_group (manager, dag);
+ g_object_unref (dag);
+ dag = NULL;
+}
+