Rootkeyevent (#1635)

* Added RootKeyEvent

* Tests for RootKeyEvent

* Fixed warnings for Assert.Equal parameter order
This commit is contained in:
Thomas Nind
2022-03-17 09:04:19 +00:00
committed by GitHub
parent 99d88af355
commit 6374ba5b56
2 changed files with 46 additions and 0 deletions

View File

@@ -403,6 +403,9 @@ namespace Terminal.Gui {
static void ProcessKeyEvent (KeyEvent ke)
{
if(RootKeyEvent?.Invoke(ke) ?? false) {
return;
}
var chain = toplevels.ToList ();
foreach (var topLevel in chain) {
@@ -588,6 +591,15 @@ namespace Terminal.Gui {
/// </summary>
public static Action<MouseEvent> RootMouseEvent;
/// <summary>
/// <para>
/// Called for new KeyPress events before any processing is performed or
/// views evaluate. Use for global key handling and/or debugging.
/// </para>
/// <para>Return true to suppress the KeyPress event</para>
/// </summary>
public static Func<KeyEvent,bool> RootKeyEvent;
internal static View wantContinuousButtonPressedView;
static View lastMouseOwnerView;
@@ -872,6 +884,7 @@ namespace Terminal.Gui {
Driver = null;
Iteration = null;
RootMouseEvent = null;
RootKeyEvent = null;
Resized = null;
_initialized = false;
mouseGrabView = null;

View File

@@ -1178,5 +1178,38 @@ namespace Terminal.Gui.Views {
Assert.Equal ("-1", oldText);
Assert.Equal ("-", tf.Text);
}
[Fact]
[AutoInitShutdown]
public void Test_RootKeyEvent_Cancel()
{
Application.RootKeyEvent += SuppressKey;
var tf = new TextField();
Application.Top.Add (tf);
Application.Begin (Application.Top);
Application.Driver.SendKeys('a',ConsoleKey.A,false,false,false);
Assert.Equal("a", tf.Text.ToString ());
// SuppressKey suppresses the 'j' key
Application.Driver.SendKeys('j',ConsoleKey.A,false,false,false);
Assert.Equal("a", tf.Text.ToString ());
Application.RootKeyEvent -= SuppressKey;
// Now that the delegate has been removed we can type j again
Application.Driver.SendKeys('j',ConsoleKey.A,false,false,false);
Assert.Equal("aj", tf.Text.ToString ());
}
private bool SuppressKey (KeyEvent arg)
{
if(arg.KeyValue == 'j')
return true;
return false;
}
}
}