Переглянути джерело

Merge pull request #595 from BDisp/mouse-tasks

Added mouse tasks to the idle handlers. Fixed keyModifiers.
Charlie Kindel 5 роки тому
батько
коміт
78b0517599

+ 34 - 21
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -695,7 +695,8 @@ namespace Terminal.Gui {
 						keyUpHandler (new KeyEvent (map, keyModifiers));
 					}
 				}
-				keyModifiers = null;
+				if (!inputEvent.KeyEvent.bKeyDown)
+					keyModifiers = null;
 				break;
 
 			case WindowsConsole.EventType.Mouse:
@@ -726,9 +727,9 @@ namespace Terminal.Gui {
 			MouseFlags mouseFlag = MouseFlags.AllEvents;
 
 			if (IsButtonDoubleClicked) {
-				Task.Run (async () => {
-					await Task.Delay (100);
-					IsButtonDoubleClicked = false;
+				Application.MainLoop.AddIdle (() => {
+					ProcessButtonDoubleClickedAsync ().ConfigureAwait (false);
+					return false;
 				});
 			}
 
@@ -774,23 +775,9 @@ namespace Terminal.Gui {
 				IsButtonPressed = true;
 
 				if ((mouseFlag & MouseFlags.ReportMousePosition) == 0) {
-					Task.Run (async () => {
-						while (IsButtonPressed) {
-							await Task.Delay (200);
-							var me = new MouseEvent () {
-								X = mouseEvent.MousePosition.X,
-								Y = mouseEvent.MousePosition.Y,
-								Flags = mouseFlag
-							};
-
-							var view = Application.wantContinuousButtonPressedView;
-							if (view == null)
-								break;
-							if (IsButtonPressed && (mouseFlag & MouseFlags.ReportMousePosition) == 0) {
-								mouseHandler (me);
-								//mainLoop.Driver.Wakeup ();
-							}
-						}
+					Application.MainLoop.AddIdle (() => {
+						ProcessContinuousButtonPressedAsync (mouseEvent, mouseFlag).ConfigureAwait (false);
+						return false;
 					});
 				}
 
@@ -892,6 +879,32 @@ namespace Terminal.Gui {
 			};
 		}
 
+		private async Task ProcessButtonDoubleClickedAsync ()
+		{
+			await Task.Delay (200);
+			IsButtonDoubleClicked = false;
+		}
+
+		async Task ProcessContinuousButtonPressedAsync (WindowsConsole.MouseEventRecord mouseEvent, MouseFlags mouseFlag)
+		{
+			while (IsButtonPressed) {
+				await Task.Delay (200);
+				var me = new MouseEvent () {
+					X = mouseEvent.MousePosition.X,
+					Y = mouseEvent.MousePosition.Y,
+					Flags = mouseFlag
+				};
+
+				var view = Application.wantContinuousButtonPressedView;
+				if (view == null)
+					break;
+				if (IsButtonPressed && (mouseFlag & MouseFlags.ReportMousePosition) == 0) {
+					mouseHandler (me);
+					//mainLoop.Driver.Wakeup ();
+				}
+			}
+		}
+
 		static MouseFlags SetControlKeyStates (WindowsConsole.MouseEventRecord mouseEvent, MouseFlags mouseFlag)
 		{
 			if (mouseEvent.ControlKeyState.HasFlag (WindowsConsole.ControlKeyState.RightControlPressed) ||

+ 1 - 1
Terminal.Gui/Core/Application.cs

@@ -352,7 +352,7 @@ namespace Terminal.Gui {
 					View = view
 				};
 				if (OutsideFrame (new Point (nme.X, nme.Y), mouseGrabView.Frame))
-					lastMouseOwnerView.OnMouseLeave (me);
+					lastMouseOwnerView?.OnMouseLeave (me);
 				if (mouseGrabView != null) {
 					mouseGrabView.OnMouseEvent (nme);
 					return;