20.9. Displaying Menus

20.9.1. Problem

You want to display a menu bar at the
top of a GTK window.

20.9.2. Solution

Create a GtkMenu. Create individual
GtkMenuItem objects for each menu item you want to
display and add each menu item to the
GtkMenu with
append( ). Then, create a root menu
GtkMenuItem with the label that should appear in
the menu bar (e.g., "File" or
"Options"). Add the menu to the
root menu with set_submenu(
). Create a
GtkMenuBar and
add the root menu to the menu bar with append( ).
Finally, add the menu bar to the window:

20.9.3. Discussion

A menu
involves a hierarchy of quite a few objects. The
GtkWindow (or another container) holds the
GtkMenuBar. The GtkMenuBar
holds a GtkMenuItem for each top-level menu in the
menu bar (e.g., "File,"
"Options," or
"Help"). Each top-level
GtkMenuItem has a GtkMenu as a
submenu. That submenu contains each GtkMenuItem
that should appear under the top-level menu.

As with any GTK widget, a GtkMenuItem object can
have callbacks that handle
signals. When a menu item is selected, it triggers the
activate signal. To take action when a menu item
is selected, connect its activate signal to a
callback. Here's a version of the button-and-label
time display from Recipe 20.8 with two menu
items: "Update," which updates the
time in the label, and "Quit,"
which quits the program:

Callbacks are connected to the menu items with their
connect( ) methods. The callbacks are connected to
the activate signals towards the end of the code
because the call to $menu_item_1->connect( )
passes $label to update_time(
). For
$label to be successfully passed to
update_time( ) while the program is running,
connect( ) has to be called after
$label is instantiated.