3
* There are several widgets involved in displaying menus. The
4
* GtkMenuBar widget is a horizontal menu bar, which normally appears
5
* at the top of an application. The GtkMenu widget is the actual menu
6
* that pops up. Both GtkMenuBar and GtkMenu are subclasses of
7
* GtkMenuShell; a GtkMenuShell contains menu items
8
* (GtkMenuItem). Each menu item contains text and/or images and can
9
* be selected by the user.
11
* There are several kinds of menu item, including plain GtkMenuItem,
12
* GtkCheckMenuItem which can be checked/unchecked, GtkRadioMenuItem
13
* which is a check menu item that's in a mutually exclusive group,
14
* GtkSeparatorMenuItem which is a separator bar, GtkTearoffMenuItem
15
* which allows a GtkMenu to be torn off, and GtkImageMenuItem which
16
* can place a GtkImage or other widget next to the menu text.
18
* A GtkMenuItem can have a submenu, which is simply a GtkMenu to pop
19
* up when the menu item is selected. Typically, all menu items in a menu bar
22
* The GtkOptionMenu widget is a button that pops up a GtkMenu when clicked.
23
* It's used inside dialogs and such.
25
* GtkItemFactory provides a higher-level interface for creating menu bars
26
* and menus; while you can construct menus manually, most people don't
27
* do that. There's a separate demo for GtkItemFactory.
33
menu_window : PGtkWidget;
35
function create_menu (depth : gint;
36
tearoff : gboolean): PGtkWidget;
39
menuitem : PGtkWidget;
50
menu := gtk_menu_new ();
55
menuitem := gtk_tearoff_menu_item_new ();
56
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
57
gtk_widget_show (menuitem);
63
buf := g_strdup_printf ('item %2d - %d', [depth, j]);
64
menuitem := gtk_radio_menu_item_new_with_label (group, buf);
65
group := gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
67
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
68
gtk_widget_show (menuitem);
71
gtk_widget_set_sensitive (menuitem, FALSE);
73
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (depth - 1, TRUE));
82
function do_menus : PGtkWidget;
91
menuitem : PGtkWidget;
93
accel_group : PGtkAccelGroup;
96
if menu_window = NULL then
98
menu_window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
100
g_signal_connect (menu_window, 'destroy',
101
G_CALLBACK(@gtk_widget_destroyed), @menu_window);
102
g_signal_connect (menu_window, 'delete-event',
103
G_CALLBACK (@gtk_true), NULL);
105
accel_group := gtk_accel_group_new ();
106
gtk_window_add_accel_group (GTK_WINDOW (menu_window), accel_group);
108
gtk_window_set_title (GTK_WINDOW (menu_window), 'Menus');
109
gtk_container_set_border_width (GTK_CONTAINER (menu_window), 0);
112
box1 := gtk_vbox_new (FALSE, 0);
113
gtk_container_add (GTK_CONTAINER (menu_window), box1);
114
gtk_widget_show (box1);
116
menubar := gtk_menu_bar_new ();
117
gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
118
gtk_widget_show (menubar);
120
menu := create_menu (2, TRUE);
122
menuitem := gtk_menu_item_new_with_label ('test'#13#10'line2');
123
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
124
gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
125
gtk_widget_show (menuitem);
127
menuitem := gtk_menu_item_new_with_label ('foo');
128
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (3, TRUE));
129
gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
130
gtk_widget_show (menuitem);
132
menuitem := gtk_menu_item_new_with_label ('bar');
133
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (4, TRUE));
134
gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
135
gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
136
gtk_widget_show (menuitem);
138
box2 := gtk_vbox_new (FALSE, 10);
139
gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
140
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
141
gtk_widget_show (box2);
143
menu := create_menu (1, FALSE);
144
gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
146
menuitem := gtk_separator_menu_item_new ();
147
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
148
gtk_widget_show (menuitem);
150
menuitem := gtk_check_menu_item_new_with_label ('Accelerate Me');
151
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
152
gtk_widget_show (menuitem);
153
gtk_widget_add_accelerator (menuitem,
160
menuitem := gtk_check_menu_item_new_with_label ('Accelerator Locked');
161
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
162
gtk_widget_show (menuitem);
163
gtk_widget_add_accelerator (menuitem,
168
GTK_ACCEL_VISIBLE or GTK_ACCEL_LOCKED);
170
menuitem := gtk_check_menu_item_new_with_label ('Accelerators Frozen');
171
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
172
gtk_widget_show (menuitem);
173
gtk_widget_add_accelerator (menuitem,
180
gtk_widget_add_accelerator (menuitem,
187
optionmenu := gtk_option_menu_new ();
188
gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
189
gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
190
gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
191
gtk_widget_show (optionmenu);
193
separator := gtk_hseparator_new ();
194
gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
195
gtk_widget_show (separator);
197
box2 := gtk_vbox_new (FALSE, 10);
198
gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
199
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
200
gtk_widget_show (box2);
202
button := gtk_button_new_with_label ('close');
203
g_signal_connect_swapped (button, 'clicked',
204
G_CALLBACK(@gtk_widget_destroy), menu_window);
206
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
207
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
208
gtk_widget_grab_default (button);
209
gtk_widget_show (button);
212
if not GTK_WIDGET_VISIBLE (menu_window) then
213
gtk_widget_show (menu_window)
215
gtk_widget_destroy (menu_window);
219
do_menus := menu_window;