Browse Source

Fix SetCursorVisibility in CursesDriver.

BDisp 8 months ago
parent
commit
0f6ce06dd1

+ 29 - 28
Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs

@@ -102,34 +102,6 @@ internal class CursesDriver : ConsoleDriver
         //OnKeyPressed (new KeyEventArgsEventArgs (key));
     }
 
-    /// <inheritdoc/>
-    public override bool SetCursorVisibility (CursorVisibility visibility)
-    {
-        if (_initialCursorVisibility.HasValue == false)
-        {
-            return false;
-        }
-
-        if (!RunningUnitTests)
-        {
-            Curses.curs_set (((int)visibility >> 16) & 0x000000FF);
-        }
-
-        if (visibility != CursorVisibility.Invisible)
-        {
-            Console.Out.Write (
-                               AnsiEscapeSequenceRequestUtils.CSI_SetCursorStyle (
-                                                                                  (AnsiEscapeSequenceRequestUtils.DECSCUSR_Style)(((int)visibility >> 24)
-                                                                                              & 0xFF)
-                                                                                 )
-                              );
-        }
-
-        _currentCursorVisibility = visibility;
-
-        return true;
-    }
-
     public void StartReportingMouseMoves ()
     {
         if (!RunningUnitTests)
@@ -568,6 +540,35 @@ internal class CursesDriver : ConsoleDriver
         return true;
     }
 
+    /// <inheritdoc/>
+    public override bool SetCursorVisibility (CursorVisibility visibility)
+    {
+        if (_initialCursorVisibility.HasValue == false)
+        {
+            return false;
+        }
+
+        if (!RunningUnitTests)
+        {
+            Curses.curs_set (((int)visibility >> 16) & 0x000000FF);
+        }
+
+        if (visibility != CursorVisibility.Invisible)
+        {
+            _mainLoopDriver?.WriteRaw (
+                                       AnsiEscapeSequenceRequestUtils.CSI_SetCursorStyle (
+                                                                                          (AnsiEscapeSequenceRequestUtils.DECSCUSR_Style)
+                                                                                          (((int)visibility >> 24)
+                                                                                           & 0xFF)
+                                                                                         )
+                                      );
+        }
+
+        _currentCursorVisibility = visibility;
+
+        return true;
+    }
+
     private bool SetCursorPosition (int col, int row)
     {
         // + 1 is needed because non-Windows is based on 1 instead of 0 and

+ 9 - 14
Terminal.Gui/ConsoleDrivers/CursesDriver/UnixMainLoop.cs

@@ -182,6 +182,15 @@ internal class UnixMainLoop (ConsoleDriver consoleDriver) : IMainLoopDriver
             {
                 while (!_inputHandlerTokenSource.IsCancellationRequested)
                 {
+                    try
+                    {
+                        Task.Delay (100, _inputHandlerTokenSource.Token).Wait (_inputHandlerTokenSource.Token);
+                    }
+                    catch (OperationCanceledException)
+                    {
+                        return;
+                    }
+
                     int n = poll (_pollMap, (uint)_pollMap.Length, 0);
 
                     if (n > 0)
@@ -257,18 +266,6 @@ internal class UnixMainLoop (ConsoleDriver consoleDriver) : IMainLoopDriver
                     {
                         _retries = 0;
                     }
-
-                    try
-                    {
-                        if (!_forceRead)
-                        {
-                            Task.Delay (100, _inputHandlerTokenSource.Token).Wait (_inputHandlerTokenSource.Token);
-                        }
-                    }
-                    catch (OperationCanceledException)
-                    {
-                        return;
-                    }
                 }
             }
 
@@ -437,8 +434,6 @@ internal class UnixMainLoop (ConsoleDriver consoleDriver) : IMainLoopDriver
     {
         // Write to stdout (fd 1)
         write (STDOUT_FILENO, ansiRequest, ansiRequest.Length);
-
-        Task.Delay (100, _inputHandlerTokenSource.Token).Wait (_inputHandlerTokenSource.Token);
     }
 
     [DllImport ("libc")]