|
Packit |
98cdb6 |
/* testmenus.c -- dynamically add and remove items to a menu
|
|
Packit |
98cdb6 |
* Copyright (C) 2002 Red Hat, Inc.
|
|
Packit |
98cdb6 |
* Author: Owen Taylor
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
98cdb6 |
* modify it under the terms of the GNU Library General Public
|
|
Packit |
98cdb6 |
* License as published by the Free Software Foundation; either
|
|
Packit |
98cdb6 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
98cdb6 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
98cdb6 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
98cdb6 |
* Library General Public License for more details.
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* You should have received a copy of the GNU Library General Public
|
|
Packit |
98cdb6 |
* License along with this library; if not, write to the
|
|
Packit |
98cdb6 |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Packit |
98cdb6 |
* Boston, MA 02111-1307, USA.
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#undef GTK_DISABLE_DEPRECATED
|
|
Packit |
98cdb6 |
#include "config.h"
|
|
Packit |
98cdb6 |
#include <gtk/gtk.h>
|
|
Packit |
98cdb6 |
#include <gdk/gdkkeysyms.h>
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#include <stdio.h>
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static GtkWidget *
|
|
Packit |
98cdb6 |
create_menu (gint depth,
|
|
Packit |
98cdb6 |
gboolean tearoff)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GtkWidget *menu;
|
|
Packit |
98cdb6 |
GtkWidget *menuitem;
|
|
Packit |
98cdb6 |
GSList *group;
|
|
Packit |
98cdb6 |
char buf[32];
|
|
Packit |
98cdb6 |
int i, j;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (depth < 1)
|
|
Packit |
98cdb6 |
return NULL;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
menu = gtk_menu_new ();
|
|
Packit |
98cdb6 |
group = NULL;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (tearoff)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
menuitem = gtk_tearoff_menu_item_new ();
|
|
Packit |
98cdb6 |
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_show (menuitem);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0, j = 1; i < depth / 4 * 100 + 5; i++, j++)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
sprintf (buf, "item %2d - %d", depth, j);
|
|
Packit |
98cdb6 |
menuitem = gtk_radio_menu_item_new_with_label (group, buf);
|
|
Packit |
98cdb6 |
group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_show (menuitem);
|
|
Packit |
98cdb6 |
if (i == 3)
|
|
Packit |
98cdb6 |
gtk_widget_set_sensitive (menuitem, FALSE);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (depth - 1, TRUE));
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return menu;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static gboolean
|
|
Packit |
98cdb6 |
change_item (gpointer user_data)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GtkWidget *widget;
|
|
Packit |
98cdb6 |
GtkMenuShell *shell = GTK_MENU_SHELL (user_data);
|
|
Packit |
98cdb6 |
static gint step = 0;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (((step++ / 40) % 2) == 0)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
g_message ("Idle add");
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
widget = gtk_menu_item_new_with_label ("Foo");
|
|
Packit |
98cdb6 |
gtk_widget_show (widget);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_menu_shell_append (shell, widget);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GList *children = gtk_container_get_children (GTK_CONTAINER (shell));
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_message ("Idle remove");
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_widget_destroy (g_list_last (children)->data);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_list_free (children);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return TRUE;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
int
|
|
Packit |
98cdb6 |
main (int argc, char **argv)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
static GtkWidget *window = NULL;
|
|
Packit |
98cdb6 |
GtkWidget *box1;
|
|
Packit |
98cdb6 |
GtkWidget *box2;
|
|
Packit |
98cdb6 |
GtkWidget *button;
|
|
Packit |
98cdb6 |
GtkWidget *optionmenu;
|
|
Packit |
98cdb6 |
GtkWidget *separator;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_init (&argc, &argv);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (!window)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GtkWidget *menubar;
|
|
Packit |
98cdb6 |
GtkWidget *menu;
|
|
Packit |
98cdb6 |
GtkWidget *submenu;
|
|
Packit |
98cdb6 |
GtkWidget *menuitem;
|
|
Packit |
98cdb6 |
GtkAccelGroup *accel_group;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_signal_connect (window, "destroy",
|
|
Packit |
98cdb6 |
G_CALLBACK(gtk_main_quit), NULL);
|
|
Packit |
98cdb6 |
g_signal_connect (window, "delete-event",
|
|
Packit |
98cdb6 |
G_CALLBACK (gtk_true), NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
accel_group = gtk_accel_group_new ();
|
|
Packit |
98cdb6 |
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_window_set_title (GTK_WINDOW (window), "menus");
|
|
Packit |
98cdb6 |
gtk_container_set_border_width (GTK_CONTAINER (window), 0);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
box1 = gtk_vbox_new (FALSE, 0);
|
|
Packit |
98cdb6 |
gtk_container_add (GTK_CONTAINER (window), box1);
|
|
Packit |
98cdb6 |
gtk_widget_show (box1);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
menubar = gtk_menu_bar_new ();
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
|
|
Packit |
98cdb6 |
gtk_widget_show (menubar);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
menu = create_menu (2, TRUE);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
menuitem = gtk_menu_item_new_with_label ("test\nline2");
|
|
Packit |
98cdb6 |
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
|
|
Packit |
98cdb6 |
gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_show (menuitem);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
menuitem = gtk_menu_item_new_with_label ("dynamic");
|
|
Packit |
98cdb6 |
submenu = create_menu (3, TRUE);
|
|
Packit |
98cdb6 |
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
|
|
Packit |
98cdb6 |
gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_show (menuitem);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gdk_threads_add_timeout (250, change_item, submenu);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
menuitem = gtk_menu_item_new_with_label ("bar");
|
|
Packit |
98cdb6 |
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (4, TRUE));
|
|
Packit |
98cdb6 |
gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
|
|
Packit |
98cdb6 |
gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_show (menuitem);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
box2 = gtk_vbox_new (FALSE, 10);
|
|
Packit |
98cdb6 |
gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
|
|
Packit |
98cdb6 |
gtk_widget_show (box2);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
menu = create_menu (1, FALSE);
|
|
Packit |
98cdb6 |
gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
menuitem = gtk_separator_menu_item_new ();
|
|
Packit |
98cdb6 |
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_show (menuitem);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
|
|
Packit |
98cdb6 |
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_show (menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_add_accelerator (menuitem,
|
|
Packit |
98cdb6 |
"activate",
|
|
Packit |
98cdb6 |
accel_group,
|
|
Packit |
98cdb6 |
GDK_F1,
|
|
Packit |
98cdb6 |
0,
|
|
Packit |
98cdb6 |
GTK_ACCEL_VISIBLE);
|
|
Packit |
98cdb6 |
menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
|
|
Packit |
98cdb6 |
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_show (menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_add_accelerator (menuitem,
|
|
Packit |
98cdb6 |
"activate",
|
|
Packit |
98cdb6 |
accel_group,
|
|
Packit |
98cdb6 |
GDK_F2,
|
|
Packit |
98cdb6 |
0,
|
|
Packit |
98cdb6 |
GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
|
|
Packit |
98cdb6 |
menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
|
|
Packit |
98cdb6 |
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_show (menuitem);
|
|
Packit |
98cdb6 |
gtk_widget_add_accelerator (menuitem,
|
|
Packit |
98cdb6 |
"activate",
|
|
Packit |
98cdb6 |
accel_group,
|
|
Packit |
98cdb6 |
GDK_F2,
|
|
Packit |
98cdb6 |
0,
|
|
Packit |
98cdb6 |
GTK_ACCEL_VISIBLE);
|
|
Packit |
98cdb6 |
gtk_widget_add_accelerator (menuitem,
|
|
Packit |
98cdb6 |
"activate",
|
|
Packit |
98cdb6 |
accel_group,
|
|
Packit |
98cdb6 |
GDK_F3,
|
|
Packit |
98cdb6 |
0,
|
|
Packit |
98cdb6 |
GTK_ACCEL_VISIBLE);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
optionmenu = gtk_option_menu_new ();
|
|
Packit |
98cdb6 |
gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
|
|
Packit |
98cdb6 |
gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
|
|
Packit |
98cdb6 |
gtk_widget_show (optionmenu);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
separator = gtk_hseparator_new ();
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
|
|
Packit |
98cdb6 |
gtk_widget_show (separator);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
box2 = gtk_vbox_new (FALSE, 10);
|
|
Packit |
98cdb6 |
gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
|
|
Packit |
98cdb6 |
gtk_widget_show (box2);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
button = gtk_button_new_with_label ("close");
|
|
Packit |
98cdb6 |
g_signal_connect_swapped (button, "clicked",
|
|
Packit |
98cdb6 |
G_CALLBACK(gtk_widget_destroy), window);
|
|
Packit |
98cdb6 |
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
|
|
Packit |
98cdb6 |
gtk_widget_set_can_default (button, TRUE);
|
|
Packit |
98cdb6 |
gtk_widget_grab_default (button);
|
|
Packit |
98cdb6 |
gtk_widget_show (button);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (!gtk_widget_get_visible (window))
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gtk_widget_show (window);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
else
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gtk_widget_destroy (window);
|
|
Packit |
98cdb6 |
window = NULL;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gtk_main ();
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return 0;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|