From 36a43f2aa13917057bc8c591d389b362682b64f8 Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Mon, 25 Aug 2008 21:15:25 +0000 Subject: [PATCH] * Handle dead keys more gracefully by taking a "best guess" rather than ignoring completely * When activating or deactivating the mouse flush any pending motion events; this should stop the view moving unpredictably in these circumstances * Add keyname completion to "unbind" --- code/qcommon/common.c | 8 ++++++ code/sdl/sdl_input.c | 61 ++++++++++++++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/code/qcommon/common.c b/code/qcommon/common.c index b35d8487..88dab5ec 100644 --- a/code/qcommon/common.c +++ b/code/qcommon/common.c @@ -3333,6 +3333,14 @@ static void Field_CompleteCommand( char *cmd, Field_CompleteCommand( p, qtrue, qtrue ); } } + else if( !Q_stricmp( baseCmd, "unbind" ) && completionArgument == 2 ) + { + // Skip "unbind " + p = Com_SkipTokens( cmd, 1, " " ); + + if( p > cmd ) + Field_CompleteKeyname( ); + } #endif } } diff --git a/code/sdl/sdl_input.c b/code/sdl/sdl_input.c index 358c16b8..669088e1 100644 --- a/code/sdl/sdl_input.c +++ b/code/sdl/sdl_input.c @@ -218,25 +218,37 @@ static const char *IN_TranslateSDLToQ3Key( SDL_keysym *keysym, } } - if( down && !( keysym->unicode & 0xFF80 ) ) + if( down ) { - char ch = (char)keysym->unicode & 0x7F; - - switch( ch ) + if( keysym->unicode && !( keysym->unicode & 0xFF80 ) ) { - // So the key marked ~ always drops the console - case '~': *key = '~'; break; + char ch = (char)keysym->unicode & 0x7F; - case 127: // ASCII delete - if( *key != K_DEL ) - { - // ctrl-h - *buf = CTRL('h'); - break; - } - // fallthrough + switch( ch ) + { + // So the key marked ~ always drops the console + case '~': *key = '~'; break; - default: *buf = ch; break; + case 127: // ASCII delete + if( *key != K_DEL ) + { + // ctrl-h + *buf = CTRL('h'); + break; + } + // fallthrough + + default: *buf = ch; break; + } + } + else + { + // Unicode character which isn't ASCII, possibly the character + // following a dead key. Fallback on what SDL calls the key + + const char *keyString = SDL_GetKeyName( keysym->sym ); + if( strlen( keyString ) == 1 ) + *buf = *keyString; } } @@ -278,6 +290,21 @@ static io_connect_t IN_GetIOHandle(void) // mac os x mouse accel hack } #endif +/* +=============== +IN_GobbleMotionEvents +=============== +*/ +static void IN_GobbleMotionEvents( void ) +{ + SDL_Event dummy[ 1 ]; + + // Gobble any mouse motion events + SDL_PumpEvents( ); + while( SDL_PeepEvents( dummy, 1, SDL_GETEVENT, + SDL_EVENTMASK( SDL_MOUSEMOTION ) ) ) { } +} + /* =============== IN_ActivateMouse @@ -333,6 +360,8 @@ static void IN_ActivateMouse( void ) SDL_ShowCursor( 0 ); #endif SDL_WM_GrabInput( SDL_GRAB_ON ); + + IN_GobbleMotionEvents( ); } // in_nograb makes no sense in fullscreen mode @@ -391,6 +420,8 @@ static void IN_DeactivateMouse( void ) if( mouseActive ) { + IN_GobbleMotionEvents( ); + SDL_WM_GrabInput( SDL_GRAB_OFF ); // Don't warp the mouse unless the cursor is within the window