mirror of
https://github.com/UberGames/ioef.git
synced 2024-11-28 06:52:35 +00:00
* 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"
This commit is contained in:
parent
a6382d2d9b
commit
36a43f2aa1
2 changed files with 54 additions and 15 deletions
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue