Initial work on callbacks with user data parameters.
[freeglut] / src / fg_menu.c
index bbae132..cad5b83 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * freeglut_menu.c
+ * fg_menu.c
  *
  * Pull-down menu creation and handling.
  *
@@ -65,7 +65,7 @@
  * These variables are for rendering the freeglut menu items.
  *
  * The choices are fore- and background, with and without h for Highlighting.
- * Old GLUT appeared to be system-dependant for its colors (sigh) so we are
+ * Old GLUT appeared to be system-dependent for its colors (sigh) so we are
  * too.  These variables should be stuffed into global state and initialized
  * via the glutInit*() system.
  */
@@ -607,9 +607,9 @@ GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,
                 fgSetWindow( parent_window );
                 fgStructure.CurrentMenu = active_menu;
 
-                /* Deactivate menu and then call callback (we don't want menu to stay in view while callback is executing) */
+                /* Deactivate menu and then call callback (we don't want menu to stay in view while callback is executing, and user should be able to change menus in callback) */
                 fgDeactivateMenu( parent_window );
-                active_menu->Callback( active_entry->ID );
+                active_menu->Callback( active_entry->ID, active_menu->CallbackData );
 
                 /* Restore the current window and menu */
                 fgSetWindow( save_window );
@@ -780,14 +780,27 @@ void fghCalculateMenuBoxSize( void )
 /*
  * Creates a new menu object, adding it to the freeglut structure
  */
-int FGAPIENTRY glutCreateMenu( FGCBMenu callback )
+int FGAPIENTRY glutCreateMenuUcall( FGCBMenuUC callback, FGCBUserData userData )
 {
-    /* The menu object creation code resides in freeglut_structure.c */
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateMenu" );
+    /* The menu object creation code resides in fg_structure.c */
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateMenuUcall" );
     if (fgState.ActiveMenus)
         fgError("Menu manipulation not allowed while menus in use.");
 
-    return fgCreateMenu( callback )->ID;
+    return fgCreateMenu( callback, userData )->ID;
+}
+
+/* Standard glutCreateMenu */
+void glutCreateMenuCallback( int menu, FGCBUserData userData )
+{
+    FGCBMenu callback = (FGCBMenu)userData;
+    callback( menu );
+}
+
+int FGAPIENTRY glutCreateMenu( FGCBMenu callback )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateMenu" );
+    return glutCreateMenuUcall( glutCreateMenuCallback, (FGCBUserData)callback );
 }
 
 /*
@@ -804,7 +817,7 @@ void FGAPIENTRY glutDestroyMenu( int menuID )
     if (fgState.ActiveMenus)
         fgError("Menu manipulation not allowed while menus in use.");
 
-    /* The menu object destruction code resides in freeglut_structure.c */
+    /* The menu object destruction code resides in fg_structure.c */
     fgDestroyMenu( menu );
 }