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)
diff --git a/Terminal.Gui/Views/Menu.cs b/Terminal.Gui/Views/Menu.cs
index da16a08ef..5f25cb797 100644
--- a/Terminal.Gui/Views/Menu.cs
+++ b/Terminal.Gui/Views/Menu.cs
@@ -784,7 +784,7 @@ namespace Terminal.Gui {
///
/// Closes the current Menu programatically, if open.
///
- public void CloseMenu()
+ public void CloseMenu ()
{
CloseMenu (false, false);
}