Fixing the typecasts on the callback fetches and invocations to allow \"freeglut...
[freeglut] / src / freeglut_internal.h
index 96326c7..0226214 100644 (file)
@@ -370,10 +370,10 @@ typedef void (*SFG_Proc)();
 /*
  * SET_WCB() is used as:
  *
- *     SET_WCB( window, Visibility, func );
+ *     SET_WCB( window, cbname, func );
  *
  * ...where {window} is the freeglut window to set the callback,
- *          {Visibility} is the window-specific callback to set,
+ *          {cbname} is the window-specific callback to set,
  *          {func} is a function-pointer.
  *
  * Originally, {FETCH_WCB( ... ) = func} was rather sloppily used,
@@ -394,29 +394,29 @@ do                                                             \
 /*
  * FETCH_WCB() is used as:
  *
- *     FETCH_WCB( window, Visibility );
+ *     FETCH_WCB( window, cbname );
  *
  * ...where {window} is the freeglut window to fetch the callback from,
- *          {Visibility} is the window-specific callback to fetch.
+ *          {cbname} is the window-specific callback to fetch.
  *
  * The result is correctly type-cast to the callback function pointer
  * type.
  */
 #define FETCH_WCB(window,cbname) \
-    ((FGCB ## cbname)((window).CallBacks[CB_ ## cbname]))
+    ((window).CallBacks[CB_ ## cbname])
 
 /*
  * INVOKE_WCB() is used as:
  *
- *     INVOKE_WCB( window, Visibility, ( status ) );
+ *     INVOKE_WCB( window, cbname, ( arg_list ) );
  *
  * ...where {window} is the freeglut window,
- *          {Visibility} is the window-specific callback,
- *          {(status)} is the parameter list.
+ *          {cbname} is the window-specific callback to be invoked,
+ *          {(arg_list)} is the parameter list.
  *
  * The callback is invoked as:
  *
- *    callback( status );
+ *    callback( arg_list );
  *
  * ...so the parentheses are REQUIRED in the {arg_list}.
  *
@@ -424,15 +424,28 @@ do                                                             \
  * current window.
  *
  */
+#if TARGET_HOST_WIN32
 #define INVOKE_WCB(window,cbname,arg_list)    \
 do                                            \
 {                                             \
     if( FETCH_WCB( window, cbname ) )         \
     {                                         \
+        FGCB ## cbname func = (FGCB ## cbname)(FETCH_WCB( window, cbname )); \
         fgSetWindow( &window );               \
-        FETCH_WCB( window, cbname ) arg_list; \
+        func arg_list;                        \
     }                                         \
 } while( 0 )
+#else
+#define INVOKE_WCB(window,cbname,arg_list)    \
+do                                            \
+{                                             \
+    if( FETCH_WCB( window, cbname ) )         \
+    {                                         \
+        fgSetWindow( &window );               \
+        ((FGCB ## cbname)FETCH_WCB( window, cbname )) arg_list; \
+    }                                         \
+} while( 0 )
+#endif
 
 /*
  * The window callbacks the user can supply us with. Should be kept portable.
@@ -514,7 +527,7 @@ struct tagSFG_Menu
 
     SFG_MenuEntry      *ActiveEntry;  /* Currently active entry in the menu  */
     SFG_Window         *Window;       /* Window for menu                     */
-    SFG_Window         *ParentWindow; /* Window in which the menu is defined */
+    SFG_Window         *ParentWindow; /* Window in which the menu is invoked */
 };
 
 /* This is a menu entry */
@@ -569,8 +582,8 @@ struct tagSFG_Structure
     SFG_List        Menus;        /* The global menus list              */
     SFG_List        WindowsToDestroy;
 
-    SFG_Window*     Window;       /* The currently active win.          */
-    SFG_Menu*       Menu;         /* Same, but menu...                  */
+    SFG_Window*     CurrentWindow; /* The currently set window          */
+    SFG_Menu*       CurrentMenu;   /* Same, but menu...                 */
 
     SFG_MenuContext* MenuContext; /* OpenGL rendering context for menus */
 
@@ -693,7 +706,7 @@ extern SFG_State fgState;
  * window set, respectively:
  */
 #define  FREEGLUT_EXIT_IF_NO_WINDOW( string )                   \
-  if ( ! fgStructure.Window )                                   \
+  if ( ! fgStructure.CurrentWindow )                            \
   {                                                             \
     fgError ( " ERROR:  Function <%s> called"                   \
               " with no current window defined.", (string) ) ;  \
@@ -759,6 +772,9 @@ int  glutJoystickGetNumAxes( int ident );
 int  glutJoystickGetNumButtons( int ident );
 int  glutJoystickNotWorking( int ident );
 
+/* Setting the cursor for a given window */
+void fgSetCursor ( SFG_Window *window, int cursorID );
+
 /*
  * Helper function to enumerate through all registered windows
  * and one to enumerate all of a window's subwindows...
@@ -799,11 +815,9 @@ SFG_Menu* fgMenuByID( int menuID );
  * The menu activation and deactivation the code. This is the meat
  * of the menu user interface handling code...
  */
-void fgActivateMenu( SFG_Window* window, int button );
 GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,
                               int mouse_x, int mouse_y );
 void fgDeactivateMenu( SFG_Window *window );
-void fgDeactivateSubMenu( SFG_MenuEntry *menuEntry );
 
 /*
  * This function gets called just before the buffers swap, so that
@@ -812,12 +826,6 @@ void fgDeactivateSubMenu( SFG_MenuEntry *menuEntry );
  */
 void fgDisplayMenu( void );
 
-/*
- * Display the mouse cursor using OpenGL calls. The function
- * is defined in freeglut_cursor.c file.
- */
-void fgDisplayCursor( void );
-
 /* Elapsed time as per glutGet(GLUT_ELAPSED_TIME). */
 long fgElapsedTime( void );