From 3ab2e7d27ea70cf34454b87dedc2f7911461e8aa Mon Sep 17 00:00:00 2001 From: BDisp Date: Tue, 5 Jul 2022 14:50:56 +0100 Subject: [PATCH] Fixes #1848. Mouse clicks also works on Windows Terminal. (#1850) --- Terminal.Gui/ConsoleDrivers/WindowsDriver.cs | 63 ++++++++++++++------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs b/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs index bee8bd30a..a029a8d37 100644 --- a/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs +++ b/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs @@ -869,6 +869,14 @@ namespace Terminal.Gui { case WindowsConsole.EventType.Mouse: var me = ToDriverMouse (inputEvent.MouseEvent); mouseHandler (me); + if (processButtonClick) { + mouseHandler ( + new MouseEvent () { + X = me.X, + Y = me.Y, + Flags = ProcessButtonClick (inputEvent.MouseEvent) + }); + } break; case WindowsConsole.EventType.WindowBufferSize: @@ -896,6 +904,7 @@ namespace Terminal.Gui { Point pointMove; //int buttonPressedCount; bool isOneFingerDoubleClicked = false; + bool processButtonClick; MouseEvent ToDriverMouse (WindowsConsole.MouseEventRecord mouseEvent) { @@ -1010,6 +1019,7 @@ namespace Terminal.Gui { if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) { mouseFlag |= MouseFlags.ReportMousePosition; isButtonReleased = false; + processButtonClick = false; } lastMouseButtonPressed = mouseEvent.ButtonState; isButtonPressed = true; @@ -1038,28 +1048,15 @@ namespace Terminal.Gui { } isButtonPressed = false; isButtonReleased = true; - if (point != null && (((Point)point).X != mouseEvent.MousePosition.X || ((Point)point).Y != mouseEvent.MousePosition.Y)) + if (point != null && (((Point)point).X == mouseEvent.MousePosition.X && ((Point)point).Y == mouseEvent.MousePosition.Y)) { + processButtonClick = true; + } else { point = null; - + } } else if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved && !isOneFingerDoubleClicked && isButtonReleased && p == point) { - switch (lastMouseButtonPressed) { - case WindowsConsole.ButtonState.Button1Pressed: - mouseFlag = MouseFlags.Button1Clicked; - break; - - case WindowsConsole.ButtonState.Button2Pressed: - mouseFlag = MouseFlags.Button2Clicked; - break; - - case WindowsConsole.ButtonState.RightmostButtonPressed: - mouseFlag = MouseFlags.Button3Clicked; - break; - } - point = null; - lastMouseButtonPressed = null; - isButtonReleased = false; + mouseFlag = ProcessButtonClick (mouseEvent); } else if (mouseEvent.EventFlags.HasFlag (WindowsConsole.EventFlags.DoubleClick)) { switch (mouseEvent.ButtonState) { @@ -1138,6 +1135,9 @@ namespace Terminal.Gui { mouseFlag = SetControlKeyStates (mouseEvent, mouseFlag); + //System.Diagnostics.Debug.WriteLine ( + // $"point.X:{(point != null ? ((Point)point).X : -1)};point.Y:{(point != null ? ((Point)point).Y : -1)}"); + return new MouseEvent () { X = mouseEvent.MousePosition.X, Y = mouseEvent.MousePosition.Y, @@ -1145,6 +1145,33 @@ namespace Terminal.Gui { }; } + MouseFlags ProcessButtonClick (WindowsConsole.MouseEventRecord mouseEvent) + { + MouseFlags mouseFlag = 0; + switch (lastMouseButtonPressed) { + case WindowsConsole.ButtonState.Button1Pressed: + mouseFlag = MouseFlags.Button1Clicked; + break; + + case WindowsConsole.ButtonState.Button2Pressed: + mouseFlag = MouseFlags.Button2Clicked; + break; + + case WindowsConsole.ButtonState.RightmostButtonPressed: + mouseFlag = MouseFlags.Button3Clicked; + break; + } + point = new Point () { + X = mouseEvent.MousePosition.X, + Y = mouseEvent.MousePosition.Y + }; + lastMouseButtonPressed = null; + isButtonReleased = false; + processButtonClick = false; + point = null; + return mouseFlag; + } + async Task ProcessButtonDoubleClickedAsync () { await Task.Delay (300);