Bladeren bron

Fixes #1839. Process WindowsDriver click event if location is the same after pressed and released.

BDisp 3 jaren geleden
bovenliggende
commit
893220b21e
1 gewijzigde bestanden met toevoegingen van 28 en 46 verwijderingen
  1. 28 46
      Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

+ 28 - 46
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -869,15 +869,6 @@ 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)
-						});
-					processButtonClick = false;
-				}
 				break;
 
 			case WindowsConsole.EventType.WindowBufferSize:
@@ -901,10 +892,10 @@ namespace Terminal.Gui {
 		bool isButtonPressed = false;
 		bool isButtonReleased = false;
 		bool isButtonDoubleClicked = false;
-		Point point;
+		Point? point;
+		Point pointMove;
 		//int buttonPressedCount;
 		bool isOneFingerDoubleClicked = false;
-		bool processButtonClick;
 
 		MouseEvent ToDriverMouse (WindowsConsole.MouseEventRecord mouseEvent)
 		{
@@ -1013,12 +1004,13 @@ namespace Terminal.Gui {
 					break;
 				}
 
+				if (point == null)
+					point = p;
+
 				if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) {
 					mouseFlag |= MouseFlags.ReportMousePosition;
 					isButtonReleased = false;
-					processButtonClick = false;
 				}
-				point = p;
 				lastMouseButtonPressed = mouseEvent.ButtonState;
 				isButtonPressed = true;
 
@@ -1046,13 +1038,28 @@ namespace Terminal.Gui {
 				}
 				isButtonPressed = false;
 				isButtonReleased = true;
-				if (point.X == mouseEvent.MousePosition.X && point.Y == mouseEvent.MousePosition.Y) {
-					processButtonClick = true;
-				}
+				if (point != null && (((Point)point).X != mouseEvent.MousePosition.X || ((Point)point).Y != mouseEvent.MousePosition.Y))
+					point = null;
+
 			} else if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved
 				&& !isOneFingerDoubleClicked && isButtonReleased && p == point) {
 
-				mouseFlag = ProcessButtonClick (mouseEvent);
+				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;
 
 			} else if (mouseEvent.EventFlags.HasFlag (WindowsConsole.EventFlags.DoubleClick)) {
 				switch (mouseEvent.ButtonState) {
@@ -1119,9 +1126,9 @@ namespace Terminal.Gui {
 				}
 
 			} else if (mouseEvent.EventFlags == WindowsConsole.EventFlags.MouseMoved) {
-				if (mouseEvent.MousePosition.X != point.X || mouseEvent.MousePosition.Y != point.Y) {
+				if (mouseEvent.MousePosition.X != pointMove.X || mouseEvent.MousePosition.Y != pointMove.Y) {
 					mouseFlag = MouseFlags.ReportMousePosition;
-					point = new Point ();
+					pointMove = new Point ();
 				} else {
 					mouseFlag = 0;
 				}
@@ -1138,31 +1145,6 @@ 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;
-			return mouseFlag;
-		}
-
 		async Task ProcessButtonDoubleClickedAsync ()
 		{
 			await Task.Delay (300);
@@ -1176,8 +1158,8 @@ namespace Terminal.Gui {
 			while (isButtonPressed) {
 				await Task.Delay (100);
 				var me = new MouseEvent () {
-					X = point.X,
-					Y = point.Y,
+					X = pointMove.X,
+					Y = pointMove.Y,
 					Flags = mouseFlag
 				};