|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
#include <gtk/gtk.h>
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Obligatory basic callback */
|
|
Packit Service |
fb6fa5 |
static void print_hello( GtkWidget *w,
|
|
Packit Service |
fb6fa5 |
gpointer data )
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_message ("Hello, World!\n");
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* For the check button */
|
|
Packit Service |
fb6fa5 |
static void print_toggle( gpointer callback_data,
|
|
Packit Service |
fb6fa5 |
guint callback_action,
|
|
Packit Service |
fb6fa5 |
GtkWidget *menu_item )
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
g_message ("Check button state - %d\n",
|
|
Packit Service |
fb6fa5 |
GTK_CHECK_MENU_ITEM (menu_item)->active);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* For the radio buttons */
|
|
Packit Service |
fb6fa5 |
static void print_selected( gpointer callback_data,
|
|
Packit Service |
fb6fa5 |
guint callback_action,
|
|
Packit Service |
fb6fa5 |
GtkWidget *menu_item )
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if(GTK_CHECK_MENU_ITEM(menu_item)->active)
|
|
Packit Service |
fb6fa5 |
g_message ("Radio button %d selected\n", callback_action);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */
|
|
Packit Service |
fb6fa5 |
static GtkItemFactoryEntry menu_items[] = {
|
|
Packit Service |
fb6fa5 |
{ "/_File", NULL, NULL, 0, "<Branch>" },
|
|
Packit Service |
fb6fa5 |
{ "/File/_New", "<control>N", print_hello, 0, "<StockItem>", GTK_STOCK_NEW },
|
|
Packit Service |
fb6fa5 |
{ "/File/_Open", "<control>O", print_hello, 0, "<StockItem>", GTK_STOCK_OPEN },
|
|
Packit Service |
fb6fa5 |
{ "/File/_Save", "<control>S", print_hello, 0, "<StockItem>", GTK_STOCK_SAVE },
|
|
Packit Service |
fb6fa5 |
{ "/File/Save _As", NULL, NULL, 0, "<Item>" },
|
|
Packit Service |
fb6fa5 |
{ "/File/sep1", NULL, NULL, 0, "<Separator>" },
|
|
Packit Service |
fb6fa5 |
{ "/File/_Quit", "<CTRL>Q", gtk_main_quit, 0, "<StockItem>", GTK_STOCK_QUIT },
|
|
Packit Service |
fb6fa5 |
{ "/_Options", NULL, NULL, 0, "<Branch>" },
|
|
Packit Service |
fb6fa5 |
{ "/Options/tear", NULL, NULL, 0, "<Tearoff>" },
|
|
Packit Service |
fb6fa5 |
{ "/Options/Check", NULL, print_toggle, 1, "<CheckItem>" },
|
|
Packit Service |
fb6fa5 |
{ "/Options/sep", NULL, NULL, 0, "<Separator>" },
|
|
Packit Service |
fb6fa5 |
{ "/Options/Rad1", NULL, print_selected, 1, "<RadioItem>" },
|
|
Packit Service |
fb6fa5 |
{ "/Options/Rad2", NULL, print_selected, 2, "/Options/Rad1" },
|
|
Packit Service |
fb6fa5 |
{ "/Options/Rad3", NULL, print_selected, 3, "/Options/Rad1" },
|
|
Packit Service |
fb6fa5 |
{ "/_Help", NULL, NULL, 0, "<LastBranch>" },
|
|
Packit Service |
fb6fa5 |
{ "/_Help/About", NULL, NULL, 0, "<Item>" },
|
|
Packit Service |
fb6fa5 |
};
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Returns a menubar widget made from the above menu */
|
|
Packit Service |
fb6fa5 |
static GtkWidget *get_menubar_menu( GtkWidget *window )
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkItemFactory *item_factory;
|
|
Packit Service |
fb6fa5 |
GtkAccelGroup *accel_group;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Make an accelerator group (shortcut keys) */
|
|
Packit Service |
fb6fa5 |
accel_group = gtk_accel_group_new ();
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Make an ItemFactory (that makes a menubar) */
|
|
Packit Service |
fb6fa5 |
item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>",
|
|
Packit Service |
fb6fa5 |
accel_group);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* This function generates the menu items. Pass the item factory,
|
|
Packit Service |
fb6fa5 |
the number of items in the array, the array itself, and any
|
|
Packit Service |
fb6fa5 |
callback data for the the menu items. */
|
|
Packit Service |
fb6fa5 |
gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Attach the new accelerator group to the window. */
|
|
Packit Service |
fb6fa5 |
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Finally, return the actual menu bar created by the item factory. */
|
|
Packit Service |
fb6fa5 |
return gtk_item_factory_get_widget (item_factory, "<main>");
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Popup the menu when the popup button is pressed */
|
|
Packit Service |
fb6fa5 |
static gboolean popup_cb( GtkWidget *widget,
|
|
Packit Service |
fb6fa5 |
GdkEvent *event,
|
|
Packit Service |
fb6fa5 |
GtkWidget *menu )
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GdkEventButton *bevent = (GdkEventButton *)event;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Only take button presses */
|
|
Packit Service |
fb6fa5 |
if (event->type != GDK_BUTTON_PRESS)
|
|
Packit Service |
fb6fa5 |
return FALSE;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Show the menu */
|
|
Packit Service |
fb6fa5 |
gtk_menu_popup (GTK_MENU(menu), NULL, NULL,
|
|
Packit Service |
fb6fa5 |
NULL, NULL, bevent->button, bevent->time);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return TRUE;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Same as with get_menubar_menu() but just return a button with a signal to
|
|
Packit Service |
fb6fa5 |
call a popup menu */
|
|
Packit Service |
fb6fa5 |
GtkWidget *get_popup_menu( void )
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkItemFactory *item_factory;
|
|
Packit Service |
fb6fa5 |
GtkWidget *button, *menu;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Same as before but don't bother with the accelerators */
|
|
Packit Service |
fb6fa5 |
item_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<main>",
|
|
Packit Service |
fb6fa5 |
NULL);
|
|
Packit Service |
fb6fa5 |
gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
|
|
Packit Service |
fb6fa5 |
menu = gtk_item_factory_get_widget (item_factory, "<main>");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Make a button to activate the popup menu */
|
|
Packit Service |
fb6fa5 |
button = gtk_button_new_with_label ("Popup");
|
|
Packit Service |
fb6fa5 |
/* Make the menu popup when clicked */
|
|
Packit Service |
fb6fa5 |
g_signal_connect (G_OBJECT(button),
|
|
Packit Service |
fb6fa5 |
"event",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK(popup_cb),
|
|
Packit Service |
fb6fa5 |
(gpointer) menu);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return button;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Same again but return an option menu */
|
|
Packit Service |
fb6fa5 |
GtkWidget *get_option_menu( void )
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkItemFactory *item_factory;
|
|
Packit Service |
fb6fa5 |
GtkWidget *option_menu;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Same again, not bothering with the accelerators */
|
|
Packit Service |
fb6fa5 |
item_factory = gtk_item_factory_new (GTK_TYPE_OPTION_MENU, "<main>",
|
|
Packit Service |
fb6fa5 |
NULL);
|
|
Packit Service |
fb6fa5 |
gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
|
|
Packit Service |
fb6fa5 |
option_menu = gtk_item_factory_get_widget (item_factory, "<main>");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return option_menu;
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* You have to start somewhere */
|
|
Packit Service |
fb6fa5 |
int main( int argc,
|
|
Packit Service |
fb6fa5 |
char *argv[] )
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkWidget *window;
|
|
Packit Service |
fb6fa5 |
GtkWidget *main_vbox;
|
|
Packit Service |
fb6fa5 |
GtkWidget *menubar, *option_menu, *popup_button;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Initialize GTK */
|
|
Packit Service |
fb6fa5 |
gtk_init (&argc, &argv);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Make a window */
|
|
Packit Service |
fb6fa5 |
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
Packit Service |
fb6fa5 |
g_signal_connect (G_OBJECT (window), "destroy",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK (gtk_main_quit),
|
|
Packit Service |
fb6fa5 |
NULL);
|
|
Packit Service |
fb6fa5 |
gtk_window_set_title (GTK_WINDOW(window), "Item Factory");
|
|
Packit Service |
fb6fa5 |
gtk_widget_set_size_request (GTK_WIDGET(window), 300, 200);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Make a vbox to put the three menus in */
|
|
Packit Service |
fb6fa5 |
main_vbox = gtk_vbox_new (FALSE, 1);
|
|
Packit Service |
fb6fa5 |
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1);
|
|
Packit Service |
fb6fa5 |
gtk_container_add (GTK_CONTAINER (window), main_vbox);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Get the three types of menu */
|
|
Packit Service |
fb6fa5 |
/* Note: all three menus are separately created, so they are not the
|
|
Packit Service |
fb6fa5 |
same menu */
|
|
Packit Service |
fb6fa5 |
menubar = get_menubar_menu (window);
|
|
Packit Service |
fb6fa5 |
popup_button = get_popup_menu ();
|
|
Packit Service |
fb6fa5 |
option_menu = get_option_menu ();
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Pack it all together */
|
|
Packit Service |
fb6fa5 |
gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0);
|
|
Packit Service |
fb6fa5 |
gtk_box_pack_end (GTK_BOX (main_vbox), popup_button, FALSE, TRUE, 0);
|
|
Packit Service |
fb6fa5 |
gtk_box_pack_end (GTK_BOX (main_vbox), option_menu, FALSE, TRUE, 0);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Show the widgets */
|
|
Packit Service |
fb6fa5 |
gtk_widget_show_all (window);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* Finished! */
|
|
Packit Service |
fb6fa5 |
gtk_main ();
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
return 0;
|
|
Packit Service |
fb6fa5 |
}
|