浏览代码

Fixes #1848. Mouse clicks also works on Windows Terminal. (#1850)

BDisp 3 年之前
父节点
当前提交
3ab2e7d27e
共有 1 个文件被更改,包括 45 次插入18 次删除
  1. 45 18
      Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

+ 45 - 18
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);