3 * This program dynamically adds and removes items to a menu to test that
4 * scroll arrows operate correctly.
6 * Written by Owen Taylor <otaylor@redhat.com>
10 #include <gdk/gdkkeysyms.h>
15 create_menu (gint depth,
27 menu = gtk_menu_new ();
32 menuitem = gtk_tearoff_menu_item_new ();
33 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
34 gtk_widget_show (menuitem);
37 for (i = 0, j = 1; i < 5; i++, j++)
39 sprintf (buf, "item %2d - %d", depth, j);
40 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
41 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
43 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
44 gtk_widget_show (menuitem);
46 gtk_widget_set_sensitive (menuitem, FALSE);
48 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (depth - 1, TRUE));
55 change_item (gpointer user_data)
58 GtkMenuShell *shell = GTK_MENU_SHELL (user_data);
61 if (((step++ / 40) % 2) == 0)
63 g_message ("Idle add");
65 widget = gtk_menu_item_new_with_label ("Foo");
66 gtk_widget_show (widget);
68 gtk_menu_shell_append (shell, widget);
72 GList *children = gtk_container_get_children (GTK_CONTAINER (shell));
74 g_message ("Idle remove");
76 gtk_widget_destroy (g_list_last (children)->data);
78 g_list_free (children);
85 main (int argc, char **argv)
87 static GtkWidget *window = NULL;
91 GtkWidget *optionmenu;
94 gtk_init (&argc, &argv);
102 GtkAccelGroup *accel_group;
104 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
106 g_signal_connect (window, "destroy",
107 G_CALLBACK(gtk_main_quit), NULL);
108 g_signal_connect (window, "delete-event",
109 G_CALLBACK (gtk_true), NULL);
111 accel_group = gtk_accel_group_new ();
112 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
114 gtk_window_set_title (GTK_WINDOW (window), "menus");
115 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
118 box1 = gtk_vbox_new (FALSE, 0);
119 gtk_container_add (GTK_CONTAINER (window), box1);
120 gtk_widget_show (box1);
122 menubar = gtk_menu_bar_new ();
123 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
124 gtk_widget_show (menubar);
126 menu = create_menu (2, TRUE);
128 menuitem = gtk_menu_item_new_with_label ("test\nline2");
129 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
130 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
131 gtk_widget_show (menuitem);
134 menuitem = gtk_menu_item_new_with_label ("dynamic");
135 submenu = create_menu (3, TRUE);
136 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
137 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
138 gtk_widget_show (menuitem);
140 g_timeout_add (250, change_item, submenu);
142 menuitem = gtk_menu_item_new_with_label ("bar");
143 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (4, TRUE));
144 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
145 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
146 gtk_widget_show (menuitem);
148 box2 = gtk_vbox_new (FALSE, 10);
149 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
150 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
151 gtk_widget_show (box2);
153 menu = create_menu (1, FALSE);
154 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
156 menuitem = gtk_separator_menu_item_new ();
157 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
158 gtk_widget_show (menuitem);
160 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
161 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
162 gtk_widget_show (menuitem);
163 gtk_widget_add_accelerator (menuitem,
169 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
170 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
171 gtk_widget_show (menuitem);
172 gtk_widget_add_accelerator (menuitem,
177 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
178 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
179 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
180 gtk_widget_show (menuitem);
181 gtk_widget_add_accelerator (menuitem,
187 gtk_widget_add_accelerator (menuitem,
194 optionmenu = gtk_option_menu_new ();
195 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
196 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
197 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
198 gtk_widget_show (optionmenu);
200 separator = gtk_hseparator_new ();
201 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
202 gtk_widget_show (separator);
204 box2 = gtk_vbox_new (FALSE, 10);
205 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
206 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
207 gtk_widget_show (box2);
209 button = gtk_button_new_with_label ("close");
210 g_signal_connect_swapped (button, "clicked",
211 G_CALLBACK(gtk_widget_destroy), window);
212 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
213 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
214 gtk_widget_grab_default (button);
215 gtk_widget_show (button);
218 if (!GTK_WIDGET_VISIBLE (window))
220 gtk_widget_show (window);
224 gtk_widget_destroy (window);