| ... | ... | | @@ -634,95 +638,95 @@ test "shellQuote" { |
| 634 | 638 | | try std.testing.expectEqualStrings("'hello'", plain); |
| 635 | 639 | | } |
| 636 | 640 | |
|
| 637 | | - | test "isKittyCtrlBackslash" { |
| 641 | + | test "isCtrlBackslash" { |
| 638 | 642 | | const expect = std.testing.expect; |
| 639 | 643 | |
|
| 640 | 644 | | // Basic: ctrl only (modifier 5 = 1 + 4) |
| 641 | | - | try expect(isKittyCtrlBackslash("\x1b[92;5u")); |
| 645 | + | try expect(isCtrlBackslash("\x1b[92;5u")); |
| 642 | 646 | |
|
| 643 | 647 | | // Explicit press event type (:1) |
| 644 | | - | try expect(isKittyCtrlBackslash("\x1b[92;5:1u")); |
| 648 | + | try expect(isCtrlBackslash("\x1b[92;5:1u")); |
| 645 | 649 | |
|
| 646 | 650 | | // Repeat event (:2) -- user holding Ctrl+\ |
| 647 | | - | try expect(isKittyCtrlBackslash("\x1b[92;5:2u")); |
| 651 | + | try expect(isCtrlBackslash("\x1b[92;5:2u")); |
| 648 | 652 | |
|
| 649 | 653 | | // Release event (:3) -- must NOT trigger detach |
| 650 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;5:3u")); |
| 654 | + | try expect(!isCtrlBackslash("\x1b[92;5:3u")); |
| 651 | 655 | |
|
| 652 | 656 | | // Lock modifiers: caps_lock (bit 6) changes modifier value |
| 653 | 657 | | // ctrl + caps_lock = 1 + (4 + 64) = 69 |
| 654 | | - | try expect(isKittyCtrlBackslash("\x1b[92;69u")); |
| 655 | | - | try expect(isKittyCtrlBackslash("\x1b[92;69:1u")); |
| 656 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;69:3u")); |
| 658 | + | try expect(isCtrlBackslash("\x1b[92;69u")); |
| 659 | + | try expect(isCtrlBackslash("\x1b[92;69:1u")); |
| 660 | + | try expect(!isCtrlBackslash("\x1b[92;69:3u")); |
| 657 | 661 | |
|
| 658 | 662 | | // ctrl + num_lock = 1 + (4 + 128) = 133 |
| 659 | | - | try expect(isKittyCtrlBackslash("\x1b[92;133u")); |
| 663 | + | try expect(isCtrlBackslash("\x1b[92;133u")); |
| 660 | 664 | |
|
| 661 | 665 | | // ctrl + caps_lock + num_lock = 1 + (4 + 64 + 128) = 197 |
| 662 | | - | try expect(isKittyCtrlBackslash("\x1b[92;197u")); |
| 666 | + | try expect(isCtrlBackslash("\x1b[92;197u")); |
| 663 | 667 | |
|
| 664 | 668 | | // Combined intentional modifiers -- must NOT match (ctrl+\ is the |
| 665 | 669 | | // detach key, not ctrl+shift+\ or ctrl+alt+\) |
| 666 | 670 | | // ctrl + shift = 1 + (4 + 1) = 6 |
| 667 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;6u")); |
| 671 | + | try expect(!isCtrlBackslash("\x1b[92;6u")); |
| 668 | 672 | |
|
| 669 | 673 | | // ctrl + alt = 1 + (4 + 2) = 7 |
| 670 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;7u")); |
| 674 | + | try expect(!isCtrlBackslash("\x1b[92;7u")); |
| 671 | 675 | |
|
| 672 | 676 | | // ctrl + super = 1 + (4 + 8) = 13 |
| 673 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;13u")); |
| 677 | + | try expect(!isCtrlBackslash("\x1b[92;13u")); |
| 674 | 678 | |
|
| 675 | 679 | | // ctrl + shift + caps_lock = 1 + (1 + 4 + 64) = 70 -- shift is intentional |
| 676 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;70u")); |
| 680 | + | try expect(!isCtrlBackslash("\x1b[92;70u")); |
| 677 | 681 | |
|
| 678 | 682 | | // ctrl + shift + num_lock = 1 + (1 + 4 + 128) = 134 -- shift is intentional |
| 679 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;134u")); |
| 683 | + | try expect(!isCtrlBackslash("\x1b[92;134u")); |
| 680 | 684 | |
|
| 681 | 685 | | // Modifier without ctrl bit -- must NOT match |
| 682 | 686 | | // shift only = 1 + 1 = 2 |
| 683 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;1u")); |
| 684 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;2u")); |
| 687 | + | try expect(!isCtrlBackslash("\x1b[92;1u")); |
| 688 | + | try expect(!isCtrlBackslash("\x1b[92;2u")); |
| 685 | 689 | |
|
| 686 | 690 | | // Alternate key sub-fields (report_alternates flag) |
| 687 | 691 | | // shifted key | (124): \x1b[92:124;5u |
| 688 | | - | try expect(isKittyCtrlBackslash("\x1b[92:124;5u")); |
| 692 | + | try expect(isCtrlBackslash("\x1b[92:124;5u")); |
| 689 | 693 | |
|
| 690 | 694 | | // base layout key only (non-US keyboard): \x1b[92::92;5u |
| 691 | | - | try expect(isKittyCtrlBackslash("\x1b[92::92;5u")); |
| 695 | + | try expect(isCtrlBackslash("\x1b[92::92;5u")); |
| 692 | 696 | |
|
| 693 | 697 | | // both shifted and base layout: \x1b[92:124:92;5u |
| 694 | | - | try expect(isKittyCtrlBackslash("\x1b[92:124:92;5u")); |
| 698 | + | try expect(isCtrlBackslash("\x1b[92:124:92;5u")); |
| 695 | 699 | |
|
| 696 | 700 | | // Alternate keys + lock modifiers + event type |
| 697 | | - | try expect(isKittyCtrlBackslash("\x1b[92:124;69:1u")); |
| 698 | | - | try expect(!isKittyCtrlBackslash("\x1b[92:124;69:3u")); |
| 701 | + | try expect(isCtrlBackslash("\x1b[92:124;69:1u")); |
| 702 | + | try expect(!isCtrlBackslash("\x1b[92:124;69:3u")); |
| 699 | 703 | |
|
| 700 | 704 | | // Text codepoints section (flag 0b10000) -- tolerated and skipped |
| 701 | 705 | | // Even though ctrl+\ text is typically empty, terminals may vary |
| 702 | | - | try expect(isKittyCtrlBackslash("\x1b[92;5;28u")); |
| 703 | | - | try expect(isKittyCtrlBackslash("\x1b[92;5;28:92u")); |
| 706 | + | try expect(isCtrlBackslash("\x1b[92;5;28u")); |
| 707 | + | try expect(isCtrlBackslash("\x1b[92;5;28:92u")); |
| 704 | 708 | |
|
| 705 | 709 | | // Wrong key code -- must NOT match |
| 706 | | - | try expect(!isKittyCtrlBackslash("\x1b[91;5u")); |
| 707 | | - | try expect(!isKittyCtrlBackslash("\x1b[93;5u")); |
| 708 | | - | try expect(!isKittyCtrlBackslash("\x1b[9;5u")); |
| 709 | | - | try expect(!isKittyCtrlBackslash("\x1b[920;5u")); |
| 710 | + | try expect(!isCtrlBackslash("\x1b[91;5u")); |
| 711 | + | try expect(!isCtrlBackslash("\x1b[93;5u")); |
| 712 | + | try expect(!isCtrlBackslash("\x1b[9;5u")); |
| 713 | + | try expect(!isCtrlBackslash("\x1b[920;5u")); |
| 710 | 714 | |
|
| 711 | 715 | | // Sequence embedded in larger buffer (e.g., preceded by other input) |
| 712 | | - | try expect(isKittyCtrlBackslash("abc\x1b[92;5u")); |
| 713 | | - | try expect(isKittyCtrlBackslash("\x1b[A\x1b[92;5u")); |
| 716 | + | try expect(isCtrlBackslash("abc\x1b[92;5u")); |
| 717 | + | try expect(isCtrlBackslash("\x1b[A\x1b[92;5u")); |
| 714 | 718 | |
|
| 715 | 719 | | // Garbage / malformed inputs |
| 716 | | - | try expect(!isKittyCtrlBackslash("garbage")); |
| 717 | | - | try expect(!isKittyCtrlBackslash("")); |
| 718 | | - | try expect(!isKittyCtrlBackslash("\x1b[")); |
| 719 | | - | try expect(!isKittyCtrlBackslash("\x1b[92")); |
| 720 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;")); |
| 721 | | - | try expect(!isKittyCtrlBackslash("\x1b[92;u")); |
| 722 | | - | try expect(!isKittyCtrlBackslash("\x1b[;5u")); |
| 720 | + | try expect(!isCtrlBackslash("garbage")); |
| 721 | + | try expect(!isCtrlBackslash("")); |
| 722 | + | try expect(!isCtrlBackslash("\x1b[")); |
| 723 | + | try expect(!isCtrlBackslash("\x1b[92")); |
| 724 | + | try expect(!isCtrlBackslash("\x1b[92;")); |
| 725 | + | try expect(!isCtrlBackslash("\x1b[92;u")); |
| 726 | + | try expect(!isCtrlBackslash("\x1b[;5u")); |
| 723 | 727 | |
|
| 724 | 728 | | // Other CSI u sequences that happen to contain '92' elsewhere |
| 725 | | - | try expect(!isKittyCtrlBackslash("\x1b[65;92u")); |
| 729 | + | try expect(!isCtrlBackslash("\x1b[65;92u")); |
| 726 | 730 | | } |
| 727 | 731 | |
|
| 728 | 732 | | test "serializeTerminalState excludes synchronized output replay" { |