@ -28,8 +28,90 @@
@@ -28,8 +28,90 @@
# endif
# ifdef USE_SDL2
# define ARRAYSIZE(p) ( sizeof(p) / sizeof(p[0]) )
# include <dlfcn.h>
# include <SDL2/SDL_mouse.h>
# include <SDL2/SDL_gamecontroller.h>
int ( * pfnSDL_SetRelativeMouseMode ) ( SDL_bool ) ;
Uint32 ( * pfnSDL_GetRelativeMouseState ) ( int * x , int * y ) ;
int ( * pfnSDL_NumJoysticks ) ( void ) ;
SDL_bool ( * pfnSDL_IsGameController ) ( int ) ;
SDL_GameController * ( * pfnSDL_GameControllerOpen ) ( int ) ;
Sint16 ( * pfnSDL_GameControllerGetAxis ) ( SDL_GameController * , SDL_GameControllerAxis ) ;
Uint8 ( * pfnSDL_GameControllerGetButton ) ( SDL_GameController * , SDL_GameControllerButton ) ;
void ( * pfnSDL_JoystickUpdate ) ( void ) ;
const char * ( * pfnSDL_GameControllerName ) ( SDL_GameController * ) ;
int safe_pfnSDL_SetRelativeMouseMode ( SDL_bool mode )
{
if ( pfnSDL_SetRelativeMouseMode )
return pfnSDL_SetRelativeMouseMode ( mode ) ;
return - 1 ;
}
Uint32 safe_pfnSDL_GetRelativeMouseState ( int * x , int * y )
{
if ( pfnSDL_GetRelativeMouseState )
return pfnSDL_GetRelativeMouseState ( x , y ) ;
return 0 ;
}
int safe_pfnSDL_NumJoysticks ( )
{
if ( pfnSDL_NumJoysticks )
return pfnSDL_NumJoysticks ( ) ;
return - 1 ;
}
SDL_bool safe_pfnSDL_IsGameController ( int joystick_index )
{
if ( pfnSDL_IsGameController )
return pfnSDL_IsGameController ( joystick_index ) ;
return SDL_FALSE ;
}
SDL_GameController * safe_pfnSDL_GameControllerOpen ( int joystick_index )
{
if ( pfnSDL_GameControllerOpen )
return pfnSDL_GameControllerOpen ( joystick_index ) ;
return NULL ;
}
Sint16 safe_pfnSDL_GameControllerGetAxis ( SDL_GameController * gamecontroller , SDL_GameControllerAxis axis )
{
if ( pfnSDL_GameControllerGetAxis )
return pfnSDL_GameControllerGetAxis ( gamecontroller , axis ) ;
return 0 ;
}
Uint8 safe_pfnSDL_GameControllerGetButton ( SDL_GameController * gamecontroller , SDL_GameControllerButton button )
{
if ( pfnSDL_GameControllerGetButton )
return pfnSDL_GameControllerGetButton ( gamecontroller , button ) ;
return 0 ;
}
void safe_pfnSDL_JoystickUpdate ( )
{
if ( pfnSDL_JoystickUpdate )
pfnSDL_JoystickUpdate ( ) ;
}
const char * safe_pfnSDL_GameControllerName ( SDL_GameController * gamecontroller )
{
if ( pfnSDL_GameControllerName )
return pfnSDL_GameControllerName ( gamecontroller ) ;
return NULL ;
}
struct SDLFunction
{
void * * ppfnFunc ;
const char * name ;
} ;
static SDLFunction sdlFunctions [ ] = {
{ ( void * * ) & pfnSDL_SetRelativeMouseMode , " SDL_SetRelativeMouseMode " } ,
{ ( void * * ) & pfnSDL_GetRelativeMouseState , " SDL_GetRelativeMouseState " } ,
{ ( void * * ) & pfnSDL_NumJoysticks , " SDL_NumJoysticks " } ,
{ ( void * * ) & pfnSDL_IsGameController , " SDL_IsGameController " } ,
{ ( void * * ) & pfnSDL_GameControllerOpen , " SDL_GameControllerOpen " } ,
{ ( void * * ) & pfnSDL_GameControllerGetAxis , " SDL_GameControllerGetAxis " } ,
{ ( void * * ) & pfnSDL_GameControllerGetButton , " SDL_GameControllerGetButton " } ,
{ ( void * * ) & pfnSDL_JoystickUpdate , " SDL_JoystickUpdate " } ,
{ ( void * * ) & pfnSDL_GameControllerName , " SDL_GameControllerName " }
} ;
# endif
# ifdef _WIN32
@ -289,12 +371,12 @@ void IN_SetMouseMode(bool enable)
@@ -289,12 +371,12 @@ void IN_SetMouseMode(bool enable)
if ( m_bRawInput )
{
# ifdef USE_SDL2
SDL_SetRelativeMouseMode ( SDL_TRUE ) ;
safe_pfn SDL_SetRelativeMouseMode( SDL_TRUE ) ;
# endif
isMouseRelative = true ;
}
# else
SDL_SetRelativeMouseMode ( SDL_TRUE ) ;
safe_pfn SDL_SetRelativeMouseMode( SDL_TRUE ) ;
# endif
currentMouseMode = true ;
@ -305,7 +387,7 @@ void IN_SetMouseMode(bool enable)
@@ -305,7 +387,7 @@ void IN_SetMouseMode(bool enable)
if ( isMouseRelative )
{
# ifdef USE_SDL2
SDL_SetRelativeMouseMode ( SDL_FALSE ) ;
safe_pfn SDL_SetRelativeMouseMode( SDL_FALSE ) ;
# endif
isMouseRelative = false ;
}
@ -313,7 +395,7 @@ void IN_SetMouseMode(bool enable)
@@ -313,7 +395,7 @@ void IN_SetMouseMode(bool enable)
if ( restore_spi )
SystemParametersInfo ( SPI_SETMOUSE , 0 , originalmouseparms , 0 ) ;
# else
SDL_SetRelativeMouseMode ( SDL_FALSE ) ;
safe_pfn SDL_SetRelativeMouseMode( SDL_FALSE ) ;
# endif
currentMouseMode = false ;
@ -464,6 +546,14 @@ void GoldSourceInput::IN_Shutdown (void)
@@ -464,6 +546,14 @@ void GoldSourceInput::IN_Shutdown (void)
s_hMouseThreadActiveLock = ( HANDLE ) 0 ;
}
# endif
# ifdef USE_SDL2
for ( int j = 0 ; j < ARRAYSIZE ( sdlFunctions ) ; + + j ) {
* ( sdlFunctions [ j ] . ppfnFunc ) = NULL ;
}
dlclose ( sdl2Lib ) ;
sdl2Lib = NULL ;
# endif
}
/*
@ -623,7 +713,7 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
@@ -623,7 +713,7 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
# endif
{
# ifdef USE_SDL2
SDL_GetRelativeMouseState ( & deltaX , & deltaY ) ;
safe_pfn SDL_GetRelativeMouseState( & deltaX , & deltaY ) ;
current_pos . x = deltaX ;
current_pos . y = deltaY ;
# else
@ -679,14 +769,14 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
@@ -679,14 +769,14 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
if ( m_bRawInput & & ! isMouseRelative )
{
# ifdef USE_SDL2
SDL_SetRelativeMouseMode ( SDL_TRUE ) ;
safe_pfn SDL_SetRelativeMouseMode( SDL_TRUE ) ;
# endif
isMouseRelative = true ;
}
else if ( ! m_bRawInput & & isMouseRelative )
{
# ifdef USE_SDL2
SDL_SetRelativeMouseMode ( SDL_FALSE ) ;
safe_pfn SDL_SetRelativeMouseMode( SDL_FALSE ) ;
# endif
isMouseRelative = false ;
}
@ -815,7 +905,7 @@ void GoldSourceInput::IN_Accumulate (void)
@@ -815,7 +905,7 @@ void GoldSourceInput::IN_Accumulate (void)
{
# ifdef USE_SDL2
int deltaX , deltaY ;
SDL_GetRelativeMouseState ( & deltaX , & deltaY ) ;
safe_pfn SDL_GetRelativeMouseState( & deltaX , & deltaY ) ;
mx_accum + = deltaX ;
my_accum + = deltaY ;
# else
@ -869,14 +959,14 @@ void IN_StartupJoystick (void)
@@ -869,14 +959,14 @@ void IN_StartupJoystick (void)
// assume no joystick
joy_avail = 0 ;
# ifdef USE_SDL2
int nJoysticks = SDL_NumJoysticks ( ) ;
int nJoysticks = safe_pfn SDL_NumJoysticks( ) ;
if ( nJoysticks > 0 )
{
for ( int i = 0 ; i < nJoysticks ; i + + )
{
if ( SDL_IsGameController ( i ) )
if ( safe_pfn SDL_IsGameController( i ) )
{
s_pJoystick = SDL_GameControllerOpen ( i ) ;
s_pJoystick = safe_pfn SDL_GameControllerOpen( i ) ;
if ( s_pJoystick )
{
//save the joystick's number of buttons and POV status
@ -888,7 +978,7 @@ void IN_StartupJoystick (void)
@@ -888,7 +978,7 @@ void IN_StartupJoystick (void)
// mark the joystick as available and advanced initialization not completed
// this is needed as cvars are not available during initialization
gEngfuncs . Con_Printf ( " joystick found \n \n " , SDL_GameControllerName ( s_pJoystick ) ) ;
gEngfuncs . Con_Printf ( " joystick found \n \n " , safe_pfn SDL_GameControllerName( s_pJoystick ) ) ;
joy_avail = 1 ;
joy_advancedinit = 0 ;
break ;
@ -912,13 +1002,13 @@ int RawValuePointer (int axis)
@@ -912,13 +1002,13 @@ int RawValuePointer (int axis)
{
default :
case JOY_AXIS_X :
return SDL_GameControllerGetAxis ( s_pJoystick , SDL_CONTROLLER_AXIS_LEFTX ) ;
return safe_pfn SDL_GameControllerGetAxis( s_pJoystick , SDL_CONTROLLER_AXIS_LEFTX ) ;
case JOY_AXIS_Y :
return SDL_GameControllerGetAxis ( s_pJoystick , SDL_CONTROLLER_AXIS_LEFTY ) ;
return safe_pfn SDL_GameControllerGetAxis( s_pJoystick , SDL_CONTROLLER_AXIS_LEFTY ) ;
case JOY_AXIS_Z :
return SDL_GameControllerGetAxis ( s_pJoystick , SDL_CONTROLLER_AXIS_RIGHTX ) ;
return safe_pfn SDL_GameControllerGetAxis( s_pJoystick , SDL_CONTROLLER_AXIS_RIGHTX ) ;
case JOY_AXIS_R :
return SDL_GameControllerGetAxis ( s_pJoystick , SDL_CONTROLLER_AXIS_RIGHTY ) ;
return safe_pfn SDL_GameControllerGetAxis( s_pJoystick , SDL_CONTROLLER_AXIS_RIGHTY ) ;
}
# else
@ -1011,7 +1101,7 @@ void GoldSourceInput::IN_Commands (void)
@@ -1011,7 +1101,7 @@ void GoldSourceInput::IN_Commands (void)
# ifdef USE_SDL2
for ( i = 0 ; i < SDL_CONTROLLER_BUTTON_MAX ; i + + )
{
if ( SDL_GameControllerGetButton ( s_pJoystick , ( SDL_GameControllerButton ) i ) )
if ( safe_pfn SDL_GameControllerGetButton( s_pJoystick , ( SDL_GameControllerButton ) i ) )
{
buttonstate | = 1 < < i ;
}
@ -1071,7 +1161,7 @@ IN_ReadJoystick
@@ -1071,7 +1161,7 @@ IN_ReadJoystick
int IN_ReadJoystick ( void )
{
# ifdef USE_SDL2
SDL_JoystickUpdate ( ) ;
safe_pfn SDL_JoystickUpdate( ) ;
# endif
return 1 ;
}
@ -1344,6 +1434,24 @@ void GoldSourceInput::IN_Init (void)
@@ -1344,6 +1434,24 @@ void GoldSourceInput::IN_Init (void)
}
# endif
# ifdef USE_SDL2
# ifdef __APPLE__
# define SDL2_FULL_LIBNAME "libsdl2-2.0.0.dylib"
# else
# define SDL2_FULL_LIBNAME "libSDL2-2.0.so.0"
# endif
sdl2Lib = dlopen ( SDL2_FULL_LIBNAME , RTLD_NOW | RTLD_LOCAL ) ;
if ( sdl2Lib ) {
for ( int j = 0 ; j < ARRAYSIZE ( sdlFunctions ) ; + + j ) {
* ( sdlFunctions [ j ] . ppfnFunc ) = dlsym ( sdl2Lib , sdlFunctions [ j ] . name ) ;
if ( * sdlFunctions [ j ] . ppfnFunc = = NULL ) {
gEngfuncs . Con_Printf ( " Could not load SDL2 function %s: %s \n " , sdlFunctions [ j ] . name , dlerror ( ) ) ;
}
}
} else {
gEngfuncs . Con_Printf ( " Could not load SDL2: %s \n " , dlerror ( ) ) ;
}
# endif
gEngfuncs . pfnAddCommand ( " force_centerview " , Force_CenterView_f ) ;
gEngfuncs . pfnAddCommand ( " joyadvancedupdate " , Joy_AdvancedUpdate_f ) ;