Browse Source

Rootkeyevent (#1635)

* Added RootKeyEvent

* Tests for RootKeyEvent

* Fixed warnings for Assert.Equal parameter order
Thomas Nind 3 years ago
parent
commit
6374ba5b56
2 changed files with 46 additions and 0 deletions
  1. 13 0
      Terminal.Gui/Core/Application.cs
  2. 33 0
      UnitTests/TextFieldTests.cs

+ 13 - 0
Terminal.Gui/Core/Application.cs

@@ -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;

+ 33 - 0
UnitTests/TextFieldTests.cs

@@ -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;
+		}
 	}
 }