diff options
author | Soeren Sandmann <sandmann@daimi.au.dk> | 2002-11-08 20:16:43 +0000 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@src.gnome.org> | 2002-11-08 20:16:43 +0000 |
commit | 6d0cb3232e46d0ed07d0cb66bd9bfc9253e291ea (patch) | |
tree | dee4f559d2c165324ea8d79ba6b03af164b639c6 /tests/testmenus.c | |
parent | b1165617b79f589695172db638bd101c44c74ea6 (diff) | |
download | gtk+-6d0cb3232e46d0ed07d0cb66bd9bfc9253e291ea.tar.gz |
add testmenus.c, a program to test menus when items are dynamically added
Fri Nov 8 21:15:25 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* tests/Makefile.am: add testmenus.c, a program to test menus when
items are dynamically added and removed.
Diffstat (limited to 'tests/testmenus.c')
-rw-r--r-- | tests/testmenus.c | 232 |
1 files changed, 232 insertions, 0 deletions
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 <otaylor@redhat.com> + */ + +#include <gtk/gtk.h> +#include <gdk/gdkkeysyms.h> + +#include <stdio.h> + +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; +} + |