summaryrefslogtreecommitdiff
path: root/src/sdl
diff options
context:
space:
mode:
authorTim Angus <tim@ngus.net>2013-01-21 22:20:15 +0000
committerTim Angus <tim@ngus.net>2014-08-28 10:59:21 +0100
commit9cbe2c1a320b30d7d8178123aea01396a996bef4 (patch)
tree9dd0c9d7c769951127cd16151607a3e22d015ec7 /src/sdl
parent8f142d06f47c04f146ae4ccce604b8e601c5159d (diff)
Improve console key situation
Diffstat (limited to 'src/sdl')
-rw-r--r--src/sdl/sdl_input.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/src/sdl/sdl_input.c b/src/sdl/sdl_input.c
index c1c86484..39653bd4 100644
--- a/src/sdl/sdl_input.c
+++ b/src/sdl/sdl_input.c
@@ -68,8 +68,9 @@ static void IN_PrintKey( const SDL_Keysym *keysym, keyNum_t key, qboolean down )
else
Com_Printf( " " );
- Com_Printf( "0x%02x \"%s\"", keysym->scancode,
- SDL_GetKeyName( keysym->sym ) );
+ Com_Printf( "Scancode: 0x%02x(%s) Sym: 0x%02x(%s)",
+ keysym->scancode, SDL_GetScancodeName( keysym->scancode ),
+ keysym->sym, SDL_GetKeyName( keysym->sym ) );
if( keysym->mod & KMOD_LSHIFT ) Com_Printf( " KMOD_LSHIFT" );
if( keysym->mod & KMOD_RSHIFT ) Com_Printf( " KMOD_RSHIFT" );
@@ -92,23 +93,25 @@ static void IN_PrintKey( const SDL_Keysym *keysym, keyNum_t key, qboolean down )
/*
===============
IN_IsConsoleKey
-//FIXME: SDL 1.3 allow scancode based console key selection
+
+TODO: If the SDL_Scancode situation improves, use it instead of
+ both of these methods
===============
*/
-static qboolean IN_IsConsoleKey( keyNum_t key, const unsigned char character )
+static qboolean IN_IsConsoleKey( keyNum_t key, int character )
{
typedef struct consoleKey_s
{
enum
{
- KEY,
+ QUAKE_KEY,
CHARACTER
} type;
union
{
keyNum_t key;
- unsigned char character;
+ int character;
} u;
} consoleKey_t;
@@ -140,11 +143,11 @@ static qboolean IN_IsConsoleKey( keyNum_t key, const unsigned char character )
if( charCode > 0 )
{
c->type = CHARACTER;
- c->u.character = (unsigned char)charCode;
+ c->u.character = charCode;
}
else
{
- c->type = KEY;
+ c->type = QUAKE_KEY;
c->u.key = Key_StringToKeynum( token );
// 0 isn't a key
@@ -166,7 +169,7 @@ static qboolean IN_IsConsoleKey( keyNum_t key, const unsigned char character )
switch( c->type )
{
- case KEY:
+ case QUAKE_KEY:
if( key && c->u.key == key )
return qtrue;
break;
@@ -278,7 +281,7 @@ static keyNum_t IN_TranslateSDLToQ3Key( SDL_Keysym *keysym, qboolean down )
if( in_keyboardDebug->integer )
IN_PrintKey( keysym, key, down );
- if( IN_IsConsoleKey( key, '\0' ) )
+ if( IN_IsConsoleKey( key, 0 ) )
{
// Console keys can't be bound or generate characters
key = K_CONSOLE;
@@ -755,6 +758,7 @@ static void IN_ProcessEvents( void )
{
SDL_Event e;
keyNum_t key = 0;
+ static keyNum_t lastKeyDown = 0;
if( !SDL_WasInit( SDL_INIT_VIDEO ) )
return;
@@ -764,19 +768,21 @@ static void IN_ProcessEvents( void )
switch( e.type )
{
case SDL_KEYDOWN:
- key = IN_TranslateSDLToQ3Key( &e.key.keysym, qtrue );
- if( key )
+ if( ( key = IN_TranslateSDLToQ3Key( &e.key.keysym, qtrue ) ) )
Com_QueueEvent( 0, SE_KEY, key, qtrue, 0, NULL );
+
+ lastKeyDown = key;
break;
case SDL_KEYUP:
- key = IN_TranslateSDLToQ3Key( &e.key.keysym, qfalse );
-
- if( key )
+ if( ( key = IN_TranslateSDLToQ3Key( &e.key.keysym, qfalse ) ) )
Com_QueueEvent( 0, SE_KEY, key, qfalse, 0, NULL );
+
+ lastKeyDown = 0;
break;
case SDL_TEXTINPUT:
+ if( lastKeyDown != K_CONSOLE )
{
char *c = e.text.text;
@@ -812,7 +818,15 @@ static void IN_ProcessEvents( void )
}
if( utf32 != 0 )
- Com_QueueEvent( 0, SE_CHAR, utf32, 0, 0, NULL );
+ {
+ if( IN_IsConsoleKey( 0, utf32 ) )
+ {
+ Com_QueueEvent( 0, SE_KEY, K_CONSOLE, qtrue, 0, NULL );
+ Com_QueueEvent( 0, SE_KEY, K_CONSOLE, qfalse, 0, NULL );
+ }
+ else
+ Com_QueueEvent( 0, SE_CHAR, utf32, 0, 0, NULL );
+ }
}
}
break;