mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-19 01:40:10 +00:00
109 lines
3.9 KiB
C
109 lines
3.9 KiB
C
|
/* example-start menu itemfactory.c */
|
||
|
|
||
|
#include <gtk/gtk.h>
|
||
|
#include <strings.h>
|
||
|
|
||
|
/* Obligatory basic callback */
|
||
|
static void print_hello(GtkWidget *w, gpointer data) {
|
||
|
g_message("Hello, World!\n");
|
||
|
}
|
||
|
|
||
|
/* This is the GtkItemFactoryEntry structure used to generate new menus.
|
||
|
Item 1: The menu path. The letter after the underscore indicates an
|
||
|
accelerator key once the menu is open.
|
||
|
Item 2: The accelerator key for the entry
|
||
|
Item 3: The callback function.
|
||
|
Item 4: The callback action. This changes the parameters with
|
||
|
which the function is called. The default is 0.
|
||
|
Item 5: The item type, used to define what kind of an item it is.
|
||
|
Here are the possible values:
|
||
|
|
||
|
NULL -> "<Item>"
|
||
|
"" -> "<Item>"
|
||
|
"<Title>" -> create a title item
|
||
|
"<Item>" -> create a simple item
|
||
|
"<CheckItem>" -> create a check item
|
||
|
"<ToggleItem>" -> create a toggle item
|
||
|
"<RadioItem>" -> create a radio item
|
||
|
<path> -> path of a radio item to link against
|
||
|
"<Separator>" -> create a separator
|
||
|
"<Branch>" -> create an item to hold sub items
|
||
|
"<LastBranch>" -> create a right justified branch
|
||
|
*/
|
||
|
|
||
|
static GtkItemFactoryEntry menu_items[] = {
|
||
|
{"/_File", NULL, NULL, 0, "<Branch>"},
|
||
|
{"/File/_New", "<control>N", print_hello, 0, NULL},
|
||
|
{"/File/_Open", "<control>O", print_hello, 0, NULL},
|
||
|
{"/File/_Save", "<control>S", print_hello, 0, NULL},
|
||
|
{"/File/Save _As", NULL, NULL, 0, NULL},
|
||
|
{"/File/sep1", NULL, NULL, 0, "<Separator>"},
|
||
|
{"/File/Quit", "<control>Q", gtk_main_quit, 0, NULL},
|
||
|
{"/_Options", NULL, NULL, 0, "<Branch>"},
|
||
|
{"/Options/Test", NULL, NULL, 0, NULL},
|
||
|
{"/_Help", NULL, NULL, 0, "<LastBranch>"},
|
||
|
{"/_Help/About", NULL, NULL, 0, NULL},
|
||
|
};
|
||
|
|
||
|
|
||
|
void get_main_menu(GtkWidget *window, GtkWidget ** menubar) {
|
||
|
int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]);
|
||
|
GtkItemFactory *item_factory;
|
||
|
GtkAccelGroup *accel_group;
|
||
|
|
||
|
accel_group = gtk_accel_group_new();
|
||
|
|
||
|
/* This function initializes the item factory.
|
||
|
Param 1: The type of menu - can be GTK_TYPE_MENU_BAR, GTK_TYPE_MENU,
|
||
|
or GTK_TYPE_OPTION_MENU.
|
||
|
Param 2: The path of the menu.
|
||
|
Param 3: A pointer to a gtk_accel_group. The item factory sets up
|
||
|
the accelerator table while generating menus.
|
||
|
*/
|
||
|
|
||
|
item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>",
|
||
|
accel_group);
|
||
|
|
||
|
/* This function generates the menu items. Pass the item factory,
|
||
|
the number of items in the array, the array itself, and any
|
||
|
callback data for the the menu items. */
|
||
|
gtk_item_factory_create_items(item_factory, nmenu_items, menu_items, NULL);
|
||
|
|
||
|
/* Attach the new accelerator group to the window. */
|
||
|
gtk_accel_group_attach (accel_group, GTK_OBJECT (window));
|
||
|
|
||
|
if (menubar)
|
||
|
/* Finally, return the actual menu bar created by the item factory. */
|
||
|
*menubar = gtk_item_factory_get_widget(item_factory, "<main>");
|
||
|
}
|
||
|
|
||
|
int main(int argc, char *argv[]) {
|
||
|
GtkWidget *window;
|
||
|
GtkWidget *main_vbox;
|
||
|
GtkWidget *menubar;
|
||
|
|
||
|
gtk_init(&argc, &argv);
|
||
|
|
||
|
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||
|
gtk_signal_connect(GTK_OBJECT(window), "destroy",
|
||
|
GTK_SIGNAL_FUNC(gtk_main_quit),
|
||
|
"WM destroy");
|
||
|
gtk_window_set_title(GTK_WINDOW(window), "Item Factory");
|
||
|
gtk_widget_set_usize(GTK_WIDGET(window), 300, 200);
|
||
|
|
||
|
main_vbox = gtk_vbox_new(FALSE, 1);
|
||
|
gtk_container_border_width(GTK_CONTAINER(main_vbox), 1);
|
||
|
gtk_container_add(GTK_CONTAINER(window), main_vbox);
|
||
|
gtk_widget_show(main_vbox);
|
||
|
|
||
|
get_main_menu(window, &menubar);
|
||
|
gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0);
|
||
|
gtk_widget_show(menubar);
|
||
|
|
||
|
gtk_widget_show(window);
|
||
|
gtk_main();
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
/* example-end */
|