From f568166fb8becf7bc78bf57c1e8a7f7f1c53c7c8 Mon Sep 17 00:00:00 2001 From: BDisp Date: Wed, 20 Jan 2021 14:54:34 +0000 Subject: [PATCH] Fixes #1091. Continuous button pressed not working properly on Linux. --- .../CursesDriver/CursesDriver.cs | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs b/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs index 1bab57fb9..53e5dd6d2 100644 --- a/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs +++ b/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;