From 3e8f42bbffa1a79995b9ab4ad069d5aa4c85e91b Mon Sep 17 00:00:00 2001 From: dcnieho Date: Wed, 12 Jul 2017 20:44:28 +0000 Subject: [PATCH 1/5] Do not define HAVE_USBHID_H manually, cmake does it for us. (cherry picked from commit 78b19bfc9709d5c4175a7866059a42c478272071) (cherry picked from commit 0b64b227b521cc9e7ec44a6a1d50a1a8700911e4) git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1828 7f0cb862-5218-0410-a997-914c9d46530a --- freeglut/freeglut/src/fg_internal.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/freeglut/freeglut/src/fg_internal.h b/freeglut/freeglut/src/fg_internal.h index a95027b..f487ece 100644 --- a/freeglut/freeglut/src/fg_internal.h +++ b/freeglut/freeglut/src/fg_internal.h @@ -139,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__) From b39b3a5edf2f1636d2d7c687f9163f2b0045ee18 Mon Sep 17 00:00:00 2001 From: dcnieho Date: Wed, 12 Jul 2017 20:44:35 +0000 Subject: [PATCH 2/5] Fix build on NetBSD. (cherry picked from commit 06e1d815cf9abda49b845754ff420734446eb95b) (cherry picked from commit c4294ad59093c27159ea6028d33e3c9581df5354) git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1829 7f0cb862-5218-0410-a997-914c9d46530a --- freeglut/freeglut/src/fg_joystick.c | 5 ++--- freeglut/freeglut/src/x11/fg_joystick_x11.c | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/freeglut/freeglut/src/fg_joystick.c b/freeglut/freeglut/src/fg_joystick.c index 6f6771c..b73d7e7 100644 --- a/freeglut/freeglut/src/fg_joystick.c +++ b/freeglut/freeglut/src/fg_joystick.c @@ -46,21 +46,20 @@ # ifdef HAVE_USB_JS # if defined(__NetBSD__) -/* XXX The below hack is done until freeglut's autoconf is updated. */ -# define HAVE_USBHID_H 1 # ifdef HAVE_USBHID_H # include # else # include # endif +# include # elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) # ifdef HAVE_USBHID_H # include # else # include # endif +# include # endif -# include # include /* Compatibility with older usb.h revisions */ diff --git a/freeglut/freeglut/src/x11/fg_joystick_x11.c b/freeglut/freeglut/src/x11/fg_joystick_x11.c index a37388b..04bc373 100644 --- a/freeglut/freeglut/src/x11/fg_joystick_x11.c +++ b/freeglut/freeglut/src/x11/fg_joystick_x11.c @@ -50,7 +50,7 @@ void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) { int status; -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) int len; if ( joy->pJoystick.os->is_analog ) @@ -215,7 +215,7 @@ void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) void fgPlatformJoystickOpen( SFG_Joystick* joy ) { -#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) +#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) int i = 0; char *cp; #endif @@ -229,7 +229,7 @@ void fgPlatformJoystickOpen( SFG_Joystick* joy ) # endif #endif -#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) +#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) for( i = 0; i < _JS_MAX_AXES; i++ ) joy->pJoystick.os->cache_axes[ i ] = 0.0f; @@ -409,7 +409,7 @@ void fgPlatformJoystickOpen( SFG_Joystick* joy ) void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ) { -#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) +#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) fgJoystick[ ident ]->id = ident; fgJoystick[ ident ]->error = GL_FALSE; @@ -436,7 +436,7 @@ void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident ) void fgPlatformJoystickClose ( int ident ) { -#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ ) +#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) if( fgJoystick[ident]->pJoystick.os ) { if( ! fgJoystick[ ident ]->error ) From 07297565c828a4796e9bb99e3c965e0c720f8a68 Mon Sep 17 00:00:00 2001 From: dcnieho Date: Wed, 12 Jul 2017 20:44:47 +0000 Subject: [PATCH 3/5] some whitespace cleanup (cherry picked from commit 2dd5aa4aa1b5c19392f9abd00e0f6893907df205) git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1830 7f0cb862-5218-0410-a997-914c9d46530a --- freeglut/freeglut/src/fg_init.c | 32 +- freeglut/freeglut/src/fg_joystick.c | 8 +- freeglut/freeglut/src/fg_main.c | 14 +- freeglut/freeglut/src/freeglutdll.def.in | 312 +++++++++--------- .../freeglut/src/mswin/fg_joystick_mswin.c | 2 +- freeglut/freeglut/src/mswin/fg_main_mswin.c | 148 ++++----- 6 files changed, 258 insertions(+), 258 deletions(-) diff --git a/freeglut/freeglut/src/fg_init.c b/freeglut/freeglut/src/fg_init.c index c3c00e5..ed29a83 100644 --- a/freeglut/freeglut/src/fg_init.c +++ b/freeglut/freeglut/src/fg_init.c @@ -689,14 +689,14 @@ static void fghInitErrorFuncCallback( const char *fmt, va_list ap, FGCBUserData void FGAPIENTRY glutInitErrorFunc( FGError callback ) { - if (callback) - { - glutInitErrorFuncUcall( fghInitErrorFuncCallback, (FGCBUserData)callback ); - } - else - { - glutInitErrorFuncUcall( NULL, NULL ); - } + if (callback) + { + glutInitErrorFuncUcall( fghInitErrorFuncCallback, (FGCBUserData)callback ); + } + else + { + glutInitErrorFuncUcall( NULL, NULL ); + } } /* @@ -717,14 +717,14 @@ static void fghInitWarningFuncCallback( const char *fmt, va_list ap, FGCBUserDat void FGAPIENTRY glutInitWarningFunc( FGWarning callback ) { - if (callback) - { - glutInitWarningFuncUcall( fghInitWarningFuncCallback, (FGCBUserData)callback ); - } - else - { - glutInitWarningFuncUcall( NULL, NULL ); - } + if (callback) + { + glutInitWarningFuncUcall( fghInitWarningFuncCallback, (FGCBUserData)callback ); + } + else + { + glutInitWarningFuncUcall( NULL, NULL ); + } } /*** END OF FILE ***/ diff --git a/freeglut/freeglut/src/fg_joystick.c b/freeglut/freeglut/src/fg_joystick.c index b73d7e7..2f4f6ed 100644 --- a/freeglut/freeglut/src/fg_joystick.c +++ b/freeglut/freeglut/src/fg_joystick.c @@ -581,7 +581,7 @@ void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) void fgPlatformJoystickOpen( SFG_Joystick* joy ) { - int i = 0; + int i = 0; OSStatus err; /* XXX FIXME: get joystick name in Mac */ @@ -856,7 +856,7 @@ static void fghJoystickOpen( SFG_Joystick* joy ) joy->num_axes = joy->num_buttons = 0; joy->name[ 0 ] = '\0'; - fgPlatformJoystickOpen ( joy ); + fgPlatformJoystickOpen ( joy ); } @@ -878,7 +878,7 @@ static void fghJoystickInit( int ident ) fgJoystick[ ident ]->num_axes = fgJoystick[ ident ]->num_buttons = 0; fgJoystick[ ident ]->error = GL_TRUE; - fgPlatformJoystickInit( fgJoystick, ident ); + fgPlatformJoystickInit( fgJoystick, ident ); fghJoystickOpen( fgJoystick[ ident ] ); } @@ -906,7 +906,7 @@ void fgJoystickClose( void ) { if( fgJoystick[ ident ] ) { - fgPlatformJoystickClose ( ident ); + fgPlatformJoystickClose ( ident ); free( fgJoystick[ ident ] ); fgJoystick[ ident ] = NULL; diff --git a/freeglut/freeglut/src/fg_main.c b/freeglut/freeglut/src/fg_main.c index 97c7a32..ff01110 100644 --- a/freeglut/freeglut/src/fg_main.c +++ b/freeglut/freeglut/src/fg_main.c @@ -179,7 +179,7 @@ static void fghcbCheckJoystickPolls( SFG_Window *window, SFG_Enumerator *enumerator ) { fg_time_t checkTime; - + if (window->State.JoystickPollRate > 0 && FETCH_WCB( *window, Joystick )) { /* This window has a joystick to be polled (if pollrate <= 0, user needs to poll manually with glutForceJoystickFunc */ @@ -200,7 +200,7 @@ static void fghcbCheckJoystickPolls( SFG_Window *window, /* * Check all windows for joystick polling - * + * * The real way to do this is to make use of the glutTimer() API * to more cleanly re-implement the joystick API. Then, this code * and all other "joystick timer" code can be yanked. @@ -237,18 +237,18 @@ static void fghCheckTimers( void ) } } - + /* Platform-dependent time in milliseconds, as an unsigned 64-bit integer. * This doesn't overflow in any reasonable time, so no need to worry about * that. The GLUT API return value will however overflow after 49.7 days, * which means you will still get in trouble when running the * application for more than 49.7 days. - */ + */ fg_time_t fgSystemTime(void) { - return fgPlatformSystemTime(); + return fgPlatformSystemTime(); } - + /* * Elapsed Time */ @@ -446,7 +446,7 @@ void fgProcessWork(SFG_Window *window) void FGAPIENTRY glutMainLoopEvent( void ) { /* Process input */ - fgPlatformProcessSingleEvent (); + fgPlatformProcessSingleEvent (); if( fgState.Timers.First ) fghCheckTimers( ); diff --git a/freeglut/freeglut/src/freeglutdll.def.in b/freeglut/freeglut/src/freeglutdll.def.in index 988d7d3..50971bb 100644 --- a/freeglut/freeglut/src/freeglutdll.def.in +++ b/freeglut/freeglut/src/freeglutdll.def.in @@ -1,163 +1,163 @@ VERSION @VERSION_MAJOR@.@VERSION_MINOR@ EXPORTS - glutInit - glutInitWindowPosition - glutInitWindowSize - glutInitDisplayMode - glutInitDisplayString - glutMainLoop - glutMainLoopEvent - glutLeaveMainLoop - glutCreateWindow - glutCreateSubWindow - glutDestroyWindow - glutSetWindow - glutGetWindow - glutSetWindowData - glutGetWindowData - glutSetWindowTitle - glutSetIconTitle - glutReshapeWindow - glutPositionWindow - glutShowWindow - glutHideWindow - glutIconifyWindow - glutPushWindow - glutPopWindow - glutFullScreen - glutPostWindowRedisplay - glutPostRedisplay - glutSwapBuffers - glutWarpPointer - glutSetCursor - glutEstablishOverlay - glutRemoveOverlay - glutUseLayer - glutPostOverlayRedisplay - glutPostWindowOverlayRedisplay - glutShowOverlay - glutHideOverlay - glutCreateMenu - glutDestroyMenu - glutGetMenu - glutSetMenu - glutGetMenuData - glutSetMenuData - glutAddMenuEntry - glutAddSubMenu - glutChangeToMenuEntry - glutChangeToSubMenu - glutRemoveMenuItem - glutAttachMenu - glutDetachMenu - glutTimerFunc - glutIdleFunc - glutKeyboardFunc - glutSpecialFunc - glutReshapeFunc + glutInit + glutInitWindowPosition + glutInitWindowSize + glutInitDisplayMode + glutInitDisplayString + glutMainLoop + glutMainLoopEvent + glutLeaveMainLoop + glutCreateWindow + glutCreateSubWindow + glutDestroyWindow + glutSetWindow + glutGetWindow + glutSetWindowData + glutGetWindowData + glutSetWindowTitle + glutSetIconTitle + glutReshapeWindow + glutPositionWindow + glutShowWindow + glutHideWindow + glutIconifyWindow + glutPushWindow + glutPopWindow + glutFullScreen + glutPostWindowRedisplay + glutPostRedisplay + glutSwapBuffers + glutWarpPointer + glutSetCursor + glutEstablishOverlay + glutRemoveOverlay + glutUseLayer + glutPostOverlayRedisplay + glutPostWindowOverlayRedisplay + glutShowOverlay + glutHideOverlay + glutCreateMenu + glutDestroyMenu + glutGetMenu + glutSetMenu + glutGetMenuData + glutSetMenuData + glutAddMenuEntry + glutAddSubMenu + glutChangeToMenuEntry + glutChangeToSubMenu + glutRemoveMenuItem + glutAttachMenu + glutDetachMenu + glutTimerFunc + glutIdleFunc + glutKeyboardFunc + glutSpecialFunc + glutReshapeFunc glutPositionFunc - glutVisibilityFunc - glutDisplayFunc - glutMouseFunc - glutMouseWheelFunc - glutMotionFunc - glutPassiveMotionFunc - glutEntryFunc - glutCloseFunc - glutWMCloseFunc - glutKeyboardUpFunc - glutSpecialUpFunc - glutJoystickFunc - glutMenuStateFunc - glutMenuStatusFunc - glutMenuDestroyFunc - glutOverlayDisplayFunc - glutWindowStatusFunc - glutSpaceballMotionFunc - glutSpaceballRotateFunc - glutSpaceballButtonFunc - glutButtonBoxFunc - glutDialsFunc - glutTabletMotionFunc - glutTabletButtonFunc - glutSetOption - glutGet - glutDeviceGet - glutGetModifiers - glutLayerGet - glutBitmapCharacter - glutBitmapWidth - glutStrokeCharacter - glutStrokeWidth - glutBitmapLength - glutStrokeLength - glutBitmapHeight - glutStrokeHeight - glutBitmapString - glutStrokeString - glutWireCube - glutSolidCube - glutWireSphere - glutSolidSphere - glutWireCone - glutSolidCone - glutWireTorus - glutSolidTorus - glutWireDodecahedron - glutSolidDodecahedron - glutWireOctahedron - glutSolidOctahedron - glutWireTetrahedron - glutSolidTetrahedron - glutWireIcosahedron - glutSolidIcosahedron - glutWireRhombicDodecahedron - glutSolidRhombicDodecahedron - glutWireSierpinskiSponge - glutSolidSierpinskiSponge - glutWireTeapot - glutSolidTeapot - glutWireTeacup - glutSolidTeacup - glutWireTeaspoon - glutSolidTeaspoon - glutWireCylinder - glutSolidCylinder - glutGameModeString - glutEnterGameMode - glutLeaveGameMode - glutGameModeGet - glutVideoResizeGet - glutSetupVideoResizing - glutStopVideoResizing - glutVideoResize - glutVideoPan - glutSetColor - glutGetColor - glutCopyColormap - glutIgnoreKeyRepeat - glutSetKeyRepeat - glutForceJoystickFunc - glutExtensionSupported - glutReportErrors - glutGetProcAddress - glutExit - glutFullScreenToggle - glutLeaveFullScreen + glutVisibilityFunc + glutDisplayFunc + glutMouseFunc + glutMouseWheelFunc + glutMotionFunc + glutPassiveMotionFunc + glutEntryFunc + glutCloseFunc + glutWMCloseFunc + glutKeyboardUpFunc + glutSpecialUpFunc + glutJoystickFunc + glutMenuStateFunc + glutMenuStatusFunc + glutMenuDestroyFunc + glutOverlayDisplayFunc + glutWindowStatusFunc + glutSpaceballMotionFunc + glutSpaceballRotateFunc + glutSpaceballButtonFunc + glutButtonBoxFunc + glutDialsFunc + glutTabletMotionFunc + glutTabletButtonFunc + glutSetOption + glutGet + glutDeviceGet + glutGetModifiers + glutLayerGet + glutBitmapCharacter + glutBitmapWidth + glutStrokeCharacter + glutStrokeWidth + glutBitmapLength + glutStrokeLength + glutBitmapHeight + glutStrokeHeight + glutBitmapString + glutStrokeString + glutWireCube + glutSolidCube + glutWireSphere + glutSolidSphere + glutWireCone + glutSolidCone + glutWireTorus + glutSolidTorus + glutWireDodecahedron + glutSolidDodecahedron + glutWireOctahedron + glutSolidOctahedron + glutWireTetrahedron + glutSolidTetrahedron + glutWireIcosahedron + glutSolidIcosahedron + glutWireRhombicDodecahedron + glutSolidRhombicDodecahedron + glutWireSierpinskiSponge + glutSolidSierpinskiSponge + glutWireTeapot + glutSolidTeapot + glutWireTeacup + glutSolidTeacup + glutWireTeaspoon + glutSolidTeaspoon + glutWireCylinder + glutSolidCylinder + glutGameModeString + glutEnterGameMode + glutLeaveGameMode + glutGameModeGet + glutVideoResizeGet + glutSetupVideoResizing + glutStopVideoResizing + glutVideoResize + glutVideoPan + glutSetColor + glutGetColor + glutCopyColormap + glutIgnoreKeyRepeat + glutSetKeyRepeat + glutForceJoystickFunc + glutExtensionSupported + glutReportErrors + glutGetProcAddress + glutExit + glutFullScreenToggle + glutLeaveFullScreen glutSetMenuFont - glutGetModeValues - glutInitContextFlags - glutInitContextVersion - glutInitContextProfile - glutInitErrorFunc - glutInitWarningFunc - __glutInitWithExit - __glutCreateWindowWithExit - __glutCreateMenuWithExit - glutMultiButtonFunc - glutMultiEntryFunc - glutMultiMotionFunc - glutMultiPassiveFunc + glutGetModeValues + glutInitContextFlags + glutInitContextVersion + glutInitContextProfile + glutInitErrorFunc + glutInitWarningFunc + __glutInitWithExit + __glutCreateWindowWithExit + __glutCreateMenuWithExit + glutMultiButtonFunc + glutMultiEntryFunc + glutMultiMotionFunc + glutMultiPassiveFunc glutInitContextFunc glutAppStatusFunc glutSetVertexAttribCoord3 diff --git a/freeglut/freeglut/src/mswin/fg_joystick_mswin.c b/freeglut/freeglut/src/mswin/fg_joystick_mswin.c index d584b59..e38c21a 100644 --- a/freeglut/freeglut/src/mswin/fg_joystick_mswin.c +++ b/freeglut/freeglut/src/mswin/fg_joystick_mswin.c @@ -170,7 +170,7 @@ static int fghJoystickGetOEMProductName ( SFG_Joystick* joy, char *buf, int buf_ void fgPlatformJoystickOpen( SFG_Joystick* joy ) { - int i = 0; + int i = 0; joy->pJoystick.js.dwFlags = JOY_RETURNALL; joy->pJoystick.js.dwSize = sizeof( joy->pJoystick.js ); diff --git a/freeglut/freeglut/src/mswin/fg_main_mswin.c b/freeglut/freeglut/src/mswin/fg_main_mswin.c index 1958755..8ad8308 100644 --- a/freeglut/freeglut/src/mswin/fg_main_mswin.c +++ b/freeglut/freeglut/src/mswin/fg_main_mswin.c @@ -63,7 +63,7 @@ struct GXKeyList gxKeyList; #endif /* _WIN32_WCE */ #ifdef _DEBUG -/* +/* * WM_ message to string, for debugging * This is taken from the 8.0 SDK, so Windows 8 API and everything earlier is included */ @@ -474,7 +474,7 @@ fg_time_t fgPlatformSystemTime ( void ) /* Check if we just wrapped */ if (currTime32 < lastTime32) timeEpoch++; - + lastTime32 = currTime32; return currTime32 | timeEpoch << 32; @@ -542,7 +542,7 @@ static void fghPlatformOnWindowStatusNotify(SFG_Window *window, GLboolean visSta { SFG_Window *saved_window = fgStructure.CurrentWindow; - /* On win32 we only have two states, window displayed and window not displayed (iconified) + /* On win32 we only have two states, window displayed and window not displayed (iconified) * We map these to GLUT_FULLY_RETAINED and GLUT_HIDDEN respectively. */ INVOKE_WCB( *window, WindowStatus, ( visState ? GLUT_FULLY_RETAINED:GLUT_HIDDEN ) ); @@ -592,7 +592,7 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke rControl = 0, rShift = 0, rAlt = 0; int keypress = -1; - + /* if keydown, check for repeat */ /* If repeat is globally switched off, it cannot be switched back on per window. * But if it is globally switched on, it can be switched off per window. This matches @@ -601,7 +601,7 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke */ if( keydown && ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) ) return 1; - + /* Remember the current modifiers state so user can query it from their callback */ fgState.Modifiers = fgPlatformGetModifiers( ); @@ -715,7 +715,7 @@ static LRESULT fghWindowProcKeyPress(SFG_Window *window, UINT uMsg, GLboolean ke keypress = GLUT_KEY_F4; } #endif - + if( keypress != -1 ) if (keydown) INVOKE_WCB( *window, Special, @@ -756,7 +756,7 @@ SFG_Window* fghWindowUnderCursor(SFG_Window *window) mouse_pos.x = GET_X_LPARAM(mouse_pos_dw); mouse_pos.y = GET_Y_LPARAM(mouse_pos_dw); ScreenToClient( window->Window.Handle, &mouse_pos ); - + hwnd = ChildWindowFromPoint(window->Window.Handle, mouse_pos); if (hwnd && hwnd!=window->Window.Handle) /* can be NULL if mouse outside parent by the time we get here, or can be same as parent if we didn't find a child */ { @@ -888,7 +888,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR width = LOWORD(lParam); height = HIWORD(lParam); #endif /* defined(_WIN32_WCE) */ - + /* Update state and call callback, if there was a change */ fghOnReshapeNotify(window, width, height, GL_FALSE); } @@ -935,15 +935,15 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR if (!IsIconic(window->Window.Handle)) { RECT windowRect; - + /* lParam contains coordinates of top-left of client area. * Get top-left of non-client area of window, matching coordinates of - * glutInitPosition and glutPositionWindow, but not those of + * glutInitPosition and glutPositionWindow, but not those of * glutGet(GLUT_WINDOW_X) and glutGet(GLUT_WINDOW_Y), which return * top-left of client area. */ GetWindowRect( window->Window.Handle, &windowRect ); - + if (window->Parent) { /* For child window, we should return relative to upper-left @@ -1031,7 +1031,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR { TRACKMOUSEEVENT tme; - /* Cursor just entered window, set cursor look */ + /* Cursor just entered window, set cursor look */ fgSetCursor ( window, window->State.Cursor ) ; /* If an EntryFunc callback is specified by the user, also @@ -1090,7 +1090,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR case WM_PAINT: { RECT rect; - + /* As per docs, upon receiving WM_PAINT, first check if the update region is not empty before you call BeginPaint */ if (GetUpdateRect(hWnd,&rect,FALSE)) { @@ -1279,7 +1279,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR { int wheel_number = 0; /* Only one scroll wheel on windows */ #if defined(_WIN32_WCE) - int modkeys = LOWORD(wParam); + int modkeys = LOWORD(wParam); short ticks = (short)HIWORD(wParam); /* commented out as should not be needed here, mouse motion is processed in WM_MOUSEMOVE first: xPos = LOWORD(lParam); -- straight from docs, not consistent with mouse nutton and mouse motion above (which i think is wrong) @@ -1296,10 +1296,10 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR window = fghWindowUnderCursor(window); - fgState.MouseWheelTicks += ticks; + fgState.MouseWheelTicks += ticks; if ( abs ( fgState.MouseWheelTicks ) >= WHEEL_DELTA ) - { - int direction = ( fgState.MouseWheelTicks > 0 ) ? 1 : -1; + { + int direction = ( fgState.MouseWheelTicks > 0 ) ? 1 : -1; if( ! FETCH_WCB( *window, MouseWheel ) && ! FETCH_WCB( *window, Mouse ) ) @@ -1309,7 +1309,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR fgState.Modifiers = fgPlatformGetModifiers( ); while( abs ( fgState.MouseWheelTicks ) >= WHEEL_DELTA ) - { + { if( FETCH_WCB( *window, MouseWheel ) ) INVOKE_WCB( *window, MouseWheel, ( wheel_number, @@ -1319,7 +1319,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR ) ); else /* No mouse wheel, call the mouse button callback twice */ - { + { /* * Map wheel zero to button 3 and 4; +1 to 3, -1 to 4 * " " one +1 to 5, -1 to 6, ... @@ -1338,13 +1338,13 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR ( button, GLUT_UP, window->State.MouseX, window->State.MouseY ) ); - } + } - fgState.MouseWheelTicks -= WHEEL_DELTA * direction; - } + fgState.MouseWheelTicks -= WHEEL_DELTA * direction; + } fgState.Modifiers = INVALID_MODIFIERS; - } + } /* Per docs, should return zero */ lRet = 0; } @@ -1498,60 +1498,60 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR break; #ifdef WM_TOUCH - /* handle multi-touch messages */ - case WM_TOUCH: - { - unsigned int numInputs = (unsigned int)wParam; - unsigned int i = 0; - TOUCHINPUT* ti = (TOUCHINPUT*)malloc( sizeof(TOUCHINPUT)*numInputs); + /* handle multi-touch messages */ + case WM_TOUCH: + { + unsigned int numInputs = (unsigned int)wParam; + unsigned int i = 0; + TOUCHINPUT* ti = (TOUCHINPUT*)malloc( sizeof(TOUCHINPUT)*numInputs); - if (fghGetTouchInputInfo == (pGetTouchInputInfo)0xDEADBEEF) { - fghGetTouchInputInfo = (pGetTouchInputInfo)GetProcAddress(GetModuleHandle("user32"),"GetTouchInputInfo"); - fghCloseTouchInputHandle = (pCloseTouchInputHandle)GetProcAddress(GetModuleHandle("user32"),"CloseTouchInputHandle"); - } + if (fghGetTouchInputInfo == (pGetTouchInputInfo)0xDEADBEEF) { + fghGetTouchInputInfo = (pGetTouchInputInfo)GetProcAddress(GetModuleHandle("user32"),"GetTouchInputInfo"); + fghCloseTouchInputHandle = (pCloseTouchInputHandle)GetProcAddress(GetModuleHandle("user32"),"CloseTouchInputHandle"); + } - if (!fghGetTouchInputInfo) { - free( (void*)ti ); - break; - } + if (!fghGetTouchInputInfo) { + free( (void*)ti ); + break; + } - if (fghGetTouchInputInfo( (HTOUCHINPUT)lParam, numInputs, ti, sizeof(TOUCHINPUT) )) { - /* Handle each contact point */ - for (i = 0; i < numInputs; ++i ) { + if (fghGetTouchInputInfo( (HTOUCHINPUT)lParam, numInputs, ti, sizeof(TOUCHINPUT) )) { + /* Handle each contact point */ + for (i = 0; i < numInputs; ++i ) { - POINT tp; - tp.x = TOUCH_COORD_TO_PIXEL(ti[i].x); - tp.y = TOUCH_COORD_TO_PIXEL(ti[i].y); - ScreenToClient( hWnd, &tp ); + POINT tp; + tp.x = TOUCH_COORD_TO_PIXEL(ti[i].x); + tp.y = TOUCH_COORD_TO_PIXEL(ti[i].y); + ScreenToClient( hWnd, &tp ); - ti[i].dwID = ti[i].dwID * 2; + ti[i].dwID = ti[i].dwID * 2; - if (ti[i].dwFlags & TOUCHEVENTF_DOWN) { - INVOKE_WCB( *window, MultiEntry, ( ti[i].dwID, GLUT_ENTERED ) ); - INVOKE_WCB( *window, MultiButton, ( ti[i].dwID, tp.x, tp.y, 0, GLUT_DOWN ) ); - } else if (ti[i].dwFlags & TOUCHEVENTF_MOVE) { - INVOKE_WCB( *window, MultiMotion, ( ti[i].dwID, tp.x, tp.y ) ); - } else if (ti[i].dwFlags & TOUCHEVENTF_UP) { - INVOKE_WCB( *window, MultiButton, ( ti[i].dwID, tp.x, tp.y, 0, GLUT_UP ) ); - INVOKE_WCB( *window, MultiEntry, ( ti[i].dwID, GLUT_LEFT ) ); - } - } - } - fghCloseTouchInputHandle((HTOUCHINPUT)lParam); - free( (void*)ti ); - lRet = 0; /*DefWindowProc( hWnd, uMsg, wParam, lParam );*/ - break; - } + if (ti[i].dwFlags & TOUCHEVENTF_DOWN) { + INVOKE_WCB( *window, MultiEntry, ( ti[i].dwID, GLUT_ENTERED ) ); + INVOKE_WCB( *window, MultiButton, ( ti[i].dwID, tp.x, tp.y, 0, GLUT_DOWN ) ); + } else if (ti[i].dwFlags & TOUCHEVENTF_MOVE) { + INVOKE_WCB( *window, MultiMotion, ( ti[i].dwID, tp.x, tp.y ) ); + } else if (ti[i].dwFlags & TOUCHEVENTF_UP) { + INVOKE_WCB( *window, MultiButton, ( ti[i].dwID, tp.x, tp.y, 0, GLUT_UP ) ); + INVOKE_WCB( *window, MultiEntry, ( ti[i].dwID, GLUT_LEFT ) ); + } + } + } + fghCloseTouchInputHandle((HTOUCHINPUT)lParam); + free( (void*)ti ); + lRet = 0; /*DefWindowProc( hWnd, uMsg, wParam, lParam );*/ + break; + } #endif #ifdef WM_INPUT - case WM_INPUT: + case WM_INPUT: /* Added by Jinrong Xie for SpaceNavigator support on Windows. Dec 2014 */ - if (fgHasSpaceball()) - { - fgSpaceballHandleWinEvent(hWnd, wParam, lParam); - } - break; + if (fgHasSpaceball()) + { + fgSpaceballHandleWinEvent(hWnd, wParam, lParam); + } + break; #endif default: /* Handle unhandled messages */ @@ -1615,7 +1615,7 @@ void fgPlatformPosResZordWork(SFG_Window* window, unsigned int workMask) window->State.DesiredWidth = window->State.pWState.OldRect.right - window->State.pWState.OldRect.left; window->State.DesiredHeight = window->State.pWState.OldRect.bottom - window->State.pWState.OldRect.top; } - + /* We'll finish off the fullscreen operation below after the other GLUT_POSITION_WORK|GLUT_SIZE_WORK|GLUT_ZORDER_WORK */ } else @@ -1626,7 +1626,7 @@ void fgPlatformPosResZordWork(SFG_Window* window, unsigned int workMask) RECT rect; HMONITOR hMonitor; MONITORINFO mi; - + /* save current window rect, style, exstyle and maximized state */ window->State.pWState.OldMaximized = !!IsZoomed(window->Window.Handle); if (window->State.pWState.OldMaximized) @@ -1649,7 +1649,7 @@ void fgPlatformPosResZordWork(SFG_Window* window, unsigned int workMask) /* For fullscreen mode, find the monitor that is covered the most * by the window and get its rect as the resize target. - */ + */ hMonitor= MonitorFromWindow(window->Window.Handle, MONITOR_DEFAULTTONEAREST); mi.cbSize = sizeof(mi); GetMonitorInfo(hMonitor, &mi); @@ -1668,7 +1668,7 @@ void fgPlatformPosResZordWork(SFG_Window* window, unsigned int workMask) /* Now deal with normal position, reshape and z order requests (some might have been set when handling GLUT_FULLSCREEN_WORK above */ { - /* get rect describing window's current position and size, + /* get rect describing window's current position and size, * in screen coordinates and in FreeGLUT format * (size (right-left, bottom-top) is client area size, top and left * are outside of window including decorations). @@ -1678,7 +1678,7 @@ void fgPlatformPosResZordWork(SFG_Window* window, unsigned int workMask) if (workMask & GLUT_POSITION_WORK) { flags &= ~SWP_NOMOVE; - + /* Move rect so that top-left is at requested position */ /* This also automatically makes sure that child window requested coordinates are relative * to top-left of parent's client area (needed input for SetWindowPos on child windows), @@ -1689,7 +1689,7 @@ void fgPlatformPosResZordWork(SFG_Window* window, unsigned int workMask) if (workMask & GLUT_SIZE_WORK) { flags &= ~SWP_NOSIZE; - + /* Note on maximizing behavior of Windows: the resize borders are off * the screen such that the client area extends all the way from the * leftmost corner to the rightmost corner to maximize screen real @@ -1724,7 +1724,7 @@ void fgPlatformPosResZordWork(SFG_Window* window, unsigned int workMask) if (!window->Parent) /* get the window rect from this to feed to SetWindowPos, correct for window decorations */ fghComputeWindowRectFromClientArea_QueryWindow(&clientRect,window,TRUE); - + /* Do the requested positioning, moving, and z order push/pop. */ SetWindowPos( window->Window.Handle, insertAfter, From 4f5d9c918d0874bb9e71d13d2156f6637c5637c3 Mon Sep 17 00:00:00 2001 From: dcnieho Date: Wed, 12 Jul 2017 20:44:55 +0000 Subject: [PATCH 4/5] adding vs folder to ignores (cherry picked from commit 3c3337193843422c77a605bcbe0c7c0819973e10) git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1831 7f0cb862-5218-0410-a997-914c9d46530a --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3a1efc6..220615f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +freeglut/freeglut/.vs freeglut/freeglut/INSTALL freeglut/freeglut/Makefile freeglut/freeglut/Makefile.in From eaabcd6b52a3bf672c2959e6e2206b7093014552 Mon Sep 17 00:00:00 2001 From: dcnieho Date: Wed, 12 Jul 2017 20:45:07 +0000 Subject: [PATCH 5/5] moved static variables and functions that should not have stuck behind in fg_joystick.c, but should have been in fg_joystick_x11.c (cherry picked from commit 0d98472817921dc95d070f13bba59b72d792a7b2) git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1832 7f0cb862-5218-0410-a997-914c9d46530a --- freeglut/freeglut/src/fg_joystick.c | 173 ------------------ freeglut/freeglut/src/x11/fg_joystick_x11.c | 190 +++++++++++++++++++- 2 files changed, 185 insertions(+), 178 deletions(-) diff --git a/freeglut/freeglut/src/fg_joystick.c b/freeglut/freeglut/src/fg_joystick.c index 2f4f6ed..e548c04 100644 --- a/freeglut/freeglut/src/fg_joystick.c +++ b/freeglut/freeglut/src/fg_joystick.c @@ -68,8 +68,6 @@ # endif # endif -static int hatmap_x[9] = { 0, 0, 1, 1, 1, 0, -1, -1, -1 }; -static int hatmap_y[9] = { 0, 1, 1, 0, -1, -1, -1, 0, 1 }; struct os_specific_s { char fname [128 ]; int fd; @@ -98,178 +96,7 @@ struct os_specific_s { # define UHIDDEV "/dev/uhid" # define AJSDEV "/dev/joy" -# ifdef HAVE_USB_JS -/* - * fghJoystickFindUSBdev (and its helper, fghJoystickWalkUSBdev) try to locate - * the full name of a USB device. If /dev/usbN isn't readable, we punt and - * return the uhidN device name. We warn the user of this situation once. - */ -static char *fghJoystickWalkUSBdev(int f, char *dev, char *out, int outlen) -{ - struct usb_device_info di; - int i, a; - char *cp; - for (a = 1; a < USB_MAX_DEVICES; a++) { - di.udi_addr = a; - if (ioctl(f, USB_DEVICEINFO, &di) != 0) - return NULL; - for (i = 0; i < USB_MAX_DEVNAMES; i++) - if (di.udi_devnames[i][0] && - strcmp(di.udi_devnames[i], dev) == 0) { - cp = calloc( 1, strlen(di.udi_vendor) + strlen(di.udi_product) + 2); - strcpy(cp, di.udi_vendor); - strcat(cp, " "); - strcat(cp, di.udi_product); - strncpy(out, cp, outlen - 1); - out[outlen - 1] = 0; - free( cp ); - return out; - } - } - return NULL; -} - -static int fghJoystickFindUSBdev(char *name, char *out, int outlen) -{ - int i, f; - char buf[50]; - char *cp; - static int protection_warned = 0; - - for (i = 0; i < 16; i++) { - snprintf(buf, sizeof(buf), "%s%d", USBDEV, i); - f = open(buf, O_RDONLY); - if (f >= 0) { - cp = fghJoystickWalkUSBdev(f, name, out, outlen); - close(f); - if (cp) - return 1; - } - else if (errno == EACCES) { - if (!protection_warned) { - fgWarning ( "Can't open %s for read!", buf ); - protection_warned = 1; - } - } - } - return 0; -} - -static int fghJoystickInitializeHID(struct os_specific_s *os, - int *num_axes, int *num_buttons) -{ - int size, is_joystick; -# ifdef HAVE_USBHID_H - int report_id = 0; -# endif - struct hid_data *d; - struct hid_item h; - report_desc_t rd; - - if ( ( rd = hid_get_report_desc( os->fd ) ) == 0 ) - { - fgWarning ( "error: %s: %s", os->fname, strerror( errno ) ); - return FALSE; - } - - os->hids = NULL; - -# ifdef HAVE_USBHID_H - if( ioctl( os->fd, USB_GET_REPORT_ID, &report_id ) < 0) - { - /*** XXX {report_id} may not be the right variable? ***/ - fgWarning ( "error: %s%d: %s", UHIDDEV, report_id, strerror( errno ) ); - return FALSE; - } - - size = hid_report_size( rd, hid_input, report_id ); -# else - size = hid_report_size( rd, 0, hid_input ); -# endif - os->hid_data_buf = calloc( 1, size ); - os->hid_dlen = size; - - is_joystick = 0; -# ifdef HAVE_USBHID_H - d = hid_start_parse( rd, 1 << hid_input, report_id ); -# else - d = hid_start_parse( rd, 1 << hid_input ); -# endif - while( hid_get_item( d, &h ) ) - { - int usage, page, interesting_hid; - - page = HID_PAGE( h.usage ); - usage = HID_USAGE( h.usage ); - - /* This test is somewhat too simplistic, but this is how MicroSoft - * does, so I guess it works for all joysticks/game pads. */ - is_joystick = is_joystick || - ( h.kind == hid_collection && - page == HUP_GENERIC_DESKTOP && - ( usage == HUG_JOYSTICK || usage == HUG_GAME_PAD ) ); - - if( h.kind != hid_input ) - continue; - - if( !is_joystick ) - continue; - - interesting_hid = TRUE; - if( page == HUP_GENERIC_DESKTOP ) - { - switch( usage ) - { - case HUG_X: - case HUG_RX: - case HUG_Y: - case HUG_RY: - case HUG_Z: - case HUG_RZ: - case HUG_SLIDER: - if( *num_axes < _JS_MAX_AXES ) - { - os->axes_usage[ *num_axes ] = usage; - ( *num_axes )++; - } - break; - case HUG_HAT_SWITCH: - /* Allocate two axes for a hat */ - if( *num_axes + 1 < _JS_MAX_AXES ) - { - os->axes_usage[ *num_axes ] = usage; - (*num_axes)++; - os->axes_usage[ *num_axes ] = usage; - (*num_axes)++; - } - break; - default: - interesting_hid = FALSE; - break; - } - } - else if( page == HUP_BUTTON ) - { - interesting_hid = ( usage > 0 ) && - ( usage <= _JS_MAX_BUTTONS ); - - if( interesting_hid && usage - 1 > *num_buttons ) - *num_buttons = usage - 1; - } - - if( interesting_hid ) - { - h.next = os->hids; - os->hids = calloc( 1, sizeof ( struct hid_item ) ); - *os->hids = h; - } - } - hid_end_parse( d ); - - return os->hids != NULL; -} -# endif #endif /* diff --git a/freeglut/freeglut/src/x11/fg_joystick_x11.c b/freeglut/freeglut/src/x11/fg_joystick_x11.c index 04bc373..30ad4b5 100644 --- a/freeglut/freeglut/src/x11/fg_joystick_x11.c +++ b/freeglut/freeglut/src/x11/fg_joystick_x11.c @@ -42,8 +42,188 @@ #include +#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + +static int hatmap_x[9] = {0, 0, 1, 1, 1, 0, -1, -1, -1}; +static int hatmap_y[9] = {0, 1, 1, 0, -1, -1, -1, 0, 1}; + +# ifdef HAVE_USB_JS +/* +* fghJoystickFindUSBdev (and its helper, fghJoystickWalkUSBdev) try to locate +* the full name of a USB device. If /dev/usbN isn't readable, we punt and +* return the uhidN device name. We warn the user of this situation once. +*/ +static char *fghJoystickWalkUSBdev(int f, char *dev, char *out, int outlen) +{ + struct usb_device_info di; + int i, a; + char *cp; + + for (a = 1; a < USB_MAX_DEVICES; a++) { + di.udi_addr = a; + if (ioctl(f, USB_DEVICEINFO, &di) != 0) + return NULL; + for (i = 0; i < USB_MAX_DEVNAMES; i++) + if (di.udi_devnames[i][0] && + strcmp(di.udi_devnames[i], dev) == 0) { + cp = calloc(1, strlen(di.udi_vendor) + strlen(di.udi_product) + 2); + strcpy(cp, di.udi_vendor); + strcat(cp, " "); + strcat(cp, di.udi_product); + strncpy(out, cp, outlen - 1); + out[outlen - 1] = 0; + free(cp); + return out; + } + } + return NULL; +} + +static int fghJoystickFindUSBdev(char *name, char *out, int outlen) +{ + int i, f; + char buf[50]; + char *cp; + static int protection_warned = 0; + + for (i = 0; i < 16; i++) { + snprintf(buf, sizeof(buf), "%s%d", USBDEV, i); + f = open(buf, O_RDONLY); + if (f >= 0) { + cp = fghJoystickWalkUSBdev(f, name, out, outlen); + close(f); + if (cp) + return 1; + } + else if (errno == EACCES) { + if (!protection_warned) { + fgWarning("Can't open %s for read!", buf); + protection_warned = 1; + } + } + } + return 0; +} + +static int fghJoystickInitializeHID(struct os_specific_s *os, + int *num_axes, int *num_buttons) +{ + int size, is_joystick; +# ifdef HAVE_USBHID_H + int report_id = 0; +# endif + struct hid_data *d; + struct hid_item h; + report_desc_t rd; + + if ((rd = hid_get_report_desc(os->fd)) == 0) + { + fgWarning("error: %s: %s", os->fname, strerror(errno)); + return FALSE; + } + + os->hids = NULL; + +# ifdef HAVE_USBHID_H + if (ioctl(os->fd, USB_GET_REPORT_ID, &report_id) < 0) + { + /*** XXX {report_id} may not be the right variable? ***/ + fgWarning("error: %s%d: %s", UHIDDEV, report_id, strerror(errno)); + return FALSE; + } + + size = hid_report_size(rd, hid_input, report_id); +# else + size = hid_report_size(rd, 0, hid_input); +# endif + os->hid_data_buf = calloc(1, size); + os->hid_dlen = size; + + is_joystick = 0; +# ifdef HAVE_USBHID_H + d = hid_start_parse(rd, 1 << hid_input, report_id); +# else + d = hid_start_parse(rd, 1 << hid_input); +# endif + while (hid_get_item(d, &h)) + { + int usage, page, interesting_hid; + + page = HID_PAGE(h.usage); + usage = HID_USAGE(h.usage); + + /* This test is somewhat too simplistic, but this is how MicroSoft + * does, so I guess it works for all joysticks/game pads. */ + is_joystick = is_joystick || + (h.kind == hid_collection && + page == HUP_GENERIC_DESKTOP && + (usage == HUG_JOYSTICK || usage == HUG_GAME_PAD)); + + if (h.kind != hid_input) + continue; + + if (!is_joystick) + continue; + + interesting_hid = TRUE; + if (page == HUP_GENERIC_DESKTOP) + { + switch (usage) + { + case HUG_X: + case HUG_RX: + case HUG_Y: + case HUG_RY: + case HUG_Z: + case HUG_RZ: + case HUG_SLIDER: + if (*num_axes < _JS_MAX_AXES) + { + os->axes_usage[*num_axes] = usage; + (*num_axes)++; + } + break; + case HUG_HAT_SWITCH: + /* Allocate two axes for a hat */ + if (*num_axes + 1 < _JS_MAX_AXES) + { + os->axes_usage[*num_axes] = usage; + (*num_axes)++; + os->axes_usage[*num_axes] = usage; + (*num_axes)++; + } + break; + default: + interesting_hid = FALSE; + break; + } + } + else if (page == HUP_BUTTON) + { + interesting_hid = (usage > 0) && + (usage <= _JS_MAX_BUTTONS); + + if (interesting_hid && usage - 1 > *num_buttons) + *num_buttons = usage - 1; + } + + if (interesting_hid) + { + h.next = os->hids; + os->hids = calloc(1, sizeof(struct hid_item)); + *os->hids = h; + } + } + hid_end_parse(d); + + return os->hids != NULL; +} +# endif +#endif + + /*this should be defined in a header file */ -#define MAX_NUM_JOYSTICKS 2 +#define MAX_NUM_JOYSTICKS 2 extern SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ]; void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) @@ -216,15 +396,15 @@ void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes ) void fgPlatformJoystickOpen( SFG_Joystick* joy ) { #if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) - int i = 0; + int i = 0; char *cp; #endif #ifdef JS_NEW unsigned char u; - int i=0; + int i=0; #else # if defined( __linux__ ) || TARGET_HOST_SOLARIS - int i = 0; + int i = 0; int counter = 0; # endif #endif @@ -448,7 +628,7 @@ void fgPlatformJoystickClose ( int ident ) free( fgJoystick[ ident ]->pJoystick.os->hid_data_buf ); #endif free( fgJoystick[ident]->pJoystick.os ); - } + } #endif if( ! fgJoystick[ident]->error )