mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-10 15:21:44 +00:00
Räume das neue SDL Input Backend auf
This commit is contained in:
parent
aabf1567ae
commit
1807604001
4 changed files with 148 additions and 156 deletions
171
src/sdl/input.c
171
src/sdl/input.c
|
@ -30,14 +30,17 @@
|
|||
#include "../client/input/header/keyboard.h"
|
||||
#include "../unix/header/unix.h"
|
||||
|
||||
#define MOUSE_MAX 3000
|
||||
#define MOUSE_MIN 40
|
||||
|
||||
static int old_windowed_mouse;
|
||||
static cvar_t *windowed_mouse;
|
||||
static cvar_t *windowed_mouse_always;
|
||||
static int mouse_x, mouse_y;
|
||||
static int old_mouse_x, old_mouse_y;
|
||||
static int mouse_x, mouse_y;
|
||||
static int old_mouse_x, old_mouse_y;
|
||||
static qboolean mouse_avail;
|
||||
static int mouse_buttonstate;
|
||||
static int mouse_oldbuttonstate;
|
||||
static int mouse_buttonstate;
|
||||
static int mouse_oldbuttonstate;
|
||||
|
||||
struct
|
||||
{
|
||||
|
@ -52,10 +55,10 @@ int my;
|
|||
|
||||
Key_Event_fp_t Key_Event_fp;
|
||||
|
||||
extern SDL_Surface *surface;
|
||||
static in_state_t *in_state;
|
||||
extern SDL_Surface *surface;
|
||||
static in_state_t *in_state;
|
||||
static unsigned char KeyStates[SDLK_LAST];
|
||||
static qboolean mlooking;
|
||||
static qboolean mlooking;
|
||||
|
||||
static cvar_t *sensitivity;
|
||||
static cvar_t *exponential_speedup;
|
||||
|
@ -68,8 +71,13 @@ static cvar_t *freelook;
|
|||
static cvar_t *m_filter;
|
||||
static cvar_t *in_mouse;
|
||||
|
||||
/*
|
||||
* This function translates the SDL keycodes
|
||||
* to the internal key representation of the
|
||||
* id Tech 2 engine.
|
||||
*/
|
||||
int
|
||||
RW_IN_TranslateSDLtoQ2Key(unsigned int keysym)
|
||||
IN_TranslateSDLtoQ2Key(unsigned int keysym)
|
||||
{
|
||||
int key = 0;
|
||||
|
||||
|
@ -170,40 +178,11 @@ RW_IN_TranslateSDLtoQ2Key(unsigned int keysym)
|
|||
return key;
|
||||
}
|
||||
|
||||
/*
|
||||
* Input event processing
|
||||
*/
|
||||
void
|
||||
RW_IN_PlatformInit()
|
||||
{
|
||||
/*if( !SDL_WasInit( SDL_INIT_VIDEO ) )
|
||||
{
|
||||
Com_Error( ERR_FATAL, "RW_IN_PlatformInit called before GLimp_Init( SDL_INIT_VIDEO )\n" );
|
||||
return;
|
||||
} */
|
||||
|
||||
Com_Printf( "\n------- Input Initialization -------\n" );
|
||||
|
||||
SDL_EnableUNICODE( 0 );
|
||||
SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL );
|
||||
|
||||
windowed_mouse = ri.Cvar_Get ("windowed_mouse", "1", CVAR_ARCHIVE);
|
||||
windowed_mouse_always = ri.Cvar_Get ("windowed_mouse_always", "2", CVAR_ARCHIVE);
|
||||
|
||||
Com_Printf( "\n------------------------------------\n" );
|
||||
}
|
||||
|
||||
void
|
||||
KBD_Init(Key_Event_fp_t fp)
|
||||
{
|
||||
Key_Event_fp = fp;
|
||||
}
|
||||
|
||||
static void
|
||||
Force_CenterView_f ( void )
|
||||
{
|
||||
in_state->viewangles [ PITCH ] = 0;
|
||||
}
|
||||
|
||||
void
|
||||
GetEvent(SDL_Event *event)
|
||||
IN_GetEvent(SDL_Event *event)
|
||||
{
|
||||
unsigned int key;
|
||||
|
||||
|
@ -258,7 +237,7 @@ GetEvent(SDL_Event *event)
|
|||
KeyStates[event->key.keysym.sym] = 1;
|
||||
|
||||
/* Get the pressed key and add it to the key list */
|
||||
key = RW_IN_TranslateSDLtoQ2Key(event->key.keysym.sym);
|
||||
key = IN_TranslateSDLtoQ2Key(event->key.keysym.sym);
|
||||
if (key)
|
||||
{
|
||||
keyq[keyq_head].key = key;
|
||||
|
@ -274,7 +253,7 @@ GetEvent(SDL_Event *event)
|
|||
KeyStates[event->key.keysym.sym] = 0;
|
||||
|
||||
/* Get the pressed key and remove it from the key list */
|
||||
key = RW_IN_TranslateSDLtoQ2Key(event->key.keysym.sym);
|
||||
key = IN_TranslateSDLtoQ2Key(event->key.keysym.sym);
|
||||
if (key)
|
||||
{
|
||||
keyq[keyq_head].key = key;
|
||||
|
@ -286,24 +265,26 @@ GetEvent(SDL_Event *event)
|
|||
}
|
||||
}
|
||||
|
||||
void KBD_Update(void)
|
||||
/*
|
||||
* Updates the state of the input queue
|
||||
*/
|
||||
void IN_Update(void)
|
||||
{
|
||||
SDL_Event event;
|
||||
static int KBD_Update_Flag;
|
||||
static int IN_Update_Flag;
|
||||
int bstate;
|
||||
|
||||
/* Protection against multiple calls */
|
||||
if (KBD_Update_Flag == 1)
|
||||
if (IN_Update_Flag == 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
KBD_Update_Flag = 1;
|
||||
in_state_t *in_state = getState();
|
||||
IN_Update_Flag = 1;
|
||||
|
||||
while (SDL_PollEvent(&event))
|
||||
{
|
||||
GetEvent(&event);
|
||||
IN_GetEvent(&event);
|
||||
}
|
||||
|
||||
/* Mouse button processing. Button 4
|
||||
|
@ -373,10 +354,14 @@ void KBD_Update(void)
|
|||
keyq_tail = (keyq_tail + 1) & 63;
|
||||
}
|
||||
|
||||
KBD_Update_Flag = 0;
|
||||
IN_Update_Flag = 0;
|
||||
}
|
||||
|
||||
void KBD_Close(void)
|
||||
/*
|
||||
* Closes all inputs and clears
|
||||
* the input queue.
|
||||
*/
|
||||
void IN_Close(void)
|
||||
{
|
||||
keyq_head = 0;
|
||||
keyq_tail = 0;
|
||||
|
@ -384,42 +369,66 @@ void KBD_Close(void)
|
|||
memset(keyq, 0, sizeof(keyq));
|
||||
}
|
||||
|
||||
void getMouse(int *x, int *y, int *state) {
|
||||
/*
|
||||
* Gets the mouse state
|
||||
*/
|
||||
void IN_GetMouseState(int *x, int *y, int *state) {
|
||||
*x = mx;
|
||||
*y = my;
|
||||
*state = mouse_buttonstate;
|
||||
}
|
||||
|
||||
void doneMouse() {
|
||||
mx = my = 0;
|
||||
}
|
||||
|
||||
void RW_IN_Activate(qboolean active)
|
||||
/*
|
||||
* Cleares the mouse state
|
||||
*/
|
||||
void IN_ClearMouseState()
|
||||
{
|
||||
mx = my = 0;
|
||||
}
|
||||
|
||||
in_state_t *
|
||||
getState ()
|
||||
{
|
||||
return ( in_state );
|
||||
}
|
||||
|
||||
/*
|
||||
* Centers the view
|
||||
*/
|
||||
static void
|
||||
RW_IN_MLookDown ( void )
|
||||
IN_ForceCenterView ( void )
|
||||
{
|
||||
in_state->viewangles [ PITCH ] = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Look up
|
||||
*/
|
||||
static void
|
||||
IN_MLookDown ( void )
|
||||
{
|
||||
mlooking = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Look down
|
||||
*/
|
||||
static void
|
||||
RW_IN_MLookUp ( void )
|
||||
IN_MLookUp ( void )
|
||||
{
|
||||
mlooking = false;
|
||||
in_state->IN_CenterView_fp();
|
||||
}
|
||||
|
||||
/*
|
||||
* Keyboard initialisation. Called
|
||||
* by the client via function pointer
|
||||
*/
|
||||
void
|
||||
RW_IN_Init ( in_state_t *in_state_p )
|
||||
IN_KeyboardInit(Key_Event_fp_t fp)
|
||||
{
|
||||
Key_Event_fp = fp;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initializes the backend
|
||||
*/
|
||||
void
|
||||
IN_BackendInit ( in_state_t *in_state_p )
|
||||
{
|
||||
in_state = in_state_p;
|
||||
m_filter = ri.Cvar_Get( "m_filter", "0", 0 );
|
||||
|
@ -435,18 +444,28 @@ RW_IN_Init ( in_state_t *in_state_p )
|
|||
m_forward = ri.Cvar_Get( "m_forward", "1", 0 );
|
||||
m_side = ri.Cvar_Get( "m_side", "0.8", 0 );
|
||||
|
||||
ri.Cmd_AddCommand( "+mlook", RW_IN_MLookDown );
|
||||
ri.Cmd_AddCommand( "-mlook", RW_IN_MLookUp );
|
||||
ri.Cmd_AddCommand( "force_centerview", Force_CenterView_f );
|
||||
ri.Cmd_AddCommand( "+mlook", IN_MLookDown );
|
||||
ri.Cmd_AddCommand( "-mlook", IN_MLookUp );
|
||||
ri.Cmd_AddCommand( "force_centerview", IN_ForceCenterView );
|
||||
|
||||
mouse_x = mouse_y = 0.0;
|
||||
mouse_avail = true;
|
||||
|
||||
RW_IN_PlatformInit();
|
||||
/* SDL stuff */
|
||||
SDL_EnableUNICODE( 0 );
|
||||
SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL );
|
||||
|
||||
windowed_mouse = ri.Cvar_Get ("windowed_mouse", "1", CVAR_ARCHIVE);
|
||||
windowed_mouse_always = ri.Cvar_Get ("windowed_mouse_always", "2", CVAR_ARCHIVE);
|
||||
|
||||
Com_Printf( "Input initialized.\n" );
|
||||
}
|
||||
|
||||
/*
|
||||
* Shuts the backend down
|
||||
*/
|
||||
void
|
||||
RW_IN_Shutdown ( void )
|
||||
IN_BackendShutdown ( void )
|
||||
{
|
||||
if ( mouse_avail )
|
||||
{
|
||||
|
@ -459,13 +478,13 @@ RW_IN_Shutdown ( void )
|
|||
}
|
||||
|
||||
void
|
||||
RW_IN_Commands ( void )
|
||||
IN_BackendMouseButtons ( void )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( mouse_avail )
|
||||
{
|
||||
getMouse( &mouse_x, &mouse_y, &mouse_buttonstate );
|
||||
IN_GetMouseState( &mouse_x, &mouse_y, &mouse_buttonstate );
|
||||
|
||||
for ( i = 0; i < 3; i++ )
|
||||
{
|
||||
|
@ -505,11 +524,11 @@ RW_IN_Commands ( void )
|
|||
}
|
||||
|
||||
void
|
||||
RW_IN_Move ( usercmd_t *cmd )
|
||||
IN_BackendMove ( usercmd_t *cmd )
|
||||
{
|
||||
if ( mouse_avail )
|
||||
{
|
||||
getMouse( &mouse_x, &mouse_y, &mouse_buttonstate );
|
||||
IN_GetMouseState( &mouse_x, &mouse_y, &mouse_buttonstate );
|
||||
|
||||
if ( m_filter->value )
|
||||
{
|
||||
|
@ -576,7 +595,7 @@ RW_IN_Move ( usercmd_t *cmd )
|
|||
cmd->forwardmove -= m_forward->value * mouse_y;
|
||||
}
|
||||
|
||||
doneMouse();
|
||||
IN_ClearMouseState();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,17 +26,7 @@
|
|||
*/
|
||||
|
||||
typedef void ( *Key_Event_fp_t )( int key, qboolean down );
|
||||
|
||||
extern void ( *KBD_Update_fp )( void );
|
||||
extern void ( *KBD_Init_fp )( Key_Event_fp_t fp );
|
||||
extern void ( *KBD_Close_fp )( void );
|
||||
|
||||
void RW_IN_PlatformInit ();
|
||||
|
||||
#define MOUSE_MAX 3000
|
||||
#define MOUSE_MIN 40
|
||||
|
||||
void getMouse ( int *x, int *y, int *state );
|
||||
extern void ( *IN_Update_fp )( void );
|
||||
|
||||
typedef struct in_state
|
||||
{
|
||||
|
@ -48,5 +38,3 @@ typedef struct in_state
|
|||
int *in_speed_state;
|
||||
} in_state_t;
|
||||
|
||||
in_state_t *getState ();
|
||||
|
||||
|
|
|
@ -481,9 +481,9 @@ Sys_SendKeyEvents ( void )
|
|||
{
|
||||
#ifndef DEDICATED_ONLY
|
||||
|
||||
if ( KBD_Update_fp )
|
||||
if ( IN_Update_fp )
|
||||
{
|
||||
KBD_Update_fp();
|
||||
IN_Update_fp();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -58,20 +58,18 @@ qboolean reflib_active = 0;
|
|||
|
||||
#define VID_NUM_MODES ( sizeof ( vid_modes ) / sizeof ( vid_modes [ 0 ] ) )
|
||||
|
||||
/* KEYBOARD */
|
||||
/* INPUT */
|
||||
void Do_Key_Event ( int key, qboolean down );
|
||||
void ( *KBD_Update_fp )( void );
|
||||
void ( *KBD_Init_fp )( Key_Event_fp_t fp );
|
||||
void ( *KBD_Close_fp )( void );
|
||||
void ( *IN_Update_fp )( void );
|
||||
void ( *IN_KeyboardInit_fp )( Key_Event_fp_t fp );
|
||||
void ( *IN_Close_fp )( void );
|
||||
|
||||
/* MOUSE */
|
||||
in_state_t in_state;
|
||||
|
||||
void ( *RW_IN_Init_fp )( in_state_t *in_state_p );
|
||||
void ( *RW_IN_Shutdown_fp )( void );
|
||||
void ( *RW_IN_Activate_fp )( qboolean active );
|
||||
void ( *RW_IN_Commands_fp )( void );
|
||||
void ( *RW_IN_Move_fp )( usercmd_t *cmd );
|
||||
void ( *IN_BackendInit_fp )( in_state_t *in_state_p );
|
||||
void ( *IN_BackendShutdown_fp )( void );
|
||||
void ( *IN_BackendMouseButtons_fp )( void );
|
||||
void ( *IN_BackendMove_fp )( usercmd_t *cmd );
|
||||
void ( *RW_IN_Frame_fp )( void );
|
||||
|
||||
void IN_Init ( void );
|
||||
|
@ -186,27 +184,26 @@ VID_FreeReflib ( void )
|
|||
{
|
||||
if ( reflib_library )
|
||||
{
|
||||
if ( KBD_Close_fp )
|
||||
if ( IN_Close_fp )
|
||||
{
|
||||
KBD_Close_fp();
|
||||
IN_Close_fp();
|
||||
}
|
||||
|
||||
if ( RW_IN_Shutdown_fp )
|
||||
if ( IN_BackendShutdown_fp )
|
||||
{
|
||||
RW_IN_Shutdown_fp();
|
||||
IN_BackendShutdown_fp();
|
||||
}
|
||||
|
||||
dlclose( reflib_library );
|
||||
}
|
||||
|
||||
KBD_Init_fp = NULL;
|
||||
KBD_Update_fp = NULL;
|
||||
KBD_Close_fp = NULL;
|
||||
RW_IN_Init_fp = NULL;
|
||||
RW_IN_Shutdown_fp = NULL;
|
||||
RW_IN_Activate_fp = NULL;
|
||||
RW_IN_Commands_fp = NULL;
|
||||
RW_IN_Move_fp = NULL;
|
||||
IN_KeyboardInit_fp = NULL;
|
||||
IN_Update_fp = NULL;
|
||||
IN_Close_fp = NULL;
|
||||
IN_BackendInit_fp = NULL;
|
||||
IN_BackendShutdown_fp = NULL;
|
||||
IN_BackendMouseButtons_fp = NULL;
|
||||
IN_BackendMove_fp = NULL;
|
||||
RW_IN_Frame_fp = NULL;
|
||||
RW_Sys_GetClipboardData_fp = NULL;
|
||||
|
||||
|
@ -227,18 +224,18 @@ VID_LoadRefresh ( char *name )
|
|||
|
||||
if ( reflib_active )
|
||||
{
|
||||
if ( KBD_Close_fp )
|
||||
if ( IN_Close_fp )
|
||||
{
|
||||
KBD_Close_fp();
|
||||
IN_Close_fp();
|
||||
}
|
||||
|
||||
if ( RW_IN_Shutdown_fp )
|
||||
if ( IN_BackendShutdown_fp )
|
||||
{
|
||||
RW_IN_Shutdown_fp();
|
||||
IN_BackendShutdown_fp();
|
||||
}
|
||||
|
||||
KBD_Close_fp = NULL;
|
||||
RW_IN_Shutdown_fp = NULL;
|
||||
IN_Close_fp = NULL;
|
||||
IN_BackendShutdown_fp = NULL;
|
||||
re.Shutdown();
|
||||
VID_FreeReflib();
|
||||
}
|
||||
|
@ -303,10 +300,10 @@ VID_LoadRefresh ( char *name )
|
|||
in_state.in_strafe_state = &in_strafe.state;
|
||||
in_state.in_speed_state = &in_speed.state;
|
||||
|
||||
if ( ( ( RW_IN_Init_fp = dlsym( reflib_library, "RW_IN_Init" ) ) == NULL ) ||
|
||||
( ( RW_IN_Shutdown_fp = dlsym( reflib_library, "RW_IN_Shutdown" ) ) == NULL ) ||
|
||||
( ( RW_IN_Commands_fp = dlsym( reflib_library, "RW_IN_Commands" ) ) == NULL ) ||
|
||||
( ( RW_IN_Move_fp = dlsym( reflib_library, "RW_IN_Move" ) ) == NULL ) )
|
||||
if ( ( ( IN_BackendInit_fp = dlsym( reflib_library, "IN_BackendInit" ) ) == NULL ) ||
|
||||
( ( IN_BackendShutdown_fp = dlsym( reflib_library, "IN_BackendShutdown" ) ) == NULL ) ||
|
||||
( ( IN_BackendMouseButtons_fp = dlsym( reflib_library, "IN_BackendMouseButtons" ) ) == NULL ) ||
|
||||
( ( IN_BackendMove_fp = dlsym( reflib_library, "IN_BackendMove" ) ) == NULL ) )
|
||||
{
|
||||
Sys_Error( "No RW_IN functions in REF.\n" );
|
||||
}
|
||||
|
@ -323,15 +320,15 @@ VID_LoadRefresh ( char *name )
|
|||
return ( false );
|
||||
}
|
||||
|
||||
/* Init KBD */
|
||||
if ( ( ( KBD_Init_fp = dlsym( reflib_library, "KBD_Init" ) ) == NULL ) ||
|
||||
( ( KBD_Update_fp = dlsym( reflib_library, "KBD_Update" ) ) == NULL ) ||
|
||||
( ( KBD_Close_fp = dlsym( reflib_library, "KBD_Close" ) ) == NULL ) )
|
||||
/* Init IN */
|
||||
if ( ( ( IN_KeyboardInit_fp = dlsym( reflib_library, "IN_KeyboardInit" ) ) == NULL ) ||
|
||||
( ( IN_Update_fp = dlsym( reflib_library, "IN_Update" ) ) == NULL ) ||
|
||||
( ( IN_Close_fp = dlsym( reflib_library, "IN_Close" ) ) == NULL ) )
|
||||
{
|
||||
Sys_Error( "No KBD functions in REF.\n" );
|
||||
}
|
||||
|
||||
KBD_Init_fp( Do_Key_Event );
|
||||
IN_KeyboardInit_fp( Do_Key_Event );
|
||||
Key_ClearStates();
|
||||
|
||||
/* give up root now */
|
||||
|
@ -402,18 +399,18 @@ VID_Shutdown ( void )
|
|||
{
|
||||
if ( reflib_active )
|
||||
{
|
||||
if ( KBD_Close_fp )
|
||||
if ( IN_Close_fp )
|
||||
{
|
||||
KBD_Close_fp();
|
||||
IN_Close_fp();
|
||||
}
|
||||
|
||||
if ( RW_IN_Shutdown_fp )
|
||||
if ( IN_BackendShutdown_fp )
|
||||
{
|
||||
RW_IN_Shutdown_fp();
|
||||
IN_BackendShutdown_fp();
|
||||
}
|
||||
|
||||
KBD_Close_fp = NULL;
|
||||
RW_IN_Shutdown_fp = NULL;
|
||||
IN_Close_fp = NULL;
|
||||
IN_BackendShutdown_fp = NULL;
|
||||
re.Shutdown();
|
||||
VID_FreeReflib();
|
||||
}
|
||||
|
@ -450,54 +447,42 @@ VID_CheckRefExists ( const char *ref )
|
|||
void
|
||||
IN_Init ( void )
|
||||
{
|
||||
if ( RW_IN_Init_fp )
|
||||
if ( IN_BackendInit_fp )
|
||||
{
|
||||
RW_IN_Init_fp( &in_state );
|
||||
IN_BackendInit_fp( &in_state );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_Shutdown ( void )
|
||||
{
|
||||
if ( RW_IN_Shutdown_fp )
|
||||
if ( IN_BackendShutdown_fp )
|
||||
{
|
||||
RW_IN_Shutdown_fp();
|
||||
IN_BackendShutdown_fp();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_Commands ( void )
|
||||
{
|
||||
if ( RW_IN_Commands_fp )
|
||||
if ( IN_BackendMouseButtons_fp )
|
||||
{
|
||||
RW_IN_Commands_fp();
|
||||
IN_BackendMouseButtons_fp();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_Move ( usercmd_t *cmd )
|
||||
{
|
||||
if ( RW_IN_Move_fp )
|
||||
if ( IN_BackendMove_fp )
|
||||
{
|
||||
RW_IN_Move_fp( cmd );
|
||||
IN_BackendMove_fp( cmd );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IN_Frame ( void )
|
||||
{
|
||||
if ( RW_IN_Activate_fp )
|
||||
{
|
||||
if ( !cl.refresh_prepped || ( cls.key_dest == key_console ) || ( cls.key_dest == key_menu ) )
|
||||
{
|
||||
RW_IN_Activate_fp( false );
|
||||
}
|
||||
else
|
||||
{
|
||||
RW_IN_Activate_fp( true );
|
||||
}
|
||||
}
|
||||
|
||||
if ( RW_IN_Frame_fp )
|
||||
{
|
||||
RW_IN_Frame_fp();
|
||||
|
|
Loading…
Reference in a new issue