From e5d6dd701bd3d9b1049538981908a64b912546ff Mon Sep 17 00:00:00 2001 From: BDisp Date: Mon, 3 Mar 2025 01:40:05 +0000 Subject: [PATCH 1/2] Fixes #3950. KeyDown and MouseEvent no longer fires for Listbox --- Terminal.Gui/View/View.Keyboard.cs | 34 ++++++------- Terminal.Gui/View/View.Mouse.cs | 10 ++-- UnitTests/View/Keyboard/KeyboardEventTests.cs | 48 +++++++++++++++---- 3 files changed, 62 insertions(+), 30 deletions(-) diff --git a/Terminal.Gui/View/View.Keyboard.cs b/Terminal.Gui/View/View.Keyboard.cs index cc21f6203c..94daf05121 100644 --- a/Terminal.Gui/View/View.Keyboard.cs +++ b/Terminal.Gui/View/View.Keyboard.cs @@ -319,28 +319,30 @@ public bool NewKeyDownEvent (Key key) bool RaiseKeyDown (Key k) { - // Before (fire the cancellable event) - if (OnKeyDown (k) || k.Handled) + // First fire event + KeyDown?.Invoke (this, k); + + if (k.Handled) { return true; } - // fire event - KeyDown?.Invoke (this, k); - - return k.Handled; + // After (fire the cancellable event) + return OnKeyDown (k); } bool RaiseKeyDownNotHandled (Key k) { - if (OnKeyDownNotHandled (k) || k.Handled) + // First fire event + KeyDownNotHandled?.Invoke (this, k); + + if (k.Handled) { return true; } - KeyDownNotHandled?.Invoke (this, k); - - return false; + // After (fire the cancellable event) + return OnKeyDownNotHandled (k); } } @@ -453,16 +455,16 @@ public bool NewKeyUpEvent (Key key) bool RaiseKeyUp (Key k) { - // Before (fire the cancellable event) - if (OnKeyUp (k) || k.Handled) + // First fire event + KeyUp?.Invoke (this, k); + + if (k.Handled) { return true; } - // fire event - KeyUp?.Invoke (this, k); - - return k.Handled; + // After (fire the cancellable event) + return OnKeyUp (k); } } diff --git a/Terminal.Gui/View/View.Mouse.cs b/Terminal.Gui/View/View.Mouse.cs index 691c10d8a8..d6f078ce35 100644 --- a/Terminal.Gui/View/View.Mouse.cs +++ b/Terminal.Gui/View/View.Mouse.cs @@ -335,14 +335,16 @@ protected virtual void OnMouseLeave () { } /// , if the event was handled, otherwise. public bool RaiseMouseEvent (MouseEventArgs mouseEvent) { - if (OnMouseEvent (mouseEvent) || mouseEvent.Handled) + // First fire event + MouseEvent?.Invoke (this, mouseEvent); + + if (mouseEvent.Handled) { return true; } - MouseEvent?.Invoke (this, mouseEvent); - - return mouseEvent.Handled; + // After (fire the cancellable event) + return OnMouseEvent (mouseEvent); } /// Called when a mouse event occurs within the view's . diff --git a/UnitTests/View/Keyboard/KeyboardEventTests.cs b/UnitTests/View/Keyboard/KeyboardEventTests.cs index 7cbbcaa8fa..562856aecb 100644 --- a/UnitTests/View/Keyboard/KeyboardEventTests.cs +++ b/UnitTests/View/Keyboard/KeyboardEventTests.cs @@ -102,7 +102,7 @@ public void NewKeyDownUpEvents_Events_Are_Raised_With_Only_Key_Modifiers (bool s Assert.Equal (alt, e.IsAlt); Assert.Equal (control, e.IsCtrl); Assert.False (keyDown); - Assert.True (view.OnKeyDownCalled); + Assert.False (view.OnKeyDownCalled); keyDown = true; }; view.KeyDownNotHandled += (s, e) => { keyDownNotHandled = true; }; @@ -114,7 +114,7 @@ public void NewKeyDownUpEvents_Events_Are_Raised_With_Only_Key_Modifiers (bool s Assert.Equal (alt, e.IsAlt); Assert.Equal (control, e.IsCtrl); Assert.False (keyUp); - Assert.True (view.OnKeyUpCalled); + Assert.False (view.OnKeyUpCalled); keyUp = true; }; @@ -147,6 +147,7 @@ public void NewKeyDownEvent_Handled_True_Stops_Processing () { var keyDown = false; var keyDownNotHandled = false; + var keyHandled = false; var view = new OnNewKeyTestView (); Assert.True (view.CanFocus); @@ -156,8 +157,8 @@ public void NewKeyDownEvent_Handled_True_Stops_Processing () { Assert.Equal (KeyCode.A, e.KeyCode); Assert.False (keyDown); - Assert.True (view.OnKeyDownCalled); - e.Handled = true; + Assert.False (view.OnKeyDownCalled); + e.Handled = keyHandled; keyDown = true; }; @@ -167,15 +168,29 @@ public void NewKeyDownEvent_Handled_True_Stops_Processing () Assert.Equal (KeyCode.A, e.KeyCode); Assert.False (keyDownNotHandled); Assert.False (view.OnProcessKeyDownCalled); - e.Handled = true; + e.Handled = keyHandled; keyDownNotHandled = true; }; view.NewKeyDownEvent (Key.A); Assert.True (keyDown); - Assert.False (keyDownNotHandled); + Assert.True (keyDownNotHandled); Assert.True (view.OnKeyDownCalled); + Assert.True (view.OnProcessKeyDownCalled); + + keyDown = false; + keyDownNotHandled = false; + keyHandled = true; + view.CancelVirtualMethods = true; + view.OnKeyDownCalled = false; + view.OnProcessKeyDownCalled = false; + + view.NewKeyDownEvent (Key.A); + Assert.True (keyDown); + Assert.False (keyDownNotHandled); + + Assert.False (view.OnKeyDownCalled); Assert.False (view.OnProcessKeyDownCalled); } @@ -223,7 +238,7 @@ public void NewKeyDownEvent_ProcessKeyDown_Handled_Stops_Processing () { Assert.Equal (KeyCode.A, e.KeyCode); Assert.False (keyDown); - Assert.True (view.OnKeyDownCalled); + Assert.False (view.OnKeyDownCalled); e.Handled = false; keyDown = true; }; @@ -232,7 +247,7 @@ public void NewKeyDownEvent_ProcessKeyDown_Handled_Stops_Processing () { Assert.Equal (KeyCode.A, e.KeyCode); Assert.False (keyDownNotHandled); - Assert.True (view.OnProcessKeyDownCalled); + Assert.False (view.OnProcessKeyDownCalled); e.Handled = true; keyDownNotHandled = true; }; @@ -242,13 +257,14 @@ public void NewKeyDownEvent_ProcessKeyDown_Handled_Stops_Processing () Assert.True (keyDownNotHandled); Assert.True (view.OnKeyDownCalled); - Assert.True (view.OnProcessKeyDownCalled); + Assert.False (view.OnProcessKeyDownCalled); } [Fact] public void NewKeyUpEvent_KeyUp_Handled_True_Stops_Processing () { var keyUp = false; + var keyHandled = false; var view = new OnNewKeyTestView (); Assert.True (view.CanFocus); @@ -259,7 +275,7 @@ public void NewKeyUpEvent_KeyUp_Handled_True_Stops_Processing () Assert.Equal (KeyCode.A, e.KeyCode); Assert.False (keyUp); Assert.False (view.OnProcessKeyDownCalled); - e.Handled = true; + e.Handled = keyHandled; keyUp = true; }; @@ -269,6 +285,18 @@ public void NewKeyUpEvent_KeyUp_Handled_True_Stops_Processing () Assert.True (view.OnKeyUpCalled); Assert.False (view.OnKeyDownCalled); Assert.False (view.OnProcessKeyDownCalled); + + keyUp = false; + keyHandled = true; + view.CancelVirtualMethods = true; + view.OnKeyUpCalled = false; + + view.NewKeyUpEvent (Key.A); + Assert.True (keyUp); + + Assert.False (view.OnKeyUpCalled); + Assert.False (view.OnKeyDownCalled); + Assert.False (view.OnProcessKeyDownCalled); } [Theory] From a87eebbaa3883451604243f050ff21257a244bce Mon Sep 17 00:00:00 2001 From: BDisp Date: Mon, 3 Mar 2025 01:50:26 +0000 Subject: [PATCH 2/2] Fixes #3956. MessageBox doesn't return the index of IsDefault button --- Terminal.Gui/Views/MessageBox.cs | 4 ++++ UnitTests/Dialogs/MessageBoxTests.cs | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/Terminal.Gui/Views/MessageBox.cs b/Terminal.Gui/Views/MessageBox.cs index cd14dfc4fa..31b4a41ec2 100644 --- a/Terminal.Gui/Views/MessageBox.cs +++ b/Terminal.Gui/Views/MessageBox.cs @@ -374,6 +374,10 @@ params string [] buttons { Clicked = (int)btn.Data!; } + else + { + Clicked = defaultButton; + } e.Cancel = true; Application.RequestStop (); diff --git a/UnitTests/Dialogs/MessageBoxTests.cs b/UnitTests/Dialogs/MessageBoxTests.cs index b163d154f7..e01a8db720 100644 --- a/UnitTests/Dialogs/MessageBoxTests.cs +++ b/UnitTests/Dialogs/MessageBoxTests.cs @@ -502,5 +502,19 @@ public void UICatalog_AboutBox () Application.Run (top); top.Dispose (); } + + [Fact] + [SetupFakeDriver] + public void Button_IsDefault_True_Return_His_Index_On_Accepting () + { + Application.Init (); + + Application.Iteration += (_, _) => Assert.True (Application.RaiseKeyDownEvent (Key.Enter)); + var res = MessageBox.Query ("hey", "IsDefault", "Yes", "No"); + + Assert.Equal (0, res); + + Application.Shutdown (); + } }