diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandManager.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandManager.cs index f2bafbd9225..1f3792e0c06 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandManager.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Commands/CommandManager.cs @@ -97,6 +97,7 @@ enum JIS_VKS { #if MAC Foundation.NSObject keyMonitor; + Foundation.NSObject closeWindowMonitor; uint throttleLastEventTime = 0; #endif @@ -124,6 +125,12 @@ public CommandManager (Window root) ActionCommand c = new ActionCommand (CommandSystemCommands.ToolbarList, "Toolbar List", null, null, ActionType.Check); c.CommandArray = true; RegisterCommand (c); + + closeWindowMonitor = Foundation.NSNotificationCenter.DefaultCenter.AddObserver (AppKit.NSWindow.WillCloseNotification, (s) => { + if (topLevelWindows.Any (h => h.nativeWidget == s.Object)) { + TopLevelDestroyed (s.Object, EventArgs.Empty); + } + }); } /// @@ -869,13 +876,18 @@ void TopLevelDestroyed (object o, EventArgs args) { RegisterUserInteraction (); - Gtk.Window w = (Gtk.Window)o; - w.Destroyed -= TopLevelDestroyed; - w.KeyPressEvent -= OnKeyPressed; - w.KeyReleaseEvent -= OnKeyReleased; - w.ButtonPressEvent -= HandleButtonPressEvent; - topLevelWindows.Remove (w); + if (o is Gtk.Window w) { + w.Destroyed -= TopLevelDestroyed; + w.KeyPressEvent -= OnKeyPressed; + w.KeyReleaseEvent -= OnKeyReleased; + w.ButtonPressEvent -= HandleButtonPressEvent; + topLevelWindows.Remove (w); + } #if MAC + else if (o is AppKit.NSWindow nsWindow) { + topLevelWindows.Remove (nsWindow); + } + if (topLevelWindows.Count == 0) { if (keyMonitor != null) { AppKit.NSEvent.RemoveMonitor (keyMonitor); @@ -884,7 +896,7 @@ void TopLevelDestroyed (object o, EventArgs args) } #endif - if (w == lastFocused?.nativeWidget) + if (o == lastFocused?.nativeWidget) lastFocused = null; } @@ -898,6 +910,11 @@ public void Dispose () AppKit.NSEvent.RemoveMonitor (keyMonitor); keyMonitor = null; } + + if (closeWindowMonitor != null) { + AppKit.NSEvent.RemoveMonitor (closeWindowMonitor); + closeWindowMonitor = null; + } #endif if (bindings != null) { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/WindowCommands.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/WindowCommands.cs index 230a36b320c..24c46b9fbab 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/WindowCommands.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Commands/WindowCommands.cs @@ -253,26 +253,39 @@ internal class OpenWindowListHandler : CommandHandler protected override void Update (CommandArrayInfo info) { foreach (Components.Window window in IdeApp.CommandService.TopLevelWindowStack) { + + string title = null; + bool hasTopLevel = false; + + try { + title = window.Title; + hasTopLevel = window.HasTopLevelFocus; #if !WINDOWS - //we don't want include hidden windows - if (!window.IsRealized || !window.IsVisible || Components.Mac.GtkMacInterop.IsGdkQuartzWindow (window)) - continue; + //we don't want include hidden windows + if (!window.IsRealized || !window.IsVisible || Components.Mac.GtkMacInterop.IsGdkQuartzWindow (window)) + continue; #endif + } catch (System.Exception ex) { + LoggingService.LogInternalError (ex); + //we log the issue + continue; + } + //Create CommandInfo object var commandInfo = new CommandInfo (); - commandInfo.Text = window.Title.Replace ("_", "__").Replace ("-", "\u2013").Replace (" \u2013 " + BrandingService.ApplicationName, ""); + commandInfo.Text = title.Replace ("_", "__").Replace ("-", "\u2013").Replace (" \u2013 " + BrandingService.ApplicationName, ""); if (string.IsNullOrEmpty (commandInfo.Text)) { commandInfo.Text = GettextCatalog.GetString ("No description"); } - if (window.HasTopLevelFocus) + if (hasTopLevel) commandInfo.Checked = true; commandInfo.Description = GettextCatalog.GetString ("Activate window '{0}'", commandInfo.Text); //Add menu item - info.Add (commandInfo, window.Title); + info.Add (commandInfo, title); } }