home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam  

Book HomePHP CookbookSearch this book

20.9. Displaying Menus

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:

// create the window
$window = &new GtkWindow();

// create a container for the label and the button
$container = &new GtkVBox();

// create a menu
$menu = &new GtkMenu();

// create a menu item and add it to the menu
$menu_item_1 = &new GtkMenuItem('Update');

// create another menu item and add it to the menu
$menu_item_2 = &new GtkMenuItem('Quit');

// create a root menu and add the existing menu to it
$root_menu = &new GtkMenuItem('File');

// create a menu bar and add the root menu to it
$menu_bar = &new GtkMenuBar();

// add the menu to the container

// create a label showing the time
$label = &new GtkLabel(strftime('%c'));

// add the label to the container

// create a button
$button = &new GtkButton('Update Time');

/* set the update_time() function as the callback for the "clicked" signal
   and pass $label to the callback */

function update_time($b,$lb) {

// add the button to the container

// when the Update menu item is selected, call update_time()

// when the Quit menu item is selected, quit

// add the container to the window

// display the window

// necessary so that the program exits properly
function shutdown() { gtk::main_quit(); }

// start GTK's signal handling loop

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.

Library Navigation Links

Copyright © 2003 O'Reilly & Associates. All rights reserved.