diff --git a/AUTHORS b/AUTHORS index 9cde5521f4..4e478b7582 100644 --- a/AUTHORS +++ b/AUTHORS @@ -120,6 +120,7 @@ Also thanks to: * Mike Gagné (AngryBirdz) * Muh * Mustafa Alperen Seki (MustaphaTR) + * Nathan Nichols (cracksmoka420) * Neil Shivkar (havok13888) * Nikolay Fomin (netnazgul) * Nooze diff --git a/OpenRA.Game/Input/Keycode.cs b/OpenRA.Game/Input/Keycode.cs index 1ff8284492..547def4870 100644 --- a/OpenRA.Game/Input/Keycode.cs +++ b/OpenRA.Game/Input/Keycode.cs @@ -13,7 +13,8 @@ using System.Collections.Generic; namespace OpenRA { - // List of keycodes, duplicated from SDL 2.0.1 + // List of keycodes. Duplicated from SDL 2.0.1, with the addition + // of MOUSE4 and MOUSE5. public enum Keycode { UNKNOWN = 0, @@ -252,6 +253,8 @@ namespace OpenRA KBDILLUMUP = 280 | (1 << 30), EJECT = 281 | (1 << 30), SLEEP = 282 | (1 << 30), + MOUSE4 = 283 | (1 << 30), + MOUSE5 = 284 | (1 << 30) } public static class KeycodeExts @@ -494,6 +497,8 @@ namespace OpenRA { Keycode.KBDILLUMUP, "KBDIllumUp" }, { Keycode.EJECT, "Eject" }, { Keycode.SLEEP, "Sleep" }, + { Keycode.MOUSE4, "Mouse 4" }, + { Keycode.MOUSE5, "Mouse 5" }, }; public static string DisplayString(Keycode k) diff --git a/OpenRA.Platforms.Default/Sdl2Input.cs b/OpenRA.Platforms.Default/Sdl2Input.cs index 67cec73faa..1a49829a9d 100644 --- a/OpenRA.Platforms.Default/Sdl2Input.cs +++ b/OpenRA.Platforms.Default/Sdl2Input.cs @@ -112,43 +112,68 @@ namespace OpenRA.Platforms.Default } case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN: - { - if (pendingMotion != null) - { - inputHandler.OnMouseInput(pendingMotion.Value); - pendingMotion = null; - } - - var button = MakeButton(e.button.button); - lastButtonBits |= button; - - var input = lockedMousePosition ?? new int2(e.button.x, e.button.y); - var pos = EventPosition(device, input.X, input.Y); - - inputHandler.OnMouseInput(new MouseInput( - MouseInputEvent.Down, button, pos, int2.Zero, mods, - MultiTapDetection.DetectFromMouse(e.button.button, pos))); - - break; - } - case SDL.SDL_EventType.SDL_MOUSEBUTTONUP: { - if (pendingMotion != null) + // Mouse 1, Mouse 2 and Mouse 3 are handled as mouse inputs + // Mouse 4 and Mouse 5 are treated as (pseudo) keyboard inputs + if (e.button.button == SDL.SDL_BUTTON_LEFT || + e.button.button == SDL.SDL_BUTTON_MIDDLE || + e.button.button == SDL.SDL_BUTTON_RIGHT) { - inputHandler.OnMouseInput(pendingMotion.Value); - pendingMotion = null; + if (pendingMotion != null) + { + inputHandler.OnMouseInput(pendingMotion.Value); + pendingMotion = null; + } + + var button = MakeButton(e.button.button); + + if (e.type == SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN) + lastButtonBits |= button; + else + lastButtonBits &= ~button; + + var input = lockedMousePosition ?? new int2(e.button.x, e.button.y); + var pos = EventPosition(device, input.X, input.Y); + + if (e.type == SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN) + inputHandler.OnMouseInput(new MouseInput( + MouseInputEvent.Down, button, pos, int2.Zero, mods, + MultiTapDetection.DetectFromMouse(e.button.button, pos))); + else + inputHandler.OnMouseInput(new MouseInput( + MouseInputEvent.Up, button, pos, int2.Zero, mods, + MultiTapDetection.InfoFromMouse(e.button.button))); } - var button = MakeButton(e.button.button); - lastButtonBits &= ~button; + if (e.button.button == SDL.SDL_BUTTON_X1 || + e.button.button == SDL.SDL_BUTTON_X2) + { + Keycode keyCode; - var input = lockedMousePosition ?? new int2(e.button.x, e.button.y); - var pos = EventPosition(device, input.X, input.Y); + if (e.button.button == SDL.SDL_BUTTON_X1) + keyCode = Keycode.MOUSE4; + else + keyCode = Keycode.MOUSE5; - inputHandler.OnMouseInput(new MouseInput( - MouseInputEvent.Up, button, pos, int2.Zero, mods, - MultiTapDetection.InfoFromMouse(e.button.button))); + var type = e.type == SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN ? + KeyInputEvent.Down : KeyInputEvent.Up; + + var tapCount = e.type == SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN ? + MultiTapDetection.DetectFromKeyboard(keyCode, mods) : + MultiTapDetection.InfoFromKeyboard(keyCode, mods); + + var keyEvent = new KeyInput + { + Event = type, + Key = keyCode, + Modifiers = mods, + UnicodeChar = '?', + MultiTapCount = tapCount, + IsRepeat = e.key.repeat != 0 + }; + inputHandler.OnKeyInput(keyEvent); + } break; }