aboutsummaryrefslogtreecommitdiffstats
path: root/code/sdl
diff options
context:
space:
mode:
authortma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-08-28 22:05:34 +0000
committertma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-08-28 22:05:34 +0000
commit02b546e4c58833721921273e8bf482251cd91a98 (patch)
treea7a8b9a00a14171ba29f9cb615c6d9fa51ec37a6 /code/sdl
parent6ab5f951ce4b57ab2dd53732fc93d72d7bc085c4 (diff)
downloadioquake3-aero-02b546e4c58833721921273e8bf482251cd91a98.tar.gz
ioquake3-aero-02b546e4c58833721921273e8bf482251cd91a98.zip
* Revert 'Handle dead keys more gracefully by taking a "best guess" rather than
ignoring completely' from r1459; it can't ever work acceptably, especially on azerty/qwertz layouts * Make the ordering of the output from in_keyboardDebug more sensible * Add cl_consoleKeys cvar, a space delimited list of key names or characters that toggle the console git-svn-id: svn://svn.icculus.org/quake3/trunk@1461 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'code/sdl')
-rw-r--r--code/sdl/sdl_input.c113
1 files changed, 76 insertions, 37 deletions
diff --git a/code/sdl/sdl_input.c b/code/sdl/sdl_input.c
index 669088e..878943c 100644
--- a/code/sdl/sdl_input.c
+++ b/code/sdl/sdl_input.c
@@ -77,7 +77,7 @@ static cvar_t *in_joystickNo = NULL;
IN_PrintKey
===============
*/
-static void IN_PrintKey( const SDL_keysym *keysym, int key, qboolean down )
+static void IN_PrintKey( const SDL_keysym *keysym, keyNum_t key, qboolean down )
{
if( down )
Com_Printf( "+ " );
@@ -100,15 +100,66 @@ static void IN_PrintKey( const SDL_keysym *keysym, int key, qboolean down )
if( keysym->mod & KMOD_MODE ) Com_Printf( " KMOD_MODE" );
if( keysym->mod & KMOD_RESERVED ) Com_Printf( " KMOD_RESERVED" );
+ Com_Printf( " Q:%d(%s)", key, Key_KeynumToString( key ) );
+
if( keysym->unicode )
{
- Com_Printf( " %d", keysym->unicode );
+ Com_Printf( " U:%d", keysym->unicode );
if( keysym->unicode > ' ' && keysym->unicode < '~' )
Com_Printf( "(%c)", (char)keysym->unicode );
}
- Com_Printf( " %d(%s)\n", key, Key_KeynumToString( key ) );
+ Com_Printf( "\n" );
+}
+
+#define MAX_CONSOLE_KEYS 16
+
+/*
+===============
+IN_IsConsoleKey
+===============
+*/
+static qboolean IN_IsConsoleKey( keyNum_t key, const char *buf )
+{
+ static int consoleKeys[ MAX_CONSOLE_KEYS ];
+ static int numConsoleKeys = 0;
+ int i;
+
+ // Only parse the variable when it changes
+ if( cl_consoleKeys->modified )
+ {
+ char *text_p, *token;
+
+ cl_consoleKeys->modified = qfalse;
+ text_p = cl_consoleKeys->string;
+ numConsoleKeys = 0;
+
+ while( numConsoleKeys < MAX_CONSOLE_KEYS )
+ {
+ token = COM_Parse( &text_p );
+ if( !token[ 0 ] )
+ break;
+
+ consoleKeys[ numConsoleKeys++ ] =
+ Key_StringToKeynum( token );
+ }
+ }
+
+ // If key is ASCII, use the character instead
+ if( key >= K_SPACE && key < K_BACKSPACE )
+ key = 0;
+
+ for( i = 0; i < numConsoleKeys; i++ )
+ {
+ if( !consoleKeys[ i ] )
+ continue;
+
+ if( consoleKeys[ i ] == key || consoleKeys[ i ] == *buf )
+ return qtrue;
+ }
+
+ return qfalse;
}
/*
@@ -117,7 +168,7 @@ IN_TranslateSDLToQ3Key
===============
*/
static const char *IN_TranslateSDLToQ3Key( SDL_keysym *keysym,
- int *key, qboolean down )
+ keyNum_t *key, qboolean down )
{
static char buf[ 2 ] = { '\0', '\0' };
@@ -131,7 +182,7 @@ static const char *IN_TranslateSDLToQ3Key( SDL_keysym *keysym,
}
else
{
- switch (keysym->sym)
+ switch( keysym->sym )
{
case SDLK_PAGEUP: *key = K_PGUP; break;
case SDLK_KP9: *key = K_KP_PGUP; break;
@@ -218,47 +269,35 @@ static const char *IN_TranslateSDLToQ3Key( SDL_keysym *keysym,
}
}
- if( down )
+ if( down && keysym->unicode && !( keysym->unicode & 0xFF80 ) )
{
- if( keysym->unicode && !( keysym->unicode & 0xFF80 ) )
- {
- char ch = (char)keysym->unicode & 0x7F;
-
- switch( ch )
- {
- // So the key marked ~ always drops the console
- case '~': *key = '~'; break;
-
- case 127: // ASCII delete
- if( *key != K_DEL )
- {
- // ctrl-h
- *buf = CTRL('h');
- break;
- }
- // fallthrough
+ char ch = (char)keysym->unicode & 0x7F;
- default: *buf = ch; break;
- }
- }
- else
+ switch( ch )
{
- // Unicode character which isn't ASCII, possibly the character
- // following a dead key. Fallback on what SDL calls the key
+ case 127: // ASCII delete
+ if( *key != K_DEL )
+ {
+ // ctrl-h
+ *buf = CTRL('h');
+ break;
+ }
+ // fallthrough
- const char *keyString = SDL_GetKeyName( keysym->sym );
- if( strlen( keyString ) == 1 )
- *buf = *keyString;
+ default: *buf = ch; break;
}
}
- // Never allow a '~' SE_CHAR event to be generated
- if( *key == '~' )
- *buf = '\0';
-
if( in_keyboardDebug->integer )
IN_PrintKey( keysym, *key, down );
+ if( IN_IsConsoleKey( *key, buf ) )
+ {
+ // Console keys can't be bound or generate characters
+ *key = K_CONSOLE;
+ *buf = '\0';
+ }
+
return buf;
}
@@ -737,7 +776,7 @@ static void IN_ProcessEvents( void )
{
SDL_Event e;
const char *p = NULL;
- int key = 0;
+ keyNum_t key = 0;
if( !SDL_WasInit( SDL_INIT_VIDEO ) )
return;