cleaning up mixed tabs and spaces
[freeglut] / src / fg_internal.h
index 69401d0..238f8de 100644 (file)
 #endif
 
 #include "fg_version.h"
+#include "fg_callback_macros.h"
 
 /* Freeglut is intended to function under all Unix/X11 and Win32 platforms. */
 /* XXX: Don't all MS-Windows compilers (except Cygwin) have _WIN32 defined?
  * XXX: If so, remove the first set of defined()'s below.
  */
-#if !defined(TARGET_HOST_POSIX_X11) && !defined(TARGET_HOST_MS_WINDOWS) && !defined(TARGET_HOST_MAC_OSX) && !defined(TARGET_HOST_SOLARIS)
+#if !defined(TARGET_HOST_POSIX_X11) && !defined(TARGET_HOST_MS_WINDOWS) && !defined(TARGET_HOST_MAC_OSX) && !defined(TARGET_HOST_SOLARIS) && \
+    !defined(TARGET_HOST_ANDROID) && !defined(TARGET_HOST_BLACKBERRY) && !defined(TARGET_HOST_POSIX_WAYLAND)
 #if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__MINGW32__) \
     || defined(_WIN32) || defined(_WIN32_WCE) \
     || ( defined(__CYGWIN__) && defined(X_DISPLAY_MISSING) )
  */
 #if defined(__FreeBSD__) || defined(__NetBSD__)
 #    define HAVE_USB_JS 1
-#    if defined(__NetBSD__) || ( defined(__FreeBSD__) && __FreeBSD_version >= 500000)
-#        define HAVE_USBHID_H 1
-#    endif
 #endif
 
 #if defined(_MSC_VER) || defined(__WATCOMC__)
 
 /* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */
 
-/* Freeglut callbacks type definitions */
+/*
+ * Freeglut callbacks type definitions
+ *
+ * If anything here is modified or added, update fg_callback_macros.h functions.
+ *
+ * This is not ideal, but freeglut needs to either define minimal compiler specs,
+ * or update header every time this is changed or updated.
+ */
 typedef void* FGCBUserData;
 
 typedef void (* FGCBDisplay         )( void );
@@ -282,7 +288,7 @@ typedef void (* FGCBAppStatus       )( int );
 typedef void (* FGCBAppStatusUC     )( int, FGCBUserData );
 
 /* The global callbacks type definitions */
-typedef void (* FGCBIdle            )( void ); \
+typedef void (* FGCBIdle            )( void );
 typedef void (* FGCBIdleUC          )( FGCBUserData );
 typedef void (* FGCBTimer           )( int );
 typedef void (* FGCBTimerUC         )( int, FGCBUserData );
@@ -386,7 +392,7 @@ struct tagSFG_State
     int              NumActiveJoysticks;   /* Number of active joysticks (callback defined and positive pollrate) -- if zero, don't poll joysticks */
     GLboolean        InputDevsInitialised; /* Only initialize if application calls for them */
 
-       int              MouseWheelTicks;      /* Number of ticks the mouse wheel has turned */
+    int              MouseWheelTicks;      /* Number of ticks the mouse wheel has turned */
 
     int              AuxiliaryBufferNumber;/* Number of auxiliary buffers */
     int              SampleNumber;         /*  Number of samples per pixel  */
@@ -411,7 +417,7 @@ struct tagSFG_State
 typedef struct tagSFG_Display SFG_Display;
 struct tagSFG_Display
 {
-       SFG_PlatformDisplay pDisplay;
+    SFG_PlatformDisplay pDisplay;
 
     int             ScreenWidth;        /* The screen's width in pixels      */
     int             ScreenHeight;       /* The screen's height in pixels     */
@@ -441,7 +447,7 @@ struct tagSFG_Context
     SFG_WindowHandleType  Handle;    /* The window's handle                 */
     SFG_WindowContextType Context;   /* The window's OpenGL/WGL context     */
 
-       SFG_PlatformContext pContext;    /* The window's FBConfig (X11) or device context (Windows) */
+    SFG_PlatformContext pContext;    /* The window's FBConfig (X11) or device context (Windows) */
 
     int             DoubleBuffered;  /* Treat the window as double-buffered */
 
@@ -530,7 +536,7 @@ struct tagSFG_WindowState   /* as per notes above, sizes always refer to the cli
     int             DesiredZOrder;      /* desired window Z Order position */
     fgDesiredVisibility DesiredVisibility;/* desired visibility (hidden, iconic, shown/normal) */
 
-       SFG_PlatformWindowState pWState;    /* Window width/height (X11) or rectangle/style (Windows) from before a resize, and other stuff only needed on specific platforms */
+    SFG_PlatformWindowState pWState;    /* Window width/height (X11) or rectangle/style (Windows) from before a resize, and other stuff only needed on specific platforms */
 
     long            JoystickPollRate;   /* The joystick polling rate         */
     fg_time_t       JoystickLastPoll;   /* When the last poll happened       */
@@ -568,6 +574,12 @@ typedef void (*SFG_Proc)();
  * The {if( FETCH_WCB( ... ) != func )} test is to do type-checking
  * and for no other reason.  Since it's hidden in the macro, the
  * ugliness is felt to be rather benign.
+ *
+ * If the function-pointer is the same, the data will be the only
+ * value updated. If the function-pointer changes, the data will
+ * be changed as well, preventing stail data from being passed in.
+ * Just updating the data does nothing unless a function-pointer
+ * exists, as the data is otherwise already allocated.
  */
 #define SET_WCB(window,cbname,func,udata)                      \
 do                                                             \
@@ -577,6 +589,10 @@ do                                                             \
         (((window).CallBacks[WCB_ ## cbname]) = (SFG_Proc)(func)); \
         (((window).CallbackDatas[WCB_ ## cbname]) = (udata));  \
     }                                                          \
+    else if( FETCH_USER_DATA_WCB( window, cbname ) != udata )  \
+    {                                                          \
+        (((window).CallbackDatas[WCB_ ## cbname]) = (udata));  \
+    }                                                          \
 } while( 0 )
 
 /*
@@ -595,21 +611,13 @@ do                                                             \
 
 /*
  * FETCH_USER_DATA_WCB() is used as:
- * 
+ *
  *     FETCH_USER_DATA_WCB( window, cbname );
  *
  * ...where {window} is the freeglut window,
  *          {cbname} is the window-specific callback to be invoked,
  *
  * This expects a variable named "window" of type tagSFG_Window to exist.
- */
-/*
- * FETCH_USER_DATA_WCB() is used as:
- *
- *     FETCH_USER_DATA_WCB( window, cbname );
- *
- * ...where {window} is the freeglut window to fetch the callback data from,
- *          {cbname} is the window-specific callback data to fetch.
  *
  * The result is the callback data pointer.
  */
@@ -618,56 +626,21 @@ do                                                             \
 
 /*
  * EXPAND_WCB() is used as:
- * 
- *     EXPAND_WCB arg_list
- * 
- * ... where {(arg_list)} is the parameter list.
+ *
+ *     EXPAND_WCB( cbname )(( arg_list, userData ))
+ *
+ * ... where {(arg_list)} is the parameter list and userData is user
+ * provided data.
  *
  * This will take the arg_list and extend it by one argument, adding
  * the argument "userData" to the end of the list.
- * 
- * All additional args are to get around trailing ',', argument counts,
- * and not needing a GCC extension to make this work.
  *
- * Minor modification of:
- * http://stackoverflow.com/questions/5355241/generating-function-declaration-using-a-macro-iteration/5355946#5355946
+ * All of this is defined in fg_callback_macros.h
  *
- * Supports up to five arguments
- */
-#if TARGET_HOST_MS_WINDOWS
-
-/* FIXME: Does VC6 support variadic macros? I don't think so (variadic macros came with C99. VC6 came out in 1998) */
-
-/* FIXME: VC++ has a greedy preprocessor.
- * The preprocessor resolves the macros on use instead of after on argument completion/token usage.
- * e.g.: PP_HAS_ARGS_IMPL2(ONE_OR_MORE, ...) -> PP_HAS_ARGS_IMPL2(, ...) -> "Error, not enough tokens for PP_HAS_ARGS_IMPL2"
+ * See that header for more info.
+ *
+ * ------------------------------------------------------------------
  */
-#define EXPAND_WCB(...) (__VA_ARGS__)
-
-#else // #if TARGET_HOST_MS_WINDOWS
-
-#define PP_HAS_ARGS_IMPL2(_0, _1, _2, _3, _4, _5, N, ...) N
-#define PP_HAS_ARGS_SOURCE() \
-    ONE_OR_MORE, ONE_OR_MORE, ONE_OR_MORE, ONE_OR_MORE, ONE_OR_MORE, ZERO
-
-#define PP_HAS_ARGS_IMPL(...) \
-    PP_HAS_ARGS_IMPL2(__VA_ARGS__)
-#define PP_HAS_ARGS(...) \
-    PP_HAS_ARGS_IMPL(NOT_EXIST, ##__VA_ARGS__, PP_HAS_ARGS_SOURCE())
-
-#define EXPAND_WCB_ZERO(x) \
-    (userData)
-#define EXPAND_WCB_ONE_OR_MORE(...) \
-    (__VA_ARGS__, userData)
-
-#define EXPAND_WCB_DISAMBIGUATE2(has_args, ...) \
-    EXPAND_WCB_ ## has_args (__VA_ARGS__)
-#define EXPAND_WCB_DISAMBIGUATE(has_args, ...) \
-    EXPAND_WCB_DISAMBIGUATE2(has_args, __VA_ARGS__)
-#define EXPAND_WCB(...) \
-    EXPAND_WCB_DISAMBIGUATE(PP_HAS_ARGS(__VA_ARGS__), __VA_ARGS__)
-
-#endif // #if TARGET_HOST_MS_WINDOWS
 
 /*
  * INVOKE_WCB() is used as:
@@ -680,15 +653,15 @@ do                                                             \
  *
  * The callback is invoked as:
  *
- *    callback( arg_list );
+ *    callback( arg_list, userData );
  *
- * ...so the parentheses are REQUIRED in the {arg_list}.
+ * ...where userData is added to the arg_list, but the parentheses
+ * are REQUIRED in the {arg_list}.
  *
  * NOTE that it does a sanity-check and also sets the
  * current window.
  *
  */
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: also WinCE? */
 #define INVOKE_WCB(window,cbname,arg_list)    \
 do                                            \
 {                                             \
@@ -697,21 +670,9 @@ do                                            \
         FGCB ## cbname ## UC func = (FGCB ## cbname ## UC)(FETCH_WCB( window, cbname )); \
         FGCBUserData userData = FETCH_USER_DATA_WCB( window, cbname ); \
         fgSetWindow( &window );               \
-        func EXPAND_WCB arg_list;             \
-    }                                         \
-} while( 0 )
-#else
-#define INVOKE_WCB(window,cbname,arg_list)    \
-do                                            \
-{                                             \
-    if( FETCH_WCB( window, cbname ) )         \
-    {                                         \
-        fgSetWindow( &window );               \
-        FGCBUserData userData = FETCH_USER_DATA_WCB( window, cbname ); \
-        ((FGCB ## cbname ## UC)FETCH_WCB( window, cbname )) EXPAND_WCB arg_list; \
+        func EXPAND_WCB( cbname )(( arg_list, userData )); \
     }                                         \
 } while( 0 )
-#endif
 
 /*
  * The window callbacks the user can supply us with. Should be kept portable.
@@ -984,7 +945,7 @@ struct tagSFG_PlatformJoystick
 typedef struct tagSFG_Joystick SFG_Joystick;
 struct tagSFG_Joystick
 {
-       SFG_PlatformJoystick pJoystick;
+    SFG_PlatformJoystick pJoystick;
 
     int          id;
     GLboolean    error;