diff --git a/Example/demo.cs b/Example/demo.cs index 53974b3c0..95a5726e6 100644 --- a/Example/demo.cs +++ b/Example/demo.cs @@ -190,7 +190,7 @@ static class Demo { new DateField (3, 22, DateTime.Now), new DateField (23, 22, DateTime.Now, true), progress, - new Label (3, 24, "Press F9 (on Unix, ESC+9 is an alias) to activate the menubar"), + new Label (3, 24, "Press F9 (on Unix, ESC+9 is an alias) or Ctrl+T to activate the menubar"), menuKeysStyle, menuAutoMouseNav @@ -636,10 +636,23 @@ static class Demo { }; #endif + win.KeyPress += Win_KeyPress; + top.Add (win); //top.Add (menu); top.Add (menu, statusBar); Application.Run (); } + + private static void Win_KeyPress (object sender, View.KeyEventEventArgs e) + { + if (e.KeyEvent.Key == Key.ControlT) { + if (menu.IsMenuOpen) + menu.CloseMenu (); + else + menu.OpenMenu (); + e.Handled = true; + } + } } diff --git a/Terminal.Gui/Core.cs b/Terminal.Gui/Core.cs index 3e0032e14..55330a50c 100644 --- a/Terminal.Gui/Core.cs +++ b/Terminal.Gui/Core.cs @@ -1087,6 +1087,11 @@ namespace Terminal.Gui { /// The for the event. /// public KeyEvent KeyEvent { get; set; } + /// + /// Indicates if the current Key event has already been processed and the driver should stop notifying any other event subscriber. + /// Its important to set this value to true specially when updating any View's layout from inside the subscriber method. + /// + public bool Handled { get; set; } = false; } /// @@ -1097,7 +1102,11 @@ namespace Terminal.Gui { /// public override bool ProcessKey (KeyEvent keyEvent) { - KeyPress?.Invoke (this, new KeyEventEventArgs(keyEvent)); + + KeyEventEventArgs args = new KeyEventEventArgs (keyEvent); + KeyPress?.Invoke (this, args); + if (args.Handled) + return true; if (Focused?.ProcessKey (keyEvent) == true) return true; @@ -1107,7 +1116,10 @@ namespace Terminal.Gui { /// public override bool ProcessHotKey (KeyEvent keyEvent) { - KeyPress?.Invoke (this, new KeyEventEventArgs (keyEvent)); + KeyEventEventArgs args = new KeyEventEventArgs (keyEvent); + KeyPress?.Invoke (this, args); + if (args.Handled) + return true; if (subviews == null || subviews.Count == 0) return false; foreach (var view in subviews) @@ -1119,7 +1131,10 @@ namespace Terminal.Gui { /// public override bool ProcessColdKey (KeyEvent keyEvent) { - KeyPress?.Invoke (this, new KeyEventEventArgs(keyEvent)); + KeyEventEventArgs args = new KeyEventEventArgs (keyEvent); + KeyPress?.Invoke (this, args); + if (args.Handled) + return true; if (subviews == null || subviews.Count == 0) return false; foreach (var view in subviews) @@ -1136,7 +1151,10 @@ namespace Terminal.Gui { /// Contains the details about the key that produced the event. public override bool OnKeyDown (KeyEvent keyEvent) { - KeyDown?.Invoke (this, new KeyEventEventArgs (keyEvent)); + KeyEventEventArgs args = new KeyEventEventArgs (keyEvent); + KeyDown?.Invoke (this, args); + if (args.Handled) + return true; if (subviews == null || subviews.Count == 0) return false; foreach (var view in subviews) @@ -1154,7 +1172,10 @@ namespace Terminal.Gui { /// Contains the details about the key that produced the event. public override bool OnKeyUp (KeyEvent keyEvent) { - KeyUp?.Invoke (this, new KeyEventEventArgs (keyEvent)); + KeyEventEventArgs args = new KeyEventEventArgs (keyEvent); + KeyUp?.Invoke (this, args); + if (args.Handled) + return true; if (subviews == null || subviews.Count == 0) return false; foreach (var view in subviews)