From 121e9071ab7959b5d3b323614beb25902ff1623d Mon Sep 17 00:00:00 2001 From: Nick Van Dyck Date: Sun, 13 May 2018 21:28:27 +0100 Subject: [PATCH] Windows: fix mapping of mouse button events --- Terminal.Gui/Drivers/WindowsDriver.cs | 40 +++++++++++++++++++++++---- Terminal.Gui/MonoCurses/mainloop.cs | 4 +-- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/Terminal.Gui/Drivers/WindowsDriver.cs b/Terminal.Gui/Drivers/WindowsDriver.cs index 9e95967ba..aa2e7e7d1 100644 --- a/Terminal.Gui/Drivers/WindowsDriver.cs +++ b/Terminal.Gui/Drivers/WindowsDriver.cs @@ -37,9 +37,9 @@ namespace Terminal.Gui { public const int STD_INPUT_HANDLE = -10; public const int STD_ERROR_HANDLE = -12; - public IntPtr InputHandle, OutputHandle; + IntPtr InputHandle, OutputHandle; - public IntPtr ScreenBuffer; + IntPtr ScreenBuffer; public WindowsConsole () { @@ -442,14 +442,44 @@ namespace Terminal.Gui { UpdateOffScreen (); } + private WindowsConsole.ButtonState? LastMouseButtonPressed = null; + private MouseEvent ToDriverMouse(WindowsConsole.MouseEventRecord mouseEvent) { MouseFlags mouseFlag = MouseFlags.AllEvents; - if (mouseEvent.EventFlags == 0) + // The ButtonState member of the MouseEvent structure has bit corresponding to each mouse button. + // This will tell when a mouse button is pressed. When the button is released this event will + // be fired with it's bit set to 0. So when the button is up ButtonState will be 0. + // To map to the correct driver events we save the last pressed mouse button so we can + // map to the correct clicked event. + if (LastMouseButtonPressed != null && mouseEvent.ButtonState != 0) + { + LastMouseButtonPressed = null; + } + + if (mouseEvent.EventFlags == 0 && LastMouseButtonPressed == null) { switch (mouseEvent.ButtonState) { + case WindowsConsole.ButtonState.Button1Pressed: + mouseFlag = MouseFlags.Button1Pressed; + break; + + case WindowsConsole.ButtonState.Button2Pressed: + mouseFlag = MouseFlags.Button2Pressed; + break; + + case WindowsConsole.ButtonState.Button3Pressed: + mouseFlag = MouseFlags.Button3Pressed; + break; + } + LastMouseButtonPressed = mouseEvent.ButtonState; + } + else if (mouseEvent.EventFlags == 0 && LastMouseButtonPressed != null) + { + switch (LastMouseButtonPressed) + { case WindowsConsole.ButtonState.Button1Pressed: mouseFlag = MouseFlags.Button1Clicked; break; @@ -462,13 +492,13 @@ namespace Terminal.Gui { mouseFlag = MouseFlags.Button3Clicked; break; } + LastMouseButtonPressed = null; } else if(mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) { mouseFlag = MouseFlags.ReportMousePosition; } - return new MouseEvent () { X = mouseEvent.MousePosition.X, Y = mouseEvent.MousePosition.Y, @@ -517,7 +547,7 @@ namespace Terminal.Gui { case ConsoleKey.Backspace: return Key.Backspace; case ConsoleKey.Delete: - return Key.Delete; + return Key.DeleteChar; case ConsoleKey.Oem1: case ConsoleKey.Oem2: diff --git a/Terminal.Gui/MonoCurses/mainloop.cs b/Terminal.Gui/MonoCurses/mainloop.cs index a8e9c9c26..771b889e9 100644 --- a/Terminal.Gui/MonoCurses/mainloop.cs +++ b/Terminal.Gui/MonoCurses/mainloop.cs @@ -129,8 +129,8 @@ namespace Mono.Terminal { return true; }); } else if (useNet) { - Thread readThread = new Thread (WindowsKeyReader); - readThread.Start (); + Thread readThread = new Thread (WindowsKeyReader); + readThread.Start (); } }