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)