Blame examples/menu/itemfactory.c

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
}