diff options
author | Vsevolod Kukol <sevoku@microsoft.com> | 2019-04-24 12:10:49 +0300 |
---|---|---|
committer | Vsevolod Kukol <sevoku@microsoft.com> | 2019-04-24 13:25:02 +0300 |
commit | 88f9406685b4d792a8e31d89645cf4e635e2a138 (patch) | |
tree | edce4ce5e353a4538320a0d58f351f328498d01e | |
parent | 4f7f44f99735e9d03644f7ec8b8061858b0b742e (diff) |
[Mac] Fix Alert Dialog crash on startup
If a crash occurs during startup, the alert dialog
might fail and crash if no other window is shown
yet. The crash can be avoided by falling back to the
main IDE window only if it's realized and visible and
running app-modal otherwise.
Additionally avoid crashing in GetParentForModalWindow
and log more details about disposed and resurrected
root windows.
Fixes VSTS #849568
-rw-r--r-- | main/src/addins/MacPlatform/Dialogs/MacAlertDialogHandler.cs | 6 | ||||
-rw-r--r-- | main/src/addins/MacPlatform/MacPlatform.cs | 23 |
2 files changed, 26 insertions, 3 deletions
diff --git a/main/src/addins/MacPlatform/Dialogs/MacAlertDialogHandler.cs b/main/src/addins/MacPlatform/Dialogs/MacAlertDialogHandler.cs index fee1dc7dce..8112ef22f4 100644 --- a/main/src/addins/MacPlatform/Dialogs/MacAlertDialogHandler.cs +++ b/main/src/addins/MacPlatform/Dialogs/MacAlertDialogHandler.cs @@ -1,4 +1,4 @@ -// +// // MacAlertFileDialogHandler.cs // // Author: @@ -182,7 +182,9 @@ namespace MonoDevelop.MacIntegration int response = -1000; - var parent = data.TransientFor ?? IdeApp.Workbench.RootWindow; + var parent = data.TransientFor; + if (parent == null && IdeApp.Workbench?.RootWindow?.Visible == true) + parent = IdeApp.Workbench?.RootWindow; NSWindow nativeParent; try { nativeParent = parent; diff --git a/main/src/addins/MacPlatform/MacPlatform.cs b/main/src/addins/MacPlatform/MacPlatform.cs index 97a8063b12..10672960c5 100644 --- a/main/src/addins/MacPlatform/MacPlatform.cs +++ b/main/src/addins/MacPlatform/MacPlatform.cs @@ -993,7 +993,28 @@ namespace MonoDevelop.MacIntegration public override Window GetParentForModalWindow () { - return NSApplication.SharedApplication.ModalWindow ?? NSApplication.SharedApplication.KeyWindow ?? NSApplication.SharedApplication.MainWindow; + try { + var window = NSApplication.SharedApplication.ModalWindow; + if (window != null) + return window; + } catch (Exception e) { + LoggingService.LogInternalError ("Getting SharedApplication.ModalWindow failed", e); + } + try { + var window = NSApplication.SharedApplication.KeyWindow; + if (window != null) + return window; + } catch (Exception e) { + LoggingService.LogInternalError ("Getting SharedApplication.KeyWindow failed", e); + } + try { + var window = NSApplication.SharedApplication.MainWindow; + if (window != null) + return window; + } catch (Exception e) { + LoggingService.LogInternalError ("Getting SharedApplication.MainWindow failed", e); + } + return null; } bool HasAnyDockWindowFocused () |