Attempt to parse unexpected key events as text. Fixes #4232.

This commit is contained in:
Paul Chote
2013-12-11 22:42:56 +13:00
parent 89d1d17b80
commit 719c9c1cd2
2 changed files with 16 additions and 7 deletions

View File

@@ -82,12 +82,6 @@ namespace OpenRA
return (k & mod) == mod; return (k & mod) == mod;
} }
public static bool IsValidInput(this KeyInput key)
{
return char.IsLetter(key.UnicodeChar) || char.IsDigit(key.UnicodeChar) ||
char.IsSymbol(key.UnicodeChar) || char.IsSeparator(key.UnicodeChar) ||
char.IsPunctuation(key.UnicodeChar);
}
public static V GetOrAdd<K, V>(this Dictionary<K, V> d, K k) public static V GetOrAdd<K, V>(this Dictionary<K, V> d, K k)
where V : new() where V : new()

View File

@@ -151,8 +151,16 @@ namespace OpenRA.Renderer.SdlCommon
{ Sdl.SDLK_UNDO, Keycode.UNDO }, { Sdl.SDLK_UNDO, Keycode.UNDO },
}; };
MouseButton lastButtonBits = (MouseButton)0; MouseButton lastButtonBits = (MouseButton)0;
static bool IsValidInput(char c)
{
return char.IsLetter(c) || char.IsDigit(c) ||
char.IsSymbol(c) || char.IsSeparator(c) ||
char.IsPunctuation(c);
}
MouseButton MakeButton(byte b) MouseButton MakeButton(byte b)
{ {
return b == Sdl.SDL_BUTTON_LEFT ? MouseButton.Left return b == Sdl.SDL_BUTTON_LEFT ? MouseButton.Left
@@ -242,7 +250,14 @@ namespace OpenRA.Renderer.SdlCommon
// Drop unknown keys // Drop unknown keys
Keycode keyCode; Keycode keyCode;
if (!KeyRemap.TryGetValue(e.key.keysym.sym, out keyCode)) if (!KeyRemap.TryGetValue(e.key.keysym.sym, out keyCode))
{
// Try parsing it as text
var c = (char)e.key.keysym.unicode;
if (IsValidInput(c))
inputHandler.OnTextInput(c.ToString());
break; break;
}
var type = e.type == Sdl.SDL_KEYDOWN ? var type = e.type == Sdl.SDL_KEYDOWN ?
KeyInputEvent.Down : KeyInputEvent.Up; KeyInputEvent.Down : KeyInputEvent.Up;
@@ -269,7 +284,7 @@ namespace OpenRA.Renderer.SdlCommon
else else
inputHandler.OnKeyInput(keyEvent); inputHandler.OnKeyInput(keyEvent);
if (keyEvent.IsValidInput()) if (IsValidInput(keyEvent.UnicodeChar))
inputHandler.OnTextInput(keyEvent.UnicodeChar.ToString()); inputHandler.OnTextInput(keyEvent.UnicodeChar.ToString());
break; break;