X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;ds=sidebyside;f=src%2Ffg_internal.h;h=238f8dee047d5c76ecdbc9a5fe68a01eaf01e4b7;hb=207c3128bf025b5e025bace5c0425d380dd72aa9;hp=69401d0f89931bdd8570f75274daaf825ff27841;hpb=831749819dcdc1ea884c18607c2b447bbf5fca72;p=freeglut diff --git a/src/fg_internal.h b/src/fg_internal.h index 69401d0..238f8de 100644 --- a/src/fg_internal.h +++ b/src/fg_internal.h @@ -33,12 +33,14 @@ #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) ) @@ -137,9 +139,6 @@ */ #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__) @@ -215,7 +214,14 @@ /* -- 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;