From ce30a837642cc72aef6433e9322a6c4970c13028 Mon Sep 17 00:00:00 2001 From: BDisp Date: Tue, 2 Jun 2020 19:41:12 +0100 Subject: [PATCH 1/4] Ensures that only the current top to execute keys. --- Terminal.Gui/Core/View.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Terminal.Gui/Core/View.cs b/Terminal.Gui/Core/View.cs index b426a9a06..3d20d64dc 100644 --- a/Terminal.Gui/Core/View.cs +++ b/Terminal.Gui/Core/View.cs @@ -989,7 +989,7 @@ namespace Terminal.Gui { if (subviews == null || subviews.Count == 0) return false; foreach (var view in subviews) - if (view.ProcessHotKey (keyEvent)) + if (view.SuperView.IsCurrentTop && view.ProcessHotKey (keyEvent)) return true; return false; } @@ -1004,7 +1004,7 @@ namespace Terminal.Gui { if (subviews == null || subviews.Count == 0) return false; foreach (var view in subviews) - if (view.ProcessColdKey (keyEvent)) + if (view.SuperView.IsCurrentTop && view.ProcessColdKey (keyEvent)) return true; return false; } @@ -1024,7 +1024,7 @@ namespace Terminal.Gui { if (subviews == null || subviews.Count == 0) return false; foreach (var view in subviews) - if (view.OnKeyDown (keyEvent)) + if (view.SuperView.IsCurrentTop && view.OnKeyDown (keyEvent)) return true; return false; @@ -1045,7 +1045,7 @@ namespace Terminal.Gui { if (subviews == null || subviews.Count == 0) return false; foreach (var view in subviews) - if (view.OnKeyUp (keyEvent)) + if (view.SuperView.IsCurrentTop && view.OnKeyUp (keyEvent)) return true; return false; From f4fba4282371a80447de26b91c5a8c1b59176f51 Mon Sep 17 00:00:00 2001 From: BDisp Date: Tue, 2 Jun 2020 19:48:45 +0100 Subject: [PATCH 2/4] Improvements the mouse and keys of the MenuBar. --- Terminal.Gui/Views/Menu.cs | 71 ++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/Terminal.Gui/Views/Menu.cs b/Terminal.Gui/Views/Menu.cs index 5f25cb797..522121f2e 100644 --- a/Terminal.Gui/Views/Menu.cs +++ b/Terminal.Gui/Views/Menu.cs @@ -573,25 +573,15 @@ namespace Terminal.Gui { /// public override bool OnKeyDown (KeyEvent keyEvent) - { - if (keyEvent.IsAlt) { - openedByAltKey = true; - SetNeedsDisplay (); - openedByHotKey = false; - } - return false; - } - - /// - public override bool OnKeyUp (KeyEvent keyEvent) { if (keyEvent.IsAlt) { // User pressed Alt - this may be a precursor to a menu accelerator (e.g. Alt-F) - if (!keyEvent.IsCtrl && openedByAltKey && !IsMenuOpen && openMenu == null && ((uint)keyEvent.Key & (uint)Key.CharMask) == 0) { + if (!keyEvent.IsCtrl && !openedByAltKey && !IsMenuOpen && openMenu == null && ((uint)keyEvent.Key & (uint)Key.CharMask) == 0) { // There's no open menu, the first menu item should be highlight. // The right way to do this is to SetFocus(MenuBar), but for some reason // that faults. + openedByAltKey = true; //Activate (0); //StartMenu (); IsMenuOpen = true; @@ -601,7 +591,7 @@ namespace Terminal.Gui { SuperView.SetFocus (this); SetNeedsDisplay (); Application.GrabMouse (this); - } else if (!openedByHotKey) { + } else if (IsMenuOpen && !openedByAltKey) { // There's an open menu. If this Alt key-up is a pre-cursor to an accelerator // we don't want to close the menu because it'll flash. // How to deal with that? @@ -623,6 +613,16 @@ namespace Terminal.Gui { return false; } + /// + public override bool OnKeyUp (KeyEvent keyEvent) + { + if (keyEvent.IsAlt) { + openedByAltKey = false; + SetNeedsDisplay (); + } + return false; + } + /// public override void Redraw (Rect region) { @@ -788,6 +788,7 @@ namespace Terminal.Gui { { CloseMenu (false, false); } + internal void CloseMenu (bool reopen = false, bool isSubMenu = false) { isMenuClosing = true; @@ -815,6 +816,7 @@ namespace Terminal.Gui { IsMenuOpen = false; PositionCursor (); } + IsMenuOpen = false; break; case true: @@ -823,10 +825,10 @@ namespace Terminal.Gui { RemoveAllOpensSubMenus (); openCurrentMenu.previousSubFocused?.SuperView?.SetFocus (openCurrentMenu.previousSubFocused); openSubMenu = null; + IsMenuOpen = true; break; } isMenuClosing = false; - IsMenuOpen = false; } void RemoveSubMenu (int index) @@ -1087,31 +1089,26 @@ namespace Terminal.Gui { } handled = false; - if (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1Clicked || me.Flags == MouseFlags.Button1DoubleClicked || + if (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked || me.Flags == MouseFlags.Button1Clicked || (me.Flags == MouseFlags.ReportMousePosition && selected > -1) || (me.Flags.HasFlag (MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition) && selected > -1)) { int pos = 1; int cx = me.X; for (int i = 0; i < Menus.Length; i++) { if (cx > pos && me.X < pos + 1 + Menus [i].TitleLength) { - if (selected == i && (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) && - IsMenuOpen) { - Application.UngrabMouse (); + if (me.Flags == MouseFlags.Button1Clicked) { if (Menus [i].IsTopLevel) { var menu = new Menu (this, i, 0, Menus [i]); menu.Run (Menus [i].Action); - } else { - CloseMenu (); } - } else if ((me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) && - !IsMenuOpen) { - if (Menus [i].IsTopLevel) { - var menu = new Menu (this, i, 0, Menus [i]); - menu.Run (Menus [i].Action); + } else if (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) { + if (IsMenuOpen) { + CloseAllMenus (); } else { Activate (i); } - } else if (selected != i && selected > -1 && me.Flags == MouseFlags.ReportMousePosition) { + } else if (selected != i && selected > -1 && (me.Flags == MouseFlags.ReportMousePosition || + me.Flags == MouseFlags.Button1Pressed && me.Flags == MouseFlags.ReportMousePosition)) { if (IsMenuOpen) { CloseMenu (); Activate (i); @@ -1140,7 +1137,7 @@ namespace Terminal.Gui { me.View.MouseEvent (me); } } else if (!(me.View is MenuBar || me.View is Menu) && (me.Flags.HasFlag (MouseFlags.Button1Clicked) || - me.Flags == MouseFlags.Button1DoubleClicked || me.Flags == MouseFlags.Button1Pressed)) { + me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked)) { Application.UngrabMouse (); CloseAllMenus (); handled = false; @@ -1149,24 +1146,25 @@ namespace Terminal.Gui { handled = false; return false; } - } else if (!IsMenuOpen && (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked || - me.Flags.HasFlag (MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition))) { + } else if (!IsMenuOpen && (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked || me.Flags.HasFlag (MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition))) { Application.GrabMouse (current); - } else { + } else if (IsMenuOpen && (me.View is MenuBar || me.View is Menu)) { + Application.GrabMouse (me.View); + } + else { handled = false; return false; } - //if (me.View != this && (me.Flags != MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked)) + //if (me.View != this && me.Flags != MouseFlags.Button1Pressed) // return true; - //else if (me.View != this && (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked)) { + //else if (me.View != this && me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) { // Application.UngrabMouse (); // host.CloseAllMenus (); // return true; //} - //if (!(me.View is MenuBar) && !(me.View is Menu) && (me.Flags != MouseFlags.Button1Pressed || - // me.Flags != MouseFlags.Button1DoubleClicked)) + //if (!(me.View is MenuBar) && !(me.View is Menu) && me.Flags != MouseFlags.Button1Pressed)) // return false; //if (Application.mouseGrabView != null) { @@ -1175,12 +1173,11 @@ namespace Terminal.Gui { // me.Y -= me.OfY; // me.View.MouseEvent (me); // return true; - // } else if (!(me.View is MenuBar || me.View is Menu) && (me.Flags == MouseFlags.Button1Pressed || - // me.Flags == MouseFlags.Button1DoubleClicked)) { + // } else if (!(me.View is MenuBar || me.View is Menu) && me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) { // Application.UngrabMouse (); // CloseAllMenus (); // } - //} else if (!isMenuClosed && selected == -1 && (me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked)) { + //} else if (!isMenuClosed && selected == -1 && me.Flags == MouseFlags.Button1Pressed || me.Flags == MouseFlags.Button1DoubleClicked) { // Application.GrabMouse (this); // return true; //} From ae126b48d585c76e583060e85e444a7577af88e4 Mon Sep 17 00:00:00 2001 From: BDisp Date: Wed, 3 Jun 2020 14:37:28 +0100 Subject: [PATCH 3/4] Reverting this because it interfere with the Alt+Tab when switching through windows. --- Terminal.Gui/Views/Menu.cs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Terminal.Gui/Views/Menu.cs b/Terminal.Gui/Views/Menu.cs index 522121f2e..82c737515 100644 --- a/Terminal.Gui/Views/Menu.cs +++ b/Terminal.Gui/Views/Menu.cs @@ -573,15 +573,25 @@ namespace Terminal.Gui { /// public override bool OnKeyDown (KeyEvent keyEvent) + { + if (keyEvent.IsAlt) { + openedByAltKey = true; + SetNeedsDisplay (); + openedByHotKey = false; + } + return false; + } + + /// + public override bool OnKeyUp (KeyEvent keyEvent) { if (keyEvent.IsAlt) { // User pressed Alt - this may be a precursor to a menu accelerator (e.g. Alt-F) - if (!keyEvent.IsCtrl && !openedByAltKey && !IsMenuOpen && openMenu == null && ((uint)keyEvent.Key & (uint)Key.CharMask) == 0) { + if (!keyEvent.IsCtrl && openedByAltKey && !IsMenuOpen && openMenu == null && ((uint)keyEvent.Key & (uint)Key.CharMask) == 0) { // There's no open menu, the first menu item should be highlight. // The right way to do this is to SetFocus(MenuBar), but for some reason // that faults. - openedByAltKey = true; //Activate (0); //StartMenu (); IsMenuOpen = true; @@ -591,7 +601,7 @@ namespace Terminal.Gui { SuperView.SetFocus (this); SetNeedsDisplay (); Application.GrabMouse (this); - } else if (IsMenuOpen && !openedByAltKey) { + } else if (!openedByHotKey) { // There's an open menu. If this Alt key-up is a pre-cursor to an accelerator // we don't want to close the menu because it'll flash. // How to deal with that? @@ -613,16 +623,6 @@ namespace Terminal.Gui { return false; } - /// - public override bool OnKeyUp (KeyEvent keyEvent) - { - if (keyEvent.IsAlt) { - openedByAltKey = false; - SetNeedsDisplay (); - } - return false; - } - /// public override void Redraw (Rect region) { From afae8b8f853c4c8523fc371c3586f76f272015f7 Mon Sep 17 00:00:00 2001 From: BDisp Date: Wed, 3 Jun 2020 23:21:44 +0100 Subject: [PATCH 4/4] Requested changes made. --- Terminal.Gui/ConsoleDrivers/WindowsDriver.cs | 9 +++++---- Terminal.Gui/Core/Application.cs | 3 ++- Terminal.Gui/Views/Menu.cs | 2 -- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs b/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs index 016da4112..d8049817a 100644 --- a/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs +++ b/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs @@ -695,8 +695,9 @@ namespace Terminal.Gui { keyUpHandler (new KeyEvent (map, keyModifiers)); } } - if (!inputEvent.KeyEvent.bKeyDown) + if (!inputEvent.KeyEvent.bKeyDown) { keyModifiers = null; + } break; case WindowsConsole.EventType.Mouse: @@ -879,7 +880,7 @@ namespace Terminal.Gui { }; } - private async Task ProcessButtonDoubleClickedAsync () + async Task ProcessButtonDoubleClickedAsync () { await Task.Delay (200); IsButtonDoubleClicked = false; @@ -896,11 +897,11 @@ namespace Terminal.Gui { }; var view = Application.wantContinuousButtonPressedView; - if (view == null) + if (view == null) { break; + } if (IsButtonPressed && (mouseFlag & MouseFlags.ReportMousePosition) == 0) { mouseHandler (me); - //mainLoop.Driver.Wakeup (); } } } diff --git a/Terminal.Gui/Core/Application.cs b/Terminal.Gui/Core/Application.cs index 53bfb3ae5..ccd9d9f92 100644 --- a/Terminal.Gui/Core/Application.cs +++ b/Terminal.Gui/Core/Application.cs @@ -351,8 +351,9 @@ namespace Terminal.Gui { OfY = me.Y - newxy.Y, View = view }; - if (OutsideFrame (new Point (nme.X, nme.Y), mouseGrabView.Frame)) + if (OutsideFrame (new Point (nme.X, nme.Y), mouseGrabView.Frame)) { lastMouseOwnerView?.OnMouseLeave (me); + } if (mouseGrabView != null) { mouseGrabView.OnMouseEvent (nme); return; diff --git a/Terminal.Gui/Views/Menu.cs b/Terminal.Gui/Views/Menu.cs index 82c737515..4477d9f1a 100644 --- a/Terminal.Gui/Views/Menu.cs +++ b/Terminal.Gui/Views/Menu.cs @@ -810,10 +810,8 @@ namespace Terminal.Gui { if (!reopen) selected = -1; LastFocused.SuperView?.SetFocus (LastFocused); - IsMenuOpen = false; } else { SuperView.SetFocus (this); - IsMenuOpen = false; PositionCursor (); } IsMenuOpen = false;