Joe Krahn\'s input (dials) device implementation.
[freeglut] / src / freeglut_internal.h
index cddae4e..185f9a4 100644 (file)
@@ -34,7 +34,7 @@
 
 /* XXX Update these for each release! */
 #define  VERSION_MAJOR 2
-#define  VERSION_MINOR 2
+#define  VERSION_MINOR 4
 #define  VERSION_PATCH 0
 
 /* Freeglut is meant to be available under all Unix/X11 and Win32 platforms. */
@@ -244,6 +244,7 @@ struct tagSFG_State
     fgExecutionState ExecState;           /* Used for GLUT termination       */
     char            *ProgramName;         /* Name of the invoking program    */
     GLboolean        JoysticksInitialised;  /* Only initialize if application calls for them */
+    GLboolean        InputDevsInitialised;  /* Only initialize if application calls for them */
 };
 
 /* The structure used by display initialization in freeglut_init.c */
@@ -323,8 +324,6 @@ struct tagSFG_Context
 
 #if TARGET_HOST_UNIX_X11
     XVisualInfo*    VisualInfo;      /* The window's visual information     */
-    Pixmap          Pixmap;          /* Used for offscreen rendering        */
-    /* GLXPixmap      GLXPixMap; */  /* Used for offscreen rendering        */
 #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
     HDC             Device;          /* The window's device context         */
 #endif
@@ -387,8 +386,8 @@ typedef void (*SFG_Proc)();
 #define SET_WCB(window,cbname,func)                            \
 do                                                             \
 {                                                              \
-    if( FETCH_WCB( window, cbname ) != func )                  \
-        (((window).CallBacks[CB_ ## cbname]) = (SFG_Proc) func); \
+    if( FETCH_WCB( window, cbname ) != (SFG_Proc)(func) )      \
+        (((window).CallBacks[CB_ ## cbname]) = (SFG_Proc)(func)); \
 } while( 0 )
 
 /*
@@ -403,7 +402,7 @@ do                                                             \
  * type.
  */
 #define FETCH_WCB(window,cbname) \
-    ((FGCB ## cbname)((window).CallBacks[CB_ ## cbname]))
+    ((window).CallBacks[CB_ ## cbname])
 
 /*
  * INVOKE_WCB() is used as:
@@ -424,15 +423,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.
@@ -532,6 +544,8 @@ struct tagSFG_MenuEntry
 /*
  * A window, making part of freeglut windows hierarchy.
  * Should be kept portable.
+ *
+ * NOTE that ActiveMenu is set to menu itself if the window is a menu.
  */
 struct tagSFG_Window
 {
@@ -570,7 +584,7 @@ struct tagSFG_Structure
     SFG_List        WindowsToDestroy;
 
     SFG_Window*     CurrentWindow; /* The currently set window          */
-    SFG_Menu*       CurrentMenu;  /* Same, but menu...                  */
+    SFG_Menu*       CurrentMenu;   /* Same, but menu...                 */
 
     SFG_MenuContext* MenuContext; /* OpenGL rendering context for menus */
 
@@ -693,7 +707,7 @@ extern SFG_State fgState;
  * window set, respectively:
  */
 #define  FREEGLUT_EXIT_IF_NO_WINDOW( string )                   \
-  if ( ! fgStructure.CurrentWindow )                                   \
+  if ( ! fgStructure.CurrentWindow )                            \
   {                                                             \
     fgError ( " ERROR:  Function <%s> called"                   \
               " with no current window defined.", (string) ) ;  \
@@ -759,6 +773,11 @@ int  glutJoystickGetNumAxes( int ident );
 int  glutJoystickGetNumButtons( int ident );
 int  glutJoystickNotWorking( int ident );
 
+/* InputDevice Init/Fini */
+int         fgInputDeviceDetect( void );
+void        fgInitialiseInputDevices( void );
+void        fgInputDeviceClose( void );
+
 /* Setting the cursor for a given window */
 void fgSetCursor ( SFG_Window *window, int cursorID );
 
@@ -802,6 +821,7 @@ SFG_Menu* fgMenuByID( int menuID );
  * The menu activation and deactivation the code. This is the meat
  * of the menu user interface handling code...
  */
+void fgUpdateMenuHighlight ( SFG_Menu *menu );
 GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,
                               int mouse_x, int mouse_y );
 void fgDeactivateMenu( SFG_Window *window );