1 /* testmenus.c -- dynamically add and remove items to a menu
2 * Copyright (C) 2002 Red Hat, Inc.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
21 #undef GTK_DISABLE_DEPRECATED
24 #include <gdk/gdkkeysyms.h>
29 create_menu (gint depth
,
41 menu
= gtk_menu_new ();
46 menuitem
= gtk_tearoff_menu_item_new ();
47 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), menuitem
);
48 gtk_widget_show (menuitem
);
51 for (i
= 0, j
= 1; i
< 5; i
++, j
++)
53 sprintf (buf
, "item %2d - %d", depth
, j
);
54 menuitem
= gtk_radio_menu_item_new_with_label (group
, buf
);
55 group
= gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem
));
57 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), menuitem
);
58 gtk_widget_show (menuitem
);
60 gtk_widget_set_sensitive (menuitem
, FALSE
);
62 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem
), create_menu (depth
- 1, TRUE
));
69 change_item (gpointer user_data
)
72 GtkMenuShell
*shell
= GTK_MENU_SHELL (user_data
);
75 if (((step
++ / 40) % 2) == 0)
77 g_message ("Idle add");
79 widget
= gtk_menu_item_new_with_label ("Foo");
80 gtk_widget_show (widget
);
82 gtk_menu_shell_append (shell
, widget
);
86 GList
*children
= gtk_container_get_children (GTK_CONTAINER (shell
));
88 g_message ("Idle remove");
90 gtk_widget_destroy (g_list_last (children
)->data
);
92 g_list_free (children
);
99 main (int argc
, char **argv
)
101 static GtkWidget
*window
= NULL
;
105 GtkWidget
*optionmenu
;
106 GtkWidget
*separator
;
108 gtk_init (&argc
, &argv
);
116 GtkAccelGroup
*accel_group
;
118 window
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
120 g_signal_connect (window
, "destroy",
121 G_CALLBACK(gtk_main_quit
), NULL
);
122 g_signal_connect (window
, "delete-event",
123 G_CALLBACK (gtk_true
), NULL
);
125 accel_group
= gtk_accel_group_new ();
126 gtk_window_add_accel_group (GTK_WINDOW (window
), accel_group
);
128 gtk_window_set_title (GTK_WINDOW (window
), "menus");
129 gtk_container_set_border_width (GTK_CONTAINER (window
), 0);
132 box1
= gtk_vbox_new (FALSE
, 0);
133 gtk_container_add (GTK_CONTAINER (window
), box1
);
134 gtk_widget_show (box1
);
136 menubar
= gtk_menu_bar_new ();
137 gtk_box_pack_start (GTK_BOX (box1
), menubar
, FALSE
, TRUE
, 0);
138 gtk_widget_show (menubar
);
140 menu
= create_menu (2, TRUE
);
142 menuitem
= gtk_menu_item_new_with_label ("test\nline2");
143 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem
), menu
);
144 gtk_menu_shell_append (GTK_MENU_SHELL (menubar
), menuitem
);
145 gtk_widget_show (menuitem
);
148 menuitem
= gtk_menu_item_new_with_label ("dynamic");
149 submenu
= create_menu (3, TRUE
);
150 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem
), submenu
);
151 gtk_menu_shell_append (GTK_MENU_SHELL (menubar
), menuitem
);
152 gtk_widget_show (menuitem
);
154 gdk_threads_add_timeout (250, change_item
, submenu
);
156 menuitem
= gtk_menu_item_new_with_label ("bar");
157 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem
), create_menu (4, TRUE
));
158 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem
), TRUE
);
159 gtk_menu_shell_append (GTK_MENU_SHELL (menubar
), menuitem
);
160 gtk_widget_show (menuitem
);
162 box2
= gtk_vbox_new (FALSE
, 10);
163 gtk_container_set_border_width (GTK_CONTAINER (box2
), 10);
164 gtk_box_pack_start (GTK_BOX (box1
), box2
, TRUE
, TRUE
, 0);
165 gtk_widget_show (box2
);
167 menu
= create_menu (1, FALSE
);
168 gtk_menu_set_accel_group (GTK_MENU (menu
), accel_group
);
170 menuitem
= gtk_separator_menu_item_new ();
171 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), menuitem
);
172 gtk_widget_show (menuitem
);
174 menuitem
= gtk_check_menu_item_new_with_label ("Accelerate Me");
175 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), menuitem
);
176 gtk_widget_show (menuitem
);
177 gtk_widget_add_accelerator (menuitem
,
183 menuitem
= gtk_check_menu_item_new_with_label ("Accelerator Locked");
184 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), menuitem
);
185 gtk_widget_show (menuitem
);
186 gtk_widget_add_accelerator (menuitem
,
191 GTK_ACCEL_VISIBLE
| GTK_ACCEL_LOCKED
);
192 menuitem
= gtk_check_menu_item_new_with_label ("Accelerators Frozen");
193 gtk_menu_shell_append (GTK_MENU_SHELL (menu
), menuitem
);
194 gtk_widget_show (menuitem
);
195 gtk_widget_add_accelerator (menuitem
,
201 gtk_widget_add_accelerator (menuitem
,
208 optionmenu
= gtk_option_menu_new ();
209 gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu
), menu
);
210 gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu
), 3);
211 gtk_box_pack_start (GTK_BOX (box2
), optionmenu
, TRUE
, TRUE
, 0);
212 gtk_widget_show (optionmenu
);
214 separator
= gtk_hseparator_new ();
215 gtk_box_pack_start (GTK_BOX (box1
), separator
, FALSE
, TRUE
, 0);
216 gtk_widget_show (separator
);
218 box2
= gtk_vbox_new (FALSE
, 10);
219 gtk_container_set_border_width (GTK_CONTAINER (box2
), 10);
220 gtk_box_pack_start (GTK_BOX (box1
), box2
, FALSE
, TRUE
, 0);
221 gtk_widget_show (box2
);
223 button
= gtk_button_new_with_label ("close");
224 g_signal_connect_swapped (button
, "clicked",
225 G_CALLBACK(gtk_widget_destroy
), window
);
226 gtk_box_pack_start (GTK_BOX (box2
), button
, TRUE
, TRUE
, 0);
227 GTK_WIDGET_SET_FLAGS (button
, GTK_CAN_DEFAULT
);
228 gtk_widget_grab_default (button
);
229 gtk_widget_show (button
);
232 if (!GTK_WIDGET_VISIBLE (window
))
234 gtk_widget_show (window
);
238 gtk_widget_destroy (window
);