That should about do it. Let's take a look at an example to help clarify.
let uprint msg () = print_endline msg; flush stdout let create_file_menu ~packing () = let file_menu = GMenu.menu ~packing () in let f (label, callback) = let item = GMenu.menu_item ~label ~packing:file_menu#append () in ignore (item#connect#activate ~callback) in List.iter f [("Open", uprint "Open"); ("Save", uprint "Save"); ("Quit", GMain.Main.quit)]; file_menu let button_pressed menu ev = let button = GdkEvent.Button.button ev in if button = 3 then ( menu#popup ~button ~time:(GdkEvent.Button.time ev); true ) else false let main () = let window = GWindow.window ~title:"GMenu Demo" () in window#connect#destroy ~callback:GMain.Main.quit; let vbox = GPack.vbox ~packing:window#add () in let menu_bar = GMenu.menu_bar ~packing:vbox#add () in let file_item = GMenu.menu_item ~label:"File" ~packing:menu_bar#append () in let menu = create_file_menu ~packing:file_item#set_submenu () in let view = GText.view ~width:200 ~height:100 ~packing:vbox#add () in view#event#connect#button_press ~callback:(button_pressed menu); window#show (); GMain.Main.main () let _ = main ()
You may also set a menu item to be insensitive and, using an accelerator table, bind keys to menu functions.