From ecfd9c11328364ca545a5864d9f7bb691ce49bb1 Mon Sep 17 00:00:00 2001 From: tznind Date: Wed, 21 Sep 2022 13:13:46 +0100 Subject: [PATCH] WIP fix TryRemapPacketKey to correctly apply Alt/Ctrl mask --- Terminal.Gui/ConsoleDrivers/WindowsDriver.cs | 30 +++++++++++++- UnitTests/ConsoleDriverTests.cs | 42 +++++++++++++++----- 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs b/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs index b2cdcfafe..61bdb4b68 100644 --- a/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs +++ b/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs @@ -1761,9 +1761,37 @@ namespace Terminal.Gui { // do not have a explicit mapping and char is nonzero so // we can just treat the `Key` as a regular unicode entry - result = (Key)c; + result = ApplyModifiers ((Key)c,original.Modifiers); + return true; } + + /// + /// Applies + /// + /// + /// + /// + private static Key ApplyModifiers (Key c, ConsoleModifiers modifiers) + { + if(modifiers.HasFlag(ConsoleModifiers.Control)) { + c |= Key.CtrlMask; + } + + if (modifiers.HasFlag (ConsoleModifiers.Alt)) { + c |= Key.AltMask; + } + + /* TODO: Why not this too? I'm a bit confused + ALSO this method looks a lot like `Key MapKeyModifiers (ConsoleKeyInfo keyInfo, Key key)` + Maybe we should be using that instead? + if (modifiers.HasFlag (ConsoleModifiers.Shift)) { + c |= Key.ShiftMask; + } + */ + + return c; + } #endregion } diff --git a/UnitTests/ConsoleDriverTests.cs b/UnitTests/ConsoleDriverTests.cs index dcac0ebf0..dd749ea16 100644 --- a/UnitTests/ConsoleDriverTests.cs +++ b/UnitTests/ConsoleDriverTests.cs @@ -617,25 +617,45 @@ namespace Terminal.Gui.ConsoleDrivers { /// see: https://github.com/gui-cs/Terminal.Gui/issues/2008 /// [Theory] - [InlineData ('A', Key.A)] - [InlineData ('z', Key.z)] - [InlineData ('=', (Key)'=')] - [InlineData ('英', (Key)'英')] - [InlineData ('+', (Key)'+')] - public void TestVKPacket (char unicodeCharacter, Key expectedRemapping) + [InlineData ('A', false, false, false, Key.A)] + [InlineData ('A', true, false, false, Key.A)] + [InlineData ('A', true, true, false, Key.A | Key.AltMask)] + [InlineData ('A', true, true, true, Key.A | Key.AltMask | Key.CtrlMask)] + [InlineData ('z', false, false, false, Key.z)] + [InlineData ('z', true, false, false, Key.z)] + [InlineData ('z', true, true, false, Key.z | Key.AltMask)] + [InlineData ('z', true, true, true, Key.z | Key.AltMask | Key.CtrlMask)] + [InlineData ('=', false, false, false, (Key)'=')] + [InlineData ('=', true, false, false, (Key)'=')] + [InlineData ('=', true, true, false, (Key)'=' | Key.AltMask)] + [InlineData ('=', true, true, true, (Key)'=' | Key.AltMask | Key.CtrlMask)] + [InlineData ('英', false, false, false, (Key)'英')] + [InlineData ('英', true, false, false, (Key)'英')] + [InlineData ('英', true, true, false, (Key)'英' | Key.AltMask)] + [InlineData ('英', true, true, true, (Key)'英' | Key.AltMask | Key.CtrlMask)] + [InlineData ('+', false, false, false, (Key)'+')] + [InlineData ('+', true, false, false, (Key)'+')] + [InlineData ('+', true, true, false, (Key)'+' | Key.AltMask)] + [InlineData ('+', true, true, true, (Key)'+' | Key.AltMask | Key.CtrlMask)] + public void TestVKPacket (char unicodeCharacter,bool shift, bool alt, bool ctrl, Key expectedRemapping) { - var before = new ConsoleKeyInfo (unicodeCharacter, ConsoleKey.Packet, false, false, false); + var before = new ConsoleKeyInfo (unicodeCharacter, ConsoleKey.Packet, shift, alt, ctrl); Assert.True (WindowsDriver.TryRemapPacketKey (before, out var after)); // The thing we are really interested in, did we correctly convert // the input ConsoleKey.Packet to the correct physical key Assert.Equal (expectedRemapping, after); } - [Fact] - public void TestVKPacketWithZero () + + [Theory] + [InlineData (false, false, false)] + [InlineData (true, false, false)] + [InlineData (true, true, false)] + [InlineData (true, true, true)] + public void TestVKPacketWithZero (bool shift, bool alt, bool ctrl) { - var before = new ConsoleKeyInfo ('\0', ConsoleKey.Packet, false, false, false); - Assert.False (WindowsDriver.TryRemapPacketKey (before, out var after),"Expected there to be no attempt to map \\0 to a Key"); + var before = new ConsoleKeyInfo ('\0', ConsoleKey.Packet,shift,alt,ctrl); + Assert.False (WindowsDriver.TryRemapPacketKey (before, out var _),"Expected there to be no attempt to map \\0 to a Key"); } } }