From c12db102d99d5c312f1ea3cde59808725dc05764 Mon Sep 17 00:00:00 2001 From: Curtis Wensley Date: Mon, 9 Jan 2023 14:41:11 -0800 Subject: [PATCH] Mac: Non-activating forms with an owner should not show overtop existing windows --- src/Eto.Mac/Forms/FormHandler.cs | 9 +++++---- src/Eto.Mac/Forms/MacWindow.cs | 9 +++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Eto.Mac/Forms/FormHandler.cs b/src/Eto.Mac/Forms/FormHandler.cs index e70cdf5462..5cae5012b2 100644 --- a/src/Eto.Mac/Forms/FormHandler.cs +++ b/src/Eto.Mac/Forms/FormHandler.cs @@ -70,14 +70,15 @@ public virtual void Show() Control.MakeKeyWindow(); else Control.MakeKeyAndOrderFront(ApplicationHandler.Instance.AppDelegate); + + // setting the owner shows the window, so we have to do this after making the window key + EnsureOwner(); } - else + else if (!EnsureOwner()) { + // only order front when there is no owner as it'll bring the owner above any existing non-child windows Control.OrderFront(ApplicationHandler.Instance.AppDelegate); } - - // setting the owner shows the window, so we have to do this here. - EnsureOwner(); if (!visible) { diff --git a/src/Eto.Mac/Forms/MacWindow.cs b/src/Eto.Mac/Forms/MacWindow.cs index 7af5b9a51b..c61f331f84 100644 --- a/src/Eto.Mac/Forms/MacWindow.cs +++ b/src/Eto.Mac/Forms/MacWindow.cs @@ -1247,10 +1247,13 @@ public bool SetAsChildWindow set => Widget.Properties.Set(MacWindow.SetAsChildWindow_Key, value, DefaultSetAsChildWindow); } - protected void EnsureOwner() => SetOwner(Widget.Owner); + protected bool EnsureOwner() => InternalSetOwner(Widget.Owner); - public virtual void SetOwner(Window owner) + public virtual void SetOwner(Window owner) => InternalSetOwner(owner); + + bool InternalSetOwner(Window owner) { + bool result = false; if (SetAsChildWindow && Widget.Loaded) { if (owner != null) @@ -1260,6 +1263,7 @@ public virtual void SetOwner(Window owner) { macWindow.Control.AddChildWindow(Control, NSWindowOrderingMode.Above); OnSetAsChildWindow(); + result = true; } Widget.GotFocus += HandleGotFocusAsChild; } @@ -1271,6 +1275,7 @@ public virtual void SetOwner(Window owner) parentWindow.RemoveChildWindow(Control); } } + return result; } void HandleGotFocusAsChild(object sender, EventArgs e)