From 6d0cb3232e46d0ed07d0cb66bd9bfc9253e291ea Mon Sep 17 00:00:00 2001 From: Soeren Sandmann Date: Fri, 8 Nov 2002 20:16:43 +0000 Subject: [PATCH] add testmenus.c, a program to test menus when items are dynamically added Fri Nov 8 21:15:25 2002 Soeren Sandmann * tests/Makefile.am: add testmenus.c, a program to test menus when items are dynamically added and removed. --- ChangeLog | 5 + ChangeLog.pre-2-10 | 5 + ChangeLog.pre-2-2 | 5 + ChangeLog.pre-2-4 | 5 + ChangeLog.pre-2-6 | 5 + ChangeLog.pre-2-8 | 5 + tests/Makefile.am | 3 + tests/testmenus.c | 232 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 265 insertions(+) create mode 100644 tests/testmenus.c diff --git a/ChangeLog b/ChangeLog index d430f92aa0..efa337da0a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Nov 8 21:15:25 2002 Soeren Sandmann + + * tests/Makefile.am: add testmenus.c, a program to test menus when + items are dynamically added and removed. + Fri Nov 8 20:14:52 2002 Soeren Sandmann * docs/reference/gdk/tmpl/dnd.sgml diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index d430f92aa0..efa337da0a 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,8 @@ +Fri Nov 8 21:15:25 2002 Soeren Sandmann + + * tests/Makefile.am: add testmenus.c, a program to test menus when + items are dynamically added and removed. + Fri Nov 8 20:14:52 2002 Soeren Sandmann * docs/reference/gdk/tmpl/dnd.sgml diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index d430f92aa0..efa337da0a 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,8 @@ +Fri Nov 8 21:15:25 2002 Soeren Sandmann + + * tests/Makefile.am: add testmenus.c, a program to test menus when + items are dynamically added and removed. + Fri Nov 8 20:14:52 2002 Soeren Sandmann * docs/reference/gdk/tmpl/dnd.sgml diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index d430f92aa0..efa337da0a 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,8 @@ +Fri Nov 8 21:15:25 2002 Soeren Sandmann + + * tests/Makefile.am: add testmenus.c, a program to test menus when + items are dynamically added and removed. + Fri Nov 8 20:14:52 2002 Soeren Sandmann * docs/reference/gdk/tmpl/dnd.sgml diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index d430f92aa0..efa337da0a 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,8 @@ +Fri Nov 8 21:15:25 2002 Soeren Sandmann + + * tests/Makefile.am: add testmenus.c, a program to test menus when + items are dynamically added and removed. + Fri Nov 8 20:14:52 2002 Soeren Sandmann * docs/reference/gdk/tmpl/dnd.sgml diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index d430f92aa0..efa337da0a 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,8 @@ +Fri Nov 8 21:15:25 2002 Soeren Sandmann + + * tests/Makefile.am: add testmenus.c, a program to test menus when + items are dynamically added and removed. + Fri Nov 8 20:14:52 2002 Soeren Sandmann * docs/reference/gdk/tmpl/dnd.sgml diff --git a/tests/Makefile.am b/tests/Makefile.am index 0ecb680d27..3fb971f16e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -33,6 +33,7 @@ noinst_PROGRAMS = \ testdnd \ testgtk \ testinput \ + testmenus \ testmultidisplay \ testmultiscreen \ testrgb \ @@ -58,6 +59,7 @@ testcalendar_DEPENDENCIES = $(TEST_DEPS) testdnd_DEPENDENCIES = $(TEST_DEPS) testgtk_DEPENDENCIES = $(TEST_DEPS) testinput_DEPENDENCIES = $(TEST_DEPS) +testmenus_DEPENDENCIES = $(TEST_DEPS) testmultidisplay_DEPENDENCIES = $(TEST_DEPS) testmultiscreen_DEPENDENCIES = $(TEST_DEPS) testrgb_DEPENDENCIES = $(TEST_DEPS) @@ -80,6 +82,7 @@ testcalendar_LDADD = $(LDADDS) testdnd_LDADD = $(LDADDS) testgtk_LDADD = $(LDADDS) testinput_LDADD = $(LDADDS) +testmenus_LDADD = $(LDADDS) testmultidisplay_LDADD = $(LDADDS) testmultiscreen_LDADD = $(LDADDS) testrgb_LDADD = $(LDADDS) diff --git a/tests/testmenus.c b/tests/testmenus.c new file mode 100644 index 0000000000..732cf98b9b --- /dev/null +++ b/tests/testmenus.c @@ -0,0 +1,232 @@ +/* Menus + * + * This program dynamically adds and removes items to a menu to test that + * scroll arrows operate correctly. + * + * Written by Owen Taylor + */ + +#include +#include + +#include + +static GtkWidget * +create_menu (gint depth, + gboolean tearoff) +{ + GtkWidget *menu; + GtkWidget *menuitem; + GSList *group; + char buf[32]; + int i, j; + + if (depth < 1) + return NULL; + + menu = gtk_menu_new (); + group = NULL; + + if (tearoff) + { + menuitem = gtk_tearoff_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + } + + for (i = 0, j = 1; i < 5; i++, j++) + { + sprintf (buf, "item %2d - %d", depth, j); + menuitem = gtk_radio_menu_item_new_with_label (group, buf); + group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); + + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + if (i == 3) + gtk_widget_set_sensitive (menuitem, FALSE); + + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (depth - 1, TRUE)); + } + + return menu; +} + +static gboolean +change_item (gpointer user_data) +{ + GtkWidget *widget; + GtkMenuShell *shell = GTK_MENU_SHELL (user_data); + static gint step = 0; + + if (((step++ / 40) % 2) == 0) + { + g_message ("Idle add"); + + widget = gtk_menu_item_new_with_label ("Foo"); + gtk_widget_show (widget); + + gtk_menu_shell_append (shell, widget); + } + else + { + GList *children = gtk_container_get_children (GTK_CONTAINER (shell)); + + g_message ("Idle remove"); + + gtk_widget_destroy (g_list_last (children)->data); + + g_list_free (children); + } + + return TRUE; +} + +int +main (int argc, char **argv) +{ + static GtkWidget *window = NULL; + GtkWidget *box1; + GtkWidget *box2; + GtkWidget *button; + GtkWidget *optionmenu; + GtkWidget *separator; + + gtk_init (&argc, &argv); + + if (!window) + { + GtkWidget *menubar; + GtkWidget *menu; + GtkWidget *submenu; + GtkWidget *menuitem; + GtkAccelGroup *accel_group; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + g_signal_connect (window, "destroy", + G_CALLBACK(gtk_main_quit), NULL); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_true), NULL); + + accel_group = gtk_accel_group_new (); + gtk_window_add_accel_group (GTK_WINDOW (window), accel_group); + + gtk_window_set_title (GTK_WINDOW (window), "menus"); + gtk_container_set_border_width (GTK_CONTAINER (window), 0); + + + box1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (window), box1); + gtk_widget_show (box1); + + menubar = gtk_menu_bar_new (); + gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0); + gtk_widget_show (menubar); + + menu = create_menu (2, TRUE); + + menuitem = gtk_menu_item_new_with_label ("test\nline2"); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu); + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem); + gtk_widget_show (menuitem); + + + menuitem = gtk_menu_item_new_with_label ("dynamic"); + submenu = create_menu (3, TRUE); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu); + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem); + gtk_widget_show (menuitem); + + g_timeout_add (250, change_item, submenu); + + menuitem = gtk_menu_item_new_with_label ("bar"); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (4, TRUE)); + gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE); + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem); + gtk_widget_show (menuitem); + + box2 = gtk_vbox_new (FALSE, 10); + gtk_container_set_border_width (GTK_CONTAINER (box2), 10); + gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); + gtk_widget_show (box2); + + menu = create_menu (1, FALSE); + gtk_menu_set_accel_group (GTK_MENU (menu), accel_group); + + menuitem = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + + menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, + "activate", + accel_group, + GDK_F1, + 0, + GTK_ACCEL_VISIBLE); + menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, + "activate", + accel_group, + GDK_F2, + 0, + GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED); + menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + gtk_widget_add_accelerator (menuitem, + "activate", + accel_group, + GDK_F2, + 0, + GTK_ACCEL_VISIBLE); + gtk_widget_add_accelerator (menuitem, + "activate", + accel_group, + GDK_F3, + 0, + GTK_ACCEL_VISIBLE); + + optionmenu = gtk_option_menu_new (); + gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu); + gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3); + gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0); + gtk_widget_show (optionmenu); + + separator = gtk_hseparator_new (); + gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0); + gtk_widget_show (separator); + + box2 = gtk_vbox_new (FALSE, 10); + gtk_container_set_border_width (GTK_CONTAINER (box2), 10); + gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0); + gtk_widget_show (box2); + + button = gtk_button_new_with_label ("close"); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK(gtk_widget_destroy), window); + gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); + GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); + gtk_widget_grab_default (button); + gtk_widget_show (button); + } + + if (!GTK_WIDGET_VISIBLE (window)) + { + gtk_widget_show (window); + } + else + { + gtk_widget_destroy (window); + window = NULL; + } + + gtk_main (); + + return 0; +} +