GTK+ 1.2 Tutorial
Prev | Chapter 14. Menu Widget | Next

# Item Factory Example

Here is an example using the GTK item factory.

    /* 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 (optional)
               "<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 )
    {
      GtkItemFactory *item_factory;
      GtkAccelGroup *accel_group;
      gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);

      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_window_add_accel_group (GTK_WINDOW (window), accel_group);

      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 */

For now, there's only this example. An explanation and lots 'o' comments will follow later.

Prev | Home | Next
Using ItemFactory | Up | Text Widget