3 * The GtkUIManager object allows the easy creation of menus
4 * from an array of actions and a description of the menu hierarchy.
10 activate_action (GtkAction *action)
12 g_message ("Action \"%s\" activated", gtk_action_get_name (action));
16 activate_radio_action (GtkAction *action, GtkRadioAction *current)
18 g_message ("Radio action \"%s\" selected",
19 gtk_action_get_name (GTK_ACTION (current)));
22 static GtkActionEntry entries[] = {
23 { "FileMenu", NULL, "_File" }, /* name, stock id, label */
24 { "PreferencesMenu", NULL, "_Preferences" }, /* name, stock id, label */
25 { "ColorMenu", NULL, "_Color" }, /* name, stock id, label */
26 { "ShapeMenu", NULL, "_Shape" }, /* name, stock id, label */
27 { "HelpMenu", NULL, "_Help" }, /* name, stock id, label */
28 { "New", GTK_STOCK_NEW, /* name, stock id */
29 "_New", "<control>N", /* label, accelerator */
30 "Create a new file", /* tooltip */
31 G_CALLBACK (activate_action) },
32 { "Open", GTK_STOCK_OPEN, /* name, stock id */
33 "_Open","<control>O", /* label, accelerator */
34 "Open a file", /* tooltip */
35 G_CALLBACK (activate_action) },
36 { "Save", GTK_STOCK_SAVE, /* name, stock id */
37 "_Save","<control>S", /* label, accelerator */
38 "Save current file", /* tooltip */
39 G_CALLBACK (activate_action) },
40 { "SaveAs", GTK_STOCK_SAVE, /* name, stock id */
41 "Save _As...", NULL, /* label, accelerator */
42 "Save to a file", /* tooltip */
43 G_CALLBACK (activate_action) },
44 { "Quit", GTK_STOCK_QUIT, /* name, stock id */
45 "_Quit", "<control>Q", /* label, accelerator */
47 G_CALLBACK (activate_action) },
48 { "About", NULL, /* name, stock id */
49 "_About", "<control>A", /* label, accelerator */
50 "About", /* tooltip */
51 G_CALLBACK (activate_action) },
52 { "Logo", "demo-gtk-logo", /* name, stock id */
53 NULL, NULL, /* label, accelerator */
55 G_CALLBACK (activate_action) },
57 static guint n_entries = G_N_ELEMENTS (entries);
60 static GtkToggleActionEntry toggle_entries[] = {
61 { "Bold", GTK_STOCK_BOLD, /* name, stock id */
62 "_Bold", "<control>B", /* label, accelerator */
64 G_CALLBACK (activate_action),
65 TRUE }, /* is_active */
67 static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries);
75 static GtkRadioActionEntry color_entries[] = {
76 { "Red", NULL, /* name, stock id */
77 "_Red", "<control>R", /* label, accelerator */
78 "Blood", COLOR_RED }, /* tooltip, value */
79 { "Green", NULL, /* name, stock id */
80 "_Green", "<control>G", /* label, accelerator */
81 "Grass", COLOR_GREEN }, /* tooltip, value */
82 { "Blue", NULL, /* name, stock id */
83 "_Blue", "<control>B", /* label, accelerator */
84 "Sky", COLOR_BLUE }, /* tooltip, value */
86 static guint n_color_entries = G_N_ELEMENTS (color_entries);
94 static GtkRadioActionEntry shape_entries[] = {
95 { "Square", NULL, /* name, stock id */
96 "_Square", "<control>S", /* label, accelerator */
97 "Square", SHAPE_SQUARE }, /* tooltip, value */
98 { "Rectangle", NULL, /* name, stock id */
99 "_Rectangle", "<control>R", /* label, accelerator */
100 "Rectangle", SHAPE_RECTANGLE }, /* tooltip, value */
101 { "Oval", NULL, /* name, stock id */
102 "_Oval", "<control>O", /* label, accelerator */
103 "Egg", SHAPE_OVAL }, /* tooltip, value */
105 static guint n_shape_entries = G_N_ELEMENTS (shape_entries);
107 static const gchar *ui_info =
109 " <menubar name='MenuBar'>"
110 " <menu action='FileMenu'>"
111 " <menuitem action='New'/>"
112 " <menuitem action='Open'/>"
113 " <menuitem action='Save'/>"
114 " <menuitem action='SaveAs'/>"
116 " <menuitem action='Quit'/>"
118 " <menu action='PreferencesMenu'>"
119 " <menu action='ColorMenu'>"
120 " <menuitem action='Red'/>"
121 " <menuitem action='Green'/>"
122 " <menuitem action='Blue'/>"
124 " <menu action='ShapeMenu'>"
125 " <menuitem action='Square'/>"
126 " <menuitem action='Rectangle'/>"
127 " <menuitem action='Oval'/>"
129 " <menuitem action='Bold'/>"
131 " <menu action='HelpMenu'>"
132 " <menuitem action='About'/>"
135 " <toolbar name='ToolBar'>"
136 " <toolitem action='Open'/>"
137 " <toolitem action='Quit'/>"
138 " <separator action='Sep1'/>"
139 " <toolitem action='Logo'/>"
144 do_ui_manager (GtkWidget *do_widget)
146 static GtkWidget *window = NULL;
152 GtkWidget *separator;
156 GtkActionGroup *actions;
157 GError *error = NULL;
159 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
160 gtk_window_set_screen (GTK_WINDOW (window),
161 gtk_widget_get_screen (do_widget));
163 g_signal_connect (window, "destroy",
164 G_CALLBACK (gtk_widget_destroyed), &window);
165 g_signal_connect (window, "delete-event",
166 G_CALLBACK (gtk_true), NULL);
168 actions = gtk_action_group_new ("Actions");
169 gtk_action_group_add_actions (actions, entries, n_entries, NULL);
170 gtk_action_group_add_toggle_actions (actions,
171 toggle_entries, n_toggle_entries,
173 gtk_action_group_add_radio_actions (actions,
174 color_entries, n_color_entries,
176 G_CALLBACK (activate_radio_action),
178 gtk_action_group_add_radio_actions (actions,
179 shape_entries, n_shape_entries,
181 G_CALLBACK (activate_radio_action),
184 ui = gtk_ui_manager_new ();
185 gtk_ui_manager_insert_action_group (ui, actions, 0);
186 g_object_unref (actions);
187 gtk_window_add_accel_group (GTK_WINDOW (window),
188 gtk_ui_manager_get_accel_group (ui));
189 gtk_window_set_title (GTK_WINDOW (window), "UI Manager");
190 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
193 if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, -1, &error))
195 g_message ("building menus failed: %s", error->message);
196 g_error_free (error);
199 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
200 gtk_container_add (GTK_CONTAINER (window), box1);
202 gtk_box_pack_start (GTK_BOX (box1),
203 gtk_ui_manager_get_widget (ui, "/MenuBar"),
206 label = gtk_label_new ("Type\n<alt>\nto start");
207 gtk_widget_set_size_request (label, 200, 200);
208 gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
209 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
212 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
213 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
216 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
217 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
218 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
220 button = gtk_button_new_with_label ("close");
221 g_signal_connect_swapped (button, "clicked",
222 G_CALLBACK (gtk_widget_destroy), window);
223 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
224 gtk_widget_set_can_default (button, TRUE);
225 gtk_widget_grab_default (button);
227 gtk_widget_show_all (window);
232 gtk_widget_destroy (window);