Add powerbox hook
[gtk-with-powerbox.git] / tests / testmenus.c
blobb29db5329a52c500a7e8b056f58800b7d1833129
1 /* testmenus.c -- dynamically add and remove items to a menu
2 * Copyright (C) 2002 Red Hat, Inc.
3 * Author: Owen Taylor
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
22 #include "config.h"
23 #include <gtk/gtk.h>
24 #include <gdk/gdkkeysyms.h>
26 #include <stdio.h>
28 static GtkWidget *
29 create_menu (gint depth,
30 gboolean tearoff)
32 GtkWidget *menu;
33 GtkWidget *menuitem;
34 GSList *group;
35 char buf[32];
36 int i, j;
38 if (depth < 1)
39 return NULL;
41 menu = gtk_menu_new ();
42 group = NULL;
44 if (tearoff)
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);
59 if (i == 3)
60 gtk_widget_set_sensitive (menuitem, FALSE);
62 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (depth - 1, TRUE));
65 return menu;
68 static gboolean
69 change_item (gpointer user_data)
71 GtkWidget *widget;
72 GtkMenuShell *shell = GTK_MENU_SHELL (user_data);
73 static gint step = 0;
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);
84 else
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);
95 return TRUE;
98 int
99 main (int argc, char **argv)
101 static GtkWidget *window = NULL;
102 GtkWidget *box1;
103 GtkWidget *box2;
104 GtkWidget *button;
105 GtkWidget *optionmenu;
106 GtkWidget *separator;
108 gtk_init (&argc, &argv);
110 if (!window)
112 GtkWidget *menubar;
113 GtkWidget *menu;
114 GtkWidget *submenu;
115 GtkWidget *menuitem;
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,
178 "activate",
179 accel_group,
180 GDK_F1,
182 GTK_ACCEL_VISIBLE);
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,
187 "activate",
188 accel_group,
189 GDK_F2,
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,
196 "activate",
197 accel_group,
198 GDK_F2,
200 GTK_ACCEL_VISIBLE);
201 gtk_widget_add_accelerator (menuitem,
202 "activate",
203 accel_group,
204 GDK_F3,
206 GTK_ACCEL_VISIBLE);
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);
236 else
238 gtk_widget_destroy (window);
239 window = NULL;
242 gtk_main ();
244 return 0;