diff --git a/OpenRA.Game/Graphics/IGraphicsDevice.cs b/OpenRA.Game/Graphics/IGraphicsDevice.cs index deb7ee4b48..4f35983d28 100644 --- a/OpenRA.Game/Graphics/IGraphicsDevice.cs +++ b/OpenRA.Game/Graphics/IGraphicsDevice.cs @@ -61,6 +61,7 @@ namespace OpenRA Bitmap TakeScreenshot(); void PumpInput(IInputHandler inputHandler); string GetClipboardText(); + bool SetClipboardText(string text); void DrawPrimitives(PrimitiveType type, int firstVertex, int numVertices); void SetLineWidth(float width); diff --git a/OpenRA.Game/Renderer.cs b/OpenRA.Game/Renderer.cs index 25206015a4..6e01b39813 100644 --- a/OpenRA.Game/Renderer.cs +++ b/OpenRA.Game/Renderer.cs @@ -267,5 +267,10 @@ namespace OpenRA { return Device.GetClipboardText(); } + + public bool SetClipboardText(string text) + { + return Device.SetClipboardText(text); + } } } diff --git a/OpenRA.Mods.Common/Widgets/TextFieldWidget.cs b/OpenRA.Mods.Common/Widgets/TextFieldWidget.cs index ee7b65859e..0caf248560 100644 --- a/OpenRA.Mods.Common/Widgets/TextFieldWidget.cs +++ b/OpenRA.Mods.Common/Widgets/TextFieldWidget.cs @@ -123,15 +123,15 @@ namespace OpenRA.Mods.Common.Widgets Func getPrevWhitespaceIndex = () => Text.Substring(0, CursorPosition).TrimEnd().LastIndexOf(' ') + 1; - Func getNextWhitespaceIndex = () => { + Func getNextWhitespaceIndex = () => + { var substr = Text.Substring(CursorPosition); var substrTrimmed = substr.TrimStart(); var trimmedSpaces = substr.Length - substrTrimmed.Length; var nextWhitespace = substrTrimmed.IndexOf(' '); if (nextWhitespace == -1) return Text.Length; - else - return CursorPosition + trimmedSpaces + nextWhitespace; + return CursorPosition + trimmedSpaces + nextWhitespace; }; var isOSX = Platform.CurrentPlatform == PlatformType.OSX; @@ -161,21 +161,24 @@ namespace OpenRA.Mods.Common.Widgets case Keycode.LEFT: ResetBlinkCycle(); if (CursorPosition > 0) - if ((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || - (isOSX && e.Modifiers.HasModifier(Modifiers.Alt))) + { + if ((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || (isOSX && e.Modifiers.HasModifier(Modifiers.Alt))) CursorPosition = getPrevWhitespaceIndex(); else CursorPosition--; + } + break; case Keycode.RIGHT: ResetBlinkCycle(); if (CursorPosition <= Text.Length - 1) - if ((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || - (isOSX && e.Modifiers.HasModifier(Modifiers.Alt))) + { + if ((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || (isOSX && e.Modifiers.HasModifier(Modifiers.Alt))) CursorPosition = getNextWhitespaceIndex(); else CursorPosition++; + } break; @@ -214,10 +217,10 @@ namespace OpenRA.Mods.Common.Widgets case Keycode.X: ResetBlinkCycle(); - if (((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || - (isOSX && e.Modifiers.HasModifier(Modifiers.Meta))) && - (!string.IsNullOrEmpty(Text))) + if (((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || (isOSX && e.Modifiers.HasModifier(Modifiers.Meta))) && + !string.IsNullOrEmpty(Text)) { + Game.Renderer.SetClipboardText(Text); Text = Text.Remove(0); CursorPosition = 0; OnTextEdited(); @@ -230,8 +233,7 @@ namespace OpenRA.Mods.Common.Widgets ResetBlinkCycle(); if (CursorPosition < Text.Length) { - if ((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || - (isOSX && e.Modifiers.HasModifier(Modifiers.Alt))) + if ((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || (isOSX && e.Modifiers.HasModifier(Modifiers.Alt))) Text = Text.Substring(0, CursorPosition) + Text.Substring(getNextWhitespaceIndex()); else if (isOSX && e.Modifiers.HasModifier(Modifiers.Meta)) Text = Text.Remove(CursorPosition); @@ -248,8 +250,7 @@ namespace OpenRA.Mods.Common.Widgets ResetBlinkCycle(); if (CursorPosition > 0) { - if ((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || - (isOSX && e.Modifiers.HasModifier(Modifiers.Alt))) + if ((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || (isOSX && e.Modifiers.HasModifier(Modifiers.Alt))) { var prev_whitespace = getPrevWhitespaceIndex(); Text = Text.Substring(0, prev_whitespace) + Text.Substring(CursorPosition); @@ -273,8 +274,7 @@ namespace OpenRA.Mods.Common.Widgets case Keycode.V: ResetBlinkCycle(); - if ((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || - (isOSX && e.Modifiers.HasModifier(Modifiers.Meta))) + if ((!isOSX && e.Modifiers.HasModifier(Modifiers.Ctrl)) || (isOSX && e.Modifiers.HasModifier(Modifiers.Meta))) { var clipboardText = Game.Renderer.GetClipboardText(); diff --git a/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs b/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs index edcfcf5bcf..51fbbfb5f0 100644 --- a/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs +++ b/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs @@ -382,6 +382,12 @@ namespace OpenRA.Platforms.Default return input.GetClipboardText(); } + public bool SetClipboardText(string text) + { + VerifyThreadAffinity(); + return input.SetClipboardText(text); + } + public IVertexBuffer CreateVertexBuffer(int size) { VerifyThreadAffinity(); diff --git a/OpenRA.Platforms.Default/Sdl2Input.cs b/OpenRA.Platforms.Default/Sdl2Input.cs index 2582876ffc..48c078306a 100644 --- a/OpenRA.Platforms.Default/Sdl2Input.cs +++ b/OpenRA.Platforms.Default/Sdl2Input.cs @@ -20,6 +20,7 @@ namespace OpenRA.Platforms.Default MouseButton lastButtonBits = (MouseButton)0; public string GetClipboardText() { return SDL.SDL_GetClipboardText(); } + public bool SetClipboardText(string text) { return SDL.SDL_SetClipboardText(text) == 0; } static MouseButton MakeButton(byte b) { @@ -177,4 +178,4 @@ namespace OpenRA.Platforms.Default ErrorHandler.CheckGlError(); } } -} \ No newline at end of file +} diff --git a/OpenRA.Platforms.Null/NullGraphicsDevice.cs b/OpenRA.Platforms.Null/NullGraphicsDevice.cs index b6a9174b63..c8ff2b75c4 100644 --- a/OpenRA.Platforms.Null/NullGraphicsDevice.cs +++ b/OpenRA.Platforms.Null/NullGraphicsDevice.cs @@ -42,6 +42,7 @@ namespace OpenRA.Platforms.Null public Bitmap TakeScreenshot() { return new Bitmap(1, 1); } public string GetClipboardText() { return ""; } + public bool SetClipboardText(string text) { return false; } public void PumpInput(IInputHandler ih) { Game.HasInputFocus = false;