diff --git a/Terminal.Gui/ConsoleDrivers/AnsiEscapeSequence/AnsiEscapeSequenceRequest.cs b/Terminal.Gui/ConsoleDrivers/AnsiEscapeSequence/AnsiEscapeSequenceRequest.cs
index d8dc22ad3..1a3a40fd2 100644
--- a/Terminal.Gui/ConsoleDrivers/AnsiEscapeSequence/AnsiEscapeSequenceRequest.cs
+++ b/Terminal.Gui/ConsoleDrivers/AnsiEscapeSequence/AnsiEscapeSequenceRequest.cs
@@ -56,58 +56,21 @@ public class AnsiEscapeSequenceRequest
var response = new StringBuilder ();
var error = new StringBuilder ();
var savedIsReportingMouseMoves = false;
- NetDriver? netDriver = null;
+ ConsoleDriver? driver = null;
var values = new string? [] { null };
try
{
- switch (Application.Driver)
+ driver = Application.Driver;
+
+ savedIsReportingMouseMoves = driver!.IsReportingMouseMoves;
+
+ if (savedIsReportingMouseMoves)
{
- case NetDriver:
- netDriver = Application.Driver as NetDriver;
- savedIsReportingMouseMoves = netDriver!.IsReportingMouseMoves;
-
- if (savedIsReportingMouseMoves)
- {
- netDriver.StopReportingMouseMoves ();
- }
-
- while (Console.KeyAvailable)
- {
- netDriver._mainLoopDriver._netEvents._waitForStart.Set ();
- netDriver._mainLoopDriver._netEvents._waitForStart.Reset ();
-
- netDriver._mainLoopDriver._netEvents._forceRead = true;
- }
-
- netDriver._mainLoopDriver._netEvents._forceRead = false;
-
- break;
- case CursesDriver cursesDriver:
- savedIsReportingMouseMoves = cursesDriver.IsReportingMouseMoves;
-
- if (savedIsReportingMouseMoves)
- {
- cursesDriver.StopReportingMouseMoves ();
- }
-
- break;
+ driver.StopReportingMouseMoves ();
}
- if (netDriver is { })
- {
- NetEvents._suspendRead = true;
- }
- else
- {
- Thread.Sleep (100); // Allow time for mouse stopping and to flush the input buffer
-
- // Flush the input buffer to avoid reading stale input
- while (Console.KeyAvailable)
- {
- Console.ReadKey (true);
- }
- }
+ driver!.IsSuspendRead = true;
// Send the ANSI escape sequence
Console.Write (ansiRequest.Request);
@@ -156,18 +119,8 @@ public class AnsiEscapeSequenceRequest
if (savedIsReportingMouseMoves)
{
- switch (Application.Driver)
- {
- case NetDriver:
- NetEvents._suspendRead = false;
- netDriver!.StartReportingMouseMoves ();
-
- break;
- case CursesDriver cursesDriver:
- cursesDriver.StartReportingMouseMoves ();
-
- break;
- }
+ driver!.IsSuspendRead = false;
+ driver.StartReportingMouseMoves ();
}
}
diff --git a/Terminal.Gui/ConsoleDrivers/ConsoleDriver.cs b/Terminal.Gui/ConsoleDrivers/ConsoleDriver.cs
index 7d6de3834..e0b846560 100644
--- a/Terminal.Gui/ConsoleDrivers/ConsoleDriver.cs
+++ b/Terminal.Gui/ConsoleDrivers/ConsoleDriver.cs
@@ -562,6 +562,16 @@ public abstract class ConsoleDriver
#region Mouse and Keyboard
+ ///
+ /// Gets whether the mouse is reporting move events.
+ ///
+ public abstract bool IsReportingMouseMoves { get; internal set; }
+
+ ///
+ /// Gets whether the terminal is reading input.
+ ///
+ public abstract bool IsSuspendRead { get; internal set; }
+
/// Event fired when a key is pressed down. This is a precursor to .
public event EventHandler? KeyDown;
@@ -608,6 +618,16 @@ public abstract class ConsoleDriver
/// If simulates the Ctrl key being pressed.
public abstract void SendKeys (char keyChar, ConsoleKey key, bool shift, bool alt, bool ctrl);
+ ///
+ /// Provide handling for the terminal start reporting mouse events.
+ ///
+ public abstract void StartReportingMouseMoves ();
+
+ ///
+ /// Provide handling for the terminal stop reporting mouse events.
+ ///
+ public abstract void StopReportingMouseMoves ();
+
#endregion
}
diff --git a/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs b/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs
index ff4f95bdb..41e1b0862 100644
--- a/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs
+++ b/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs
@@ -18,6 +18,7 @@ internal class CursesDriver : ConsoleDriver
private MouseFlags _lastMouseFlags;
private UnixMainLoop _mainLoopDriver;
private object _processInputToken;
+ private bool _isSuspendRead;
public override int Cols
{
@@ -177,9 +178,16 @@ internal class CursesDriver : ConsoleDriver
return true;
}
- public bool IsReportingMouseMoves { get; private set; }
+ public override bool IsReportingMouseMoves { get; internal set; }
- public void StartReportingMouseMoves ()
+ ///
+ public override bool IsSuspendRead
+ {
+ get => _isSuspendRead;
+ internal set => _isSuspendRead = value;
+ }
+
+ public override void StartReportingMouseMoves ()
{
if (!RunningUnitTests)
{
@@ -189,7 +197,7 @@ internal class CursesDriver : ConsoleDriver
}
}
- public void StopReportingMouseMoves ()
+ public override void StopReportingMouseMoves ()
{
if (!RunningUnitTests)
{
diff --git a/Terminal.Gui/ConsoleDrivers/FakeDriver/FakeDriver.cs b/Terminal.Gui/ConsoleDrivers/FakeDriver/FakeDriver.cs
index 73c12959f..342fe4856 100644
--- a/Terminal.Gui/ConsoleDrivers/FakeDriver/FakeDriver.cs
+++ b/Terminal.Gui/ConsoleDrivers/FakeDriver/FakeDriver.cs
@@ -40,6 +40,20 @@ public class FakeDriver : ConsoleDriver
public static Behaviors FakeBehaviors = new ();
public override bool SupportsTrueColor => false;
+ ///
+ public override bool IsReportingMouseMoves
+ {
+ get => _isReportingMouseMoves;
+ internal set => _isReportingMouseMoves = value;
+ }
+
+ ///
+ public override bool IsSuspendRead
+ {
+ get => _isSuspendRead;
+ internal set => _isSuspendRead = value;
+ }
+
public FakeDriver ()
{
Cols = FakeConsole.WindowWidth = FakeConsole.BufferWidth = FakeConsole.WIDTH;
@@ -337,6 +351,8 @@ public class FakeDriver : ConsoleDriver
}
private CursorVisibility _savedCursorVisibility;
+ private bool _isReportingMouseMoves;
+ private bool _isSuspendRead;
private void MockKeyPressedHandler (ConsoleKeyInfo consoleKeyInfo)
{
@@ -392,6 +408,12 @@ public class FakeDriver : ConsoleDriver
MockKeyPressedHandler (new ConsoleKeyInfo (keyChar, key, shift, alt, control));
}
+ ///
+ public override void StartReportingMouseMoves () { throw new NotImplementedException (); }
+
+ ///
+ public override void StopReportingMouseMoves () { throw new NotImplementedException (); }
+
public void SetBufferSize (int width, int height)
{
FakeConsole.SetBufferSize (width, height);
diff --git a/Terminal.Gui/ConsoleDrivers/NetDriver.cs b/Terminal.Gui/ConsoleDrivers/NetDriver.cs
index 7d9043a32..ef82ecf8e 100644
--- a/Terminal.Gui/ConsoleDrivers/NetDriver.cs
+++ b/Terminal.Gui/ConsoleDrivers/NetDriver.cs
@@ -1328,6 +1328,7 @@ internal class NetDriver : ConsoleDriver
}
private CursorVisibility? _cachedCursorVisibility;
+ private bool _isSuspendRead;
public override void UpdateCursor ()
{
@@ -1376,9 +1377,16 @@ internal class NetDriver : ConsoleDriver
#region Mouse Handling
- public bool IsReportingMouseMoves { get; private set; }
+ public override bool IsReportingMouseMoves { get; internal set; }
- public void StartReportingMouseMoves ()
+ ///
+ public override bool IsSuspendRead
+ {
+ get => _isSuspendRead;
+ internal set => _isSuspendRead = _suspendRead = value;
+ }
+
+ public override void StartReportingMouseMoves ()
{
if (!RunningUnitTests)
{
@@ -1388,7 +1396,7 @@ internal class NetDriver : ConsoleDriver
}
}
- public void StopReportingMouseMoves ()
+ public override void StopReportingMouseMoves ()
{
if (!RunningUnitTests)
{
@@ -1396,6 +1404,19 @@ internal class NetDriver : ConsoleDriver
IsReportingMouseMoves = false;
}
+
+ while (_mainLoopDriver is { _netEvents: { }} && Console.KeyAvailable)
+ {
+ _mainLoopDriver._netEvents._waitForStart.Set ();
+ _mainLoopDriver._netEvents._waitForStart.Reset ();
+
+ _mainLoopDriver._netEvents._forceRead = true;
+ }
+
+ if (_mainLoopDriver is { _netEvents: { } })
+ {
+ _mainLoopDriver._netEvents._forceRead = false;
+ }
}
private MouseEventArgs ToDriverMouse (NetEvents.MouseEvent me)
diff --git a/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs b/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs
index fd5c6901c..26c01295d 100644
--- a/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs
+++ b/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs
@@ -1035,6 +1035,20 @@ internal class WindowsDriver : ConsoleDriver
public override bool SupportsTrueColor => RunningUnitTests || (Environment.OSVersion.Version.Build >= 14931 && _isWindowsTerminal);
+ ///
+ public override bool IsReportingMouseMoves
+ {
+ get => _isReportingMouseMoves;
+ internal set => _isReportingMouseMoves = value;
+ }
+
+ ///
+ public override bool IsSuspendRead
+ {
+ get => _isSuspendRead;
+ internal set => _isSuspendRead = value;
+ }
+
public WindowsConsole WinConsole { get; private set; }
public WindowsConsole.KeyEventRecord FromVKPacketToKeyEventRecord (WindowsConsole.KeyEventRecord keyEvent)
@@ -1162,6 +1176,11 @@ internal class WindowsDriver : ConsoleDriver
}
}
+ ///
+ public override void StartReportingMouseMoves () { throw new NotImplementedException (); }
+
+ ///
+ public override void StopReportingMouseMoves () { throw new NotImplementedException (); }
#region Not Implemented
@@ -1188,6 +1207,8 @@ internal class WindowsDriver : ConsoleDriver
#region Cursor Handling
private CursorVisibility? _cachedCursorVisibility;
+ private bool _isReportingMouseMoves;
+ private bool _isSuspendRead;
public override void UpdateCursor ()
{