diff --git a/Core.cs b/Core.cs
index 82e3246cd..43ce879e6 100644
--- a/Core.cs
+++ b/Core.cs
@@ -561,6 +561,9 @@ namespace Terminal {
/// true, if previous was focused, false otherwise.
public bool FocusPrev ()
{
+ if (subviews == null || subviews.Count == 0)
+ return false;
+
if (focused == null) {
FocusLast ();
return true;
@@ -586,6 +589,10 @@ namespace Terminal {
return true;
}
}
+ if (focused_idx != -1) {
+ FocusLast ();
+ return true;
+ }
if (focused != null) {
focused.HasFocus = false;
@@ -666,16 +673,9 @@ namespace Terminal {
public override bool ProcessKey (KeyEvent kb)
{
- if (ProcessHotKey (kb))
- return true;
-
if (base.ProcessKey (kb))
return true;
- // Process the key normally
- if (ProcessColdKey (kb))
- return true;
-
switch (kb.Key) {
case Key.ControlC:
// TODO: stop current execution of this container
@@ -694,7 +694,7 @@ namespace Terminal {
}
return true;
case Key.BackTab:
- old = Focused;
+ old = Focused;
if (!FocusPrev ())
FocusPrev ();
if (old != Focused) {
@@ -875,10 +875,20 @@ namespace Terminal {
}
}
- static void KeyEvent (Key key)
+ static void ProcessKeyEvent (KeyEvent ke)
{
+ if (Top.ProcessHotKey (ke))
+ return;
+
+ if (Top.ProcessKey (ke))
+ return;
+
+ // Process the key normally
+ if (Top.ProcessColdKey (ke))
+ return;
}
+
static public RunState Begin (Toplevel toplevel)
{
if (toplevel == null)
@@ -887,7 +897,7 @@ namespace Terminal {
Init ();
toplevels.Push (toplevel);
- Driver.PrepareToRun (MainLoop, toplevel);
+ Driver.PrepareToRun (MainLoop, ProcessKeyEvent);
toplevel.LayoutSubviews ();
toplevel.FocusFirst ();
Redraw (toplevel);
diff --git a/Driver.cs b/Driver.cs
index 7f6e27c15..f8f707f2d 100644
--- a/Driver.cs
+++ b/Driver.cs
@@ -78,7 +78,7 @@ namespace Terminal {
public abstract void Move (int col, int row);
public abstract void AddCh (int ch);
public abstract void AddStr (string str);
- public abstract void PrepareToRun (MainLoop mainLoop, Responder target);
+ public abstract void PrepareToRun (MainLoop mainLoop, Action target);
public abstract void Refresh ();
public abstract void End ();
public abstract void RedrawTop ();
@@ -223,7 +223,7 @@ namespace Terminal {
}
}
- void ProcessInput (Responder handler)
+ void ProcessInput (Action keyHandler)
{
int wch;
var code = Curses.get_wch (out wch);
@@ -241,7 +241,7 @@ namespace Terminal {
// handler.HandleMouse ();
return;
}
- handler.ProcessKey (new KeyEvent (MapCursesKey (wch)));
+ keyHandler (new KeyEvent (MapCursesKey (wch)));
return;
}
@@ -251,7 +251,7 @@ namespace Terminal {
code = Curses.get_wch (out wch);
if (code == Curses.KEY_CODE_YES)
- handler.ProcessKey (new KeyEvent (Key.AltMask | MapCursesKey (wch)));
+ keyHandler (new KeyEvent (Key.AltMask | MapCursesKey (wch)));
if (code == 0) {
KeyEvent key;
@@ -264,19 +264,19 @@ namespace Terminal {
key = new KeyEvent ((Key)wch);
else
key = new KeyEvent (Key.AltMask | (Key)wch);
- handler.ProcessKey (key);
+ keyHandler (key);
} else
- handler.ProcessKey (new KeyEvent (Key.Esc));
+ keyHandler (new KeyEvent (Key.Esc));
} else
- handler.ProcessKey (new KeyEvent ((Key)wch));
+ keyHandler (new KeyEvent ((Key)wch));
}
- public override void PrepareToRun (MainLoop mainLoop, Responder handler)
+ public override void PrepareToRun (MainLoop mainLoop, Action keyHandler)
{
Curses.timeout (-1);
mainLoop.AddWatch (0, Mono.Terminal.MainLoop.Condition.PollIn, x => {
- ProcessInput (handler);
+ ProcessInput (keyHandler);
return true;
});
diff --git a/Views/Menu.cs b/Views/Menu.cs
index 7a3514c40..57f9fe9c3 100644
--- a/Views/Menu.cs
+++ b/Views/Menu.cs
@@ -190,7 +190,7 @@ namespace Terminal {
}
break;
}
- return true;
+ return false;
}
}
diff --git a/demo.cs b/demo.cs
index 8dd460ca0..136b764ee 100644
--- a/demo.cs
+++ b/demo.cs
@@ -33,7 +33,7 @@ class Demo {
var win = new Window (new Rect (0, 1, tframe.Width, tframe.Height-1), "Hello");
var menu = new MenuBar (new MenuBarItem [] {
new MenuBarItem ("_File", new MenuItem [] {
- new MenuItem ("_New", "Creates new file", () => System.Console.WriteLine ("foo")),
+ new MenuItem ("_New", "Creates new file", null),
new MenuItem ("_Open", "", null),
new MenuItem ("_Close", "", null),
new MenuItem ("_Quit", "", null)