+ /*
+ * XXX This comment is replicated in the WIN32 section and
+ * XXX maybe also in the menu code. Can we move the info
+ * XXX to one central place and *reference* it from here?
+ *
+ * Do not execute the application's mouse callback if a menu
+ * is hooked to this button. In that case an appropriate
+ * private call should be generated.
+ * Near as I can tell, this is the menu behaviour:
+ * - Down-click the menu button, menu not active: activate
+ * the menu with its upper left-hand corner at the mouse
+ * location.
+ * - Down-click any button outside the menu, menu active:
+ * deactivate the menu
+ * - Down-click any button inside the menu, menu active:
+ * select the menu entry and deactivate the menu
+ * - Up-click the menu button, menu not active: nothing happens
+ * - Up-click the menu button outside the menu, menu active:
+ * nothing happens
+ * - Up-click the menu button inside the menu, menu active:
+ * select the menu entry and deactivate the menu
+ */
+ /* Window has an active menu, it absorbs any mouse click */
+ if( window->ActiveMenu )
+ {
+ if( window == window->ActiveMenu->ParentWindow )
+ {
+ window->ActiveMenu->Window->State.MouseX =
+ event.xbutton.x_root - window->ActiveMenu->X;
+ window->ActiveMenu->Window->State.MouseY =
+ event.xbutton.y_root - window->ActiveMenu->Y;
+ }
+
+ /* In the menu, invoke the callback and deactivate the menu*/
+ if( fgCheckActiveMenu( window->ActiveMenu->Window,
+ window->ActiveMenu ) )
+ {
+ /*
+ * Save the current window and menu and set the current
+ * window to the window whose menu this is
+ */
+ SFG_Window *save_window = fgStructure.Window;
+ SFG_Menu *save_menu = fgStructure.Menu;
+ SFG_Window *parent_window =
+ window->ActiveMenu->ParentWindow;
+ fgSetWindow( parent_window );
+ fgStructure.Menu = window->ActiveMenu;
+
+ /* Execute the menu callback */
+ fgExecuteMenuCallback( window->ActiveMenu );
+ fgDeactivateMenu( parent_window );
+
+ /* Restore the current window and menu */
+ fgSetWindow( save_window );
+ fgStructure.Menu = save_menu;
+ }
+ else if( pressed )
+ /*
+ * Outside the menu, deactivate if it's a downclick
+ *
+ * XXX This isn't enough. A downclick outside of
+ * XXX the interior of our freeglut windows should also
+ * XXX deactivate the menu. This is more complicated.
+ */
+ fgDeactivateMenu( window->ActiveMenu->ParentWindow );