From eb69b697b15e192ab81d51920c076de38d609ae8 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 18 Mar 2011 10:48:12 +1300 Subject: [PATCH] Fix bogus handling of special keyboard characters everywhere else. Textfields now only accept valid characters, support right-delete. --- OpenRA.FileFormats/Exts.cs | 9 +++++- OpenRA.FileFormats/Graphics/IInputHandler.cs | 2 +- OpenRA.Game/Widgets/ChatEntryWidget.cs | 8 ++--- OpenRA.Game/Widgets/TextFieldWidget.cs | 34 +++++++++----------- OpenRA.Game/Widgets/VqaPlayerWidget.cs | 2 +- OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs | 6 ++-- OpenRA.Mods.RA/Widgets/WorldCommandWidget.cs | 19 +++++------ OpenRA.Renderer.Cg/GraphicsDevice.cs | 4 +-- OpenRA.Renderer.Gl/GraphicsDevice.cs | 4 +-- 9 files changed, 47 insertions(+), 41 deletions(-) diff --git a/OpenRA.FileFormats/Exts.cs b/OpenRA.FileFormats/Exts.cs index ac8cd971d3..30ce755b0c 100755 --- a/OpenRA.FileFormats/Exts.cs +++ b/OpenRA.FileFormats/Exts.cs @@ -110,7 +110,14 @@ namespace OpenRA public static bool HasModifier(this Modifiers k, Modifiers 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(this Dictionary d, K k) where V : new() diff --git a/OpenRA.FileFormats/Graphics/IInputHandler.cs b/OpenRA.FileFormats/Graphics/IInputHandler.cs index 43c0d7d483..b1f74459ec 100755 --- a/OpenRA.FileFormats/Graphics/IInputHandler.cs +++ b/OpenRA.FileFormats/Graphics/IInputHandler.cs @@ -63,7 +63,7 @@ namespace OpenRA public struct KeyInput { public KeyInputEvent Event; - public char KeyChar; + public char UnicodeChar; public string KeyName; public Modifiers Modifiers; public int VirtKey; diff --git a/OpenRA.Game/Widgets/ChatEntryWidget.cs b/OpenRA.Game/Widgets/ChatEntryWidget.cs index 2b2e08b5e0..aefbddb576 100755 --- a/OpenRA.Game/Widgets/ChatEntryWidget.cs +++ b/OpenRA.Game/Widgets/ChatEntryWidget.cs @@ -56,7 +56,7 @@ namespace OpenRA.Widgets { if (e.Event == KeyInputEvent.Up) return false; - if (e.KeyChar == '\r') + if (e.KeyName == "return" || e.KeyName == "enter" ) { if (composing) { @@ -94,15 +94,15 @@ namespace OpenRA.Widgets if (composing) { - if (e.KeyChar == '\b' || e.KeyChar == 0x7f) + if (e.KeyName == "backspace") { if (content.Length > 0) content = content.Remove(content.Length - 1); return true; } - else if (!char.IsControl(e.KeyChar)) + else if (e.IsValidInput()) { - content += e.KeyChar; + content += e.UnicodeChar.ToString(); return true; } diff --git a/OpenRA.Game/Widgets/TextFieldWidget.cs b/OpenRA.Game/Widgets/TextFieldWidget.cs index 8adb9444d9..1ec7261430 100644 --- a/OpenRA.Game/Widgets/TextFieldWidget.cs +++ b/OpenRA.Game/Widgets/TextFieldWidget.cs @@ -95,10 +95,10 @@ namespace OpenRA.Widgets if (!Focused) return false; - if (e.KeyChar == '\r' && OnEnterKey()) + if ((e.KeyName == "return" || e.KeyName == "enter") && OnEnterKey()) return true; - if (e.KeyChar == '\t' && OnTabKey()) + if (e.KeyName == "tab" && OnTabKey()) return true; if (e.KeyName == "left") @@ -126,31 +126,29 @@ namespace OpenRA.Widgets return true; } - TypeChar(e.KeyChar); + TypeChar(e); return true; } - public void TypeChar(char c) + public void TypeChar(KeyInput key) { - // backspace - if (c == '\b' || c == 0x7f) + if (Text == null) + Text = ""; + + if (key.KeyName == "backspace" && Text.Length > 0 && CursorPosition > 0) { - if (Text.Length > 0 && CursorPosition > 0) - { - Text = Text.Remove(CursorPosition - 1, 1); - - CursorPosition--; - } + Text = Text.Remove(CursorPosition - 1, 1); + CursorPosition--; } - else if (!char.IsControl(c)) - { - if (Text == null) - Text = ""; - + else if (key.KeyName == "delete" && Text.Length > 0 && CursorPosition < Text.Length - 1) + Text = Text.Remove(CursorPosition, 1); + + else if (key.IsValidInput()) + { if (MaxLength > 0 && Text.Length >= MaxLength) return; - Text = Text.Insert(CursorPosition, c.ToString()); + Text = Text.Insert(CursorPosition, key.UnicodeChar.ToString()); CursorPosition++; } diff --git a/OpenRA.Game/Widgets/VqaPlayerWidget.cs b/OpenRA.Game/Widgets/VqaPlayerWidget.cs index 981b5861ae..b1058673bc 100644 --- a/OpenRA.Game/Widgets/VqaPlayerWidget.cs +++ b/OpenRA.Game/Widgets/VqaPlayerWidget.cs @@ -108,7 +108,7 @@ namespace OpenRA.Widgets { if (e.Event == KeyInputEvent.Down) { - if (e.KeyChar == 27) // Escape + if (e.KeyName == "escape") { Stop(); return true; diff --git a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs index 62cd0944cd..6f01bdc886 100755 --- a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs +++ b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs @@ -154,7 +154,7 @@ namespace OpenRA.Mods.RA.Widgets return true; } - return DoBuildingHotkey(Char.ToLowerInvariant(e.KeyChar), world); + return DoBuildingHotkey(e.KeyName, world); } // TODO: BuildPaletteWidget doesn't support delegate methods for mouse input @@ -499,12 +499,12 @@ namespace OpenRA.Mods.RA.Widgets p.ToInt2(), Color.White); } - bool DoBuildingHotkey(char c, World world) + bool DoBuildingHotkey(string key, World world) { if (!paletteOpen) return false; if (CurrentQueue == null) return false; - var toBuild = CurrentQueue.BuildableItems().FirstOrDefault(b => b.Traits.Get().Hotkey == c.ToString()); + var toBuild = CurrentQueue.BuildableItems().FirstOrDefault(b => b.Traits.Get().Hotkey == key); if ( toBuild != null ) { diff --git a/OpenRA.Mods.RA/Widgets/WorldCommandWidget.cs b/OpenRA.Mods.RA/Widgets/WorldCommandWidget.cs index b4bedf6d1f..66d358dad8 100644 --- a/OpenRA.Mods.RA/Widgets/WorldCommandWidget.cs +++ b/OpenRA.Mods.RA/Widgets/WorldCommandWidget.cs @@ -12,10 +12,11 @@ namespace OpenRA.Mods.RA.Widgets { public World World { get { return OrderManager.world; } } - public char AttackMoveKey = 'a'; - public char StopKey = 's'; - public char ScatterKey = 'x'; - public char DeployKey = 'f'; + public string AttackMoveKey = "a"; + public string StopKey = "s"; + public string ScatterKey = "x"; + public string DeployKey = "f"; + public string BaseCycleKey = "backspace"; public readonly OrderManager OrderManager; [ObjectCreator.UseCtor] @@ -40,22 +41,22 @@ namespace OpenRA.Mods.RA.Widgets { if (e.Modifiers == Modifiers.None) { - if (e.KeyChar == '\b' || e.KeyChar == (char)127) + if (e.KeyName == BaseCycleKey) return CycleBases(); if (!World.Selection.Actors.Any()) return false; - if (e.KeyChar == AttackMoveKey) + if (e.KeyName == AttackMoveKey) return PerformAttackMove(); - if (e.KeyChar == StopKey) + if (e.KeyName == StopKey) return PerformStop(); - if (e.KeyChar == ScatterKey) + if (e.KeyName == ScatterKey) return PerformScatter(); - if (e.KeyChar == DeployKey) + if (e.KeyName == DeployKey) return PerformDeploy(); } diff --git a/OpenRA.Renderer.Cg/GraphicsDevice.cs b/OpenRA.Renderer.Cg/GraphicsDevice.cs index 34bc8315f0..5dbf1e08cd 100755 --- a/OpenRA.Renderer.Cg/GraphicsDevice.cs +++ b/OpenRA.Renderer.Cg/GraphicsDevice.cs @@ -243,7 +243,7 @@ namespace OpenRA.Renderer.Cg { Event = KeyInputEvent.Down, Modifiers = mods, - KeyChar = (char)e.key.keysym.unicode, + UnicodeChar = (char)e.key.keysym.unicode, KeyName = Sdl.SDL_GetKeyName( e.key.keysym.sym ), VirtKey = e.key.keysym.sym }; @@ -258,7 +258,7 @@ namespace OpenRA.Renderer.Cg { Event = KeyInputEvent.Up, Modifiers = mods, - KeyChar = (char)e.key.keysym.unicode, + UnicodeChar = (char)e.key.keysym.unicode, KeyName = Sdl.SDL_GetKeyName( e.key.keysym.sym ), VirtKey = e.key.keysym.sym }; diff --git a/OpenRA.Renderer.Gl/GraphicsDevice.cs b/OpenRA.Renderer.Gl/GraphicsDevice.cs index 6e0625c8e6..73f8cd94c6 100755 --- a/OpenRA.Renderer.Gl/GraphicsDevice.cs +++ b/OpenRA.Renderer.Gl/GraphicsDevice.cs @@ -238,7 +238,7 @@ namespace OpenRA.Renderer.Glsl { Event = KeyInputEvent.Down, Modifiers = mods, - KeyChar = (char)e.key.keysym.unicode, + UnicodeChar = (char)e.key.keysym.unicode, KeyName = Sdl.SDL_GetKeyName( e.key.keysym.sym ), VirtKey = e.key.keysym.sym }; @@ -253,7 +253,7 @@ namespace OpenRA.Renderer.Glsl { Event = KeyInputEvent.Up, Modifiers = mods, - KeyChar = (char)e.key.keysym.unicode, + UnicodeChar = (char)e.key.keysym.unicode, KeyName = Sdl.SDL_GetKeyName( e.key.keysym.sym ), VirtKey = e.key.keysym.sym };