diff --git a/Terminal.Gui/Application.cs b/Terminal.Gui/Application.cs index 718bb3868..a3883a3a3 100644 --- a/Terminal.Gui/Application.cs +++ b/Terminal.Gui/Application.cs @@ -491,7 +491,11 @@ public static partial class Application { if (Toplevel.Visible) { + Current?.OnDeactivate (Toplevel); + var previousCurrent = Current; Current = Toplevel; + Current.OnActivate (previousCurrent); + SetCurrentOverlappedAsTop (); } else diff --git a/Terminal.Gui/Views/Menu/ContextMenu.cs b/Terminal.Gui/Views/Menu/ContextMenu.cs index f9ee4625f..ae080a298 100644 --- a/Terminal.Gui/Views/Menu/ContextMenu.cs +++ b/Terminal.Gui/Views/Menu/ContextMenu.cs @@ -116,6 +116,7 @@ public sealed class ContextMenu : IDisposable if (_container is { }) { _container.Closing -= Container_Closing; + _container.Deactivate -= Container_Deactivate; } } @@ -142,6 +143,7 @@ public sealed class ContextMenu : IDisposable _container = Application.Current; _container.Closing += Container_Closing; + _container.Deactivate += Container_Deactivate; Rectangle frame = Application.Driver.Bounds; Point position = Position; @@ -217,6 +219,7 @@ public sealed class ContextMenu : IDisposable _menuBar.OpenMenu (); } + private void Container_Deactivate (object sender, ToplevelEventArgs e) { Hide (); } private void Container_Closing (object sender, ToplevelClosingEventArgs obj) { Hide (); } private void MenuBar_MenuAllClosed (object sender, EventArgs e) { Dispose (); } } diff --git a/UnitTests/Views/ContextMenuTests.cs b/UnitTests/Views/ContextMenuTests.cs index c4f34a11e..c7c43bc05 100644 --- a/UnitTests/Views/ContextMenuTests.cs +++ b/UnitTests/Views/ContextMenuTests.cs @@ -938,7 +938,7 @@ public class ContextMenuTests public void RequestStop_While_ContextMenu_Is_Open_Does_Not_Throws () { ContextMenu cm = Create_ContextMenu_With_Two_MenuItem (10, 5); - Toplevel top = Application.Top; + Toplevel top = new (); var isMenuAllClosed = false; MenuBarItem mi = null; int iterations = -1; @@ -957,6 +957,7 @@ public class ContextMenuTests { var dialog1 = new Dialog (); Application.Run (dialog1); + dialog1.Dispose (); Assert.False (ContextMenu.IsShow); Assert.True (isMenuAllClosed); }; @@ -994,12 +995,13 @@ public class ContextMenuTests { var dialog2 = new Dialog (); Application.Run (dialog2); + dialog2.Dispose (); Assert.False (ContextMenu.IsShow); Assert.True (isMenuAllClosed); isTopClosed = true; }; - Application.Run (); + Application.Run (top); Assert.True (isTopClosed); Assert.False (ContextMenu.IsShow);