Преглед изворни кода

Fixes #1091. Continuous button pressed not working properly on Linux.

BDisp пре 4 година
родитељ
комит
f568166fb8
1 измењених фајлова са 25 додато и 19 уклоњено
  1. 25 19
      Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs

+ 25 - 19
Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs

@@ -269,23 +269,9 @@ namespace Terminal.Gui {
 				}
 
 				if ((mouseFlag & MouseFlags.ReportMousePosition) == 0) {
-					Task.Run (async () => {
-						while (IsButtonPressed && LastMouseButtonPressed != null) {
-							await Task.Delay (100);
-							var me = new MouseEvent () {
-								X = cev.X,
-								Y = cev.Y,
-								Flags = mouseFlag
-							};
-
-							var view = Application.wantContinuousButtonPressedView;
-							if (view == null)
-								break;
-							if (IsButtonPressed && LastMouseButtonPressed != null && (mouseFlag & MouseFlags.ReportMousePosition) == 0) {
-								mouseHandler (me);
-								//mainLoop.Driver.Wakeup ();
-							}
-						}
+					Application.MainLoop.AddIdle (() => {
+						ProcessContinuousButtonPressedAsync (cev, mouseFlag).ConfigureAwait (false);
+						return false;
 					});
 				}
 
@@ -342,7 +328,7 @@ namespace Terminal.Gui {
 			};
 		}
 
-		private MouseFlags ProcessButtonClickedEvent (Curses.MouseEvent cev)
+		MouseFlags ProcessButtonClickedEvent (Curses.MouseEvent cev)
 		{
 			LastMouseButtonPressed = cev.ButtonState;
 			var mf = GetButtonState (cev, true);
@@ -358,7 +344,7 @@ namespace Terminal.Gui {
 			return mf;
 		}
 
-		private MouseFlags ProcessButtonReleasedEvent (Curses.MouseEvent cev)
+		MouseFlags ProcessButtonReleasedEvent (Curses.MouseEvent cev)
 		{
 			var mf = MapCursesButton (cev.ButtonState);
 			if (!cancelButtonClicked && LastMouseButtonPressed == null && !isReportMousePosition) {
@@ -371,6 +357,26 @@ namespace Terminal.Gui {
 			return mf;
 		}
 
+		async Task ProcessContinuousButtonPressedAsync (Curses.MouseEvent cev, MouseFlags mouseFlag)
+		{
+			while (IsButtonPressed && LastMouseButtonPressed != null) {
+				await Task.Delay (100);
+				var me = new MouseEvent () {
+					X = cev.X,
+					Y = cev.Y,
+					Flags = mouseFlag
+				};
+
+				var view = Application.wantContinuousButtonPressedView;
+				if (view == null)
+					break;
+				if (IsButtonPressed && LastMouseButtonPressed != null && (mouseFlag & MouseFlags.ReportMousePosition) == 0) {
+					mouseHandler (me);
+					//mainLoop.Driver.Wakeup ();
+				}
+			}
+		}
+
 		MouseFlags GetButtonState (Curses.MouseEvent cev, bool pressed = false)
 		{
 			MouseFlags mf = default;