Pārlūkot izejas kodu

Fixes #4221 Extra modifiers f1 to f4 in v2net (#4220)

* Assume we are running in a terminal that supports true color by default unless user explicitly forces 16

* Add support for extra modifiers for F1 to F4 keys

* Revert "Assume we are running in a terminal that supports true color by default unless user explicitly forces 16"

This reverts commit 4cc2530de04c79554c0747ba4a2ca877c46058b8.

* Cleanup

* Update comments

* Code cleanup

---------

Co-authored-by: Tig <[email protected]>
Thomas Nind 1 nedēļu atpakaļ
vecāks
revīzija
7ca765cef1

+ 9 - 3
Terminal.Gui/Drivers/AnsiResponseParser/Keyboard/CsiCursorPattern.cs

@@ -7,11 +7,11 @@ namespace Terminal.Gui.Drivers;
 ///     Detects ansi escape sequences in strings that have been read from
 ///     the terminal (see <see cref="IAnsiResponseParser"/>).
 ///     Handles navigation CSI key parsing such as <c>\x1b[A</c> (Cursor up)
-///     and <c>\x1b[1;5A</c> (Cursor up with Ctrl)
+///     and <c>\x1b[1;5A</c> (Cursor/Function with modifier(s))
 /// </summary>
 public class CsiCursorPattern : AnsiKeyboardParserPattern
 {
-    private readonly Regex _pattern = new (@"^\u001b\[(?:1;(\d+))?([A-DHF])$");
+    private readonly Regex _pattern = new (@"^\u001b\[(?:1;(\d+))?([A-DFHPQRS])$");
 
     private readonly Dictionary<char, Key> _cursorMap = new ()
     {
@@ -20,7 +20,13 @@ public class CsiCursorPattern : AnsiKeyboardParserPattern
         { 'C', Key.CursorRight },
         { 'D', Key.CursorLeft },
         { 'H', Key.Home },
-        { 'F', Key.End }
+        { 'F', Key.End },
+
+        // F1–F4 as per xterm VT100-style CSI sequences
+        { 'P', Key.F1 },
+        { 'Q', Key.F2 },
+        { 'R', Key.F3 },
+        { 'S', Key.F4 }
     };
 
     /// <inheritdoc/>

+ 1 - 2
Tests/UnitTests/ConsoleDrivers/AnsiKeyboardParserTests.cs

@@ -100,11 +100,10 @@ public class AnsiKeyboardParserTests
         yield return new object [] { "\u001b[24~", Key.F12 };
 
         // Function keys with modifiers
-        /*  Not currently supported
         yield return new object [] { "\u001b[1;2P", Key.F1.WithShift };
         yield return new object [] { "\u001b[1;3Q", Key.F2.WithAlt };
         yield return new object [] { "\u001b[1;5R", Key.F3.WithCtrl };
-        */
+        
     }
 
     // Consolidated test for all keyboard events (e.g., arrow keys)