From 1807604001551a43829ba225b8ea33e456b1914b Mon Sep 17 00:00:00 2001 From: Yamagi Burmeister Date: Tue, 19 Oct 2010 08:25:47 +0000 Subject: [PATCH] =?UTF-8?q?R=C3=A4ume=20das=20neue=20SDL=20Input=20Backend?= =?UTF-8?q?=20auf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sdl/input.c | 175 +++++++++++++++++++++++------------------ src/unix/header/unix.h | 14 +--- src/unix/system.c | 4 +- src/unix/vid/refresh.c | 111 +++++++++++--------------- 4 files changed, 148 insertions(+), 156 deletions(-) diff --git a/src/sdl/input.c b/src/sdl/input.c index a530694c..341cfc26 100644 --- a/src/sdl/input.c +++ b/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(); } } } diff --git a/src/unix/header/unix.h b/src/unix/header/unix.h index ef399cf5..6edefca5 100644 --- a/src/unix/header/unix.h +++ b/src/unix/header/unix.h @@ -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 (); - diff --git a/src/unix/system.c b/src/unix/system.c index 201a6b9f..4c2fa490 100644 --- a/src/unix/system.c +++ b/src/unix/system.c @@ -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 diff --git a/src/unix/vid/refresh.c b/src/unix/vid/refresh.c index 99b376d2..eab80aef 100644 --- a/src/unix/vid/refresh.c +++ b/src/unix/vid/refresh.c @@ -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();