Ver Fonte

Windows: fix mapping of mouse button events

Nick Van Dyck há 7 anos atrás
pai
commit
121e9071ab

+ 35 - 5
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:

+ 2 - 2
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 ();
 			}
 		}