Browse Source

Make sure Popups do not attempt to take focus when they are shown (#16365)

Co-authored-by: Max Katz <maxkatz6@outlook.com>
pull/16393/head
Benedikt Stebner 2 years ago
committed by GitHub
parent
commit
4b494d9edb
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 17
      native/Avalonia.Native/src/OSX/AvnView.mm
  2. 28
      src/Avalonia.Native/PopupImpl.cs
  3. 2
      src/Avalonia.Native/TopLevelImpl.cs
  4. 19
      src/Windows/Avalonia.Win32/PopupImpl.cs

17
native/Avalonia.Native/src/OSX/AvnView.mm

@ -297,7 +297,22 @@
)
)
)
[self becomeFirstResponder];
{
WindowBaseImpl* windowBase = dynamic_cast<WindowBaseImpl*>(_parent.getRaw());
if(windowBase != nullptr){
WindowBaseImpl* parent = windowBase->Parent;
if(parent != nullptr){
auto parentWindow = parent->Window;
[parentWindow makeFirstResponder:parent->View];
}
} else{
[self becomeFirstResponder];
}
}
if(_parent != nullptr)
{

28
src/Avalonia.Native/PopupImpl.cs

@ -8,8 +8,6 @@ namespace Avalonia.Native
class PopupImpl : WindowBaseImpl, IPopupImpl
{
private readonly ITopLevelImpl _parent;
private readonly IAvnPopup _native;
private readonly AvaloniaNativeTextInputMethod _inputMethod;
public PopupImpl(IAvaloniaNativeFactory factory,
ITopLevelImpl parent) : base(factory)
@ -18,7 +16,7 @@ namespace Avalonia.Native
using (var e = new PopupEvents(this))
{
Init(new MacOSTopLevelHandle(_native = factory.CreatePopup(e)));
Init(new MacOSTopLevelHandle(factory.CreatePopup(e)));
}
PopupPositioner = new ManagedPopupPositioner(new ManagedPopupPositionerPopupImplHelper(parent, MoveResize));
@ -28,13 +26,25 @@ namespace Avalonia.Native
parent = popupImpl._parent;
}
if (parent is WindowBaseImpl windowBaseImpl)
{
Native!.SetParent(windowBaseImpl.Native);
}
//Use the parent's input context to process events
if (parent is TopLevelImpl topLevelImpl)
{
_inputMethod = topLevelImpl.InputMethod;
InputMethod = topLevelImpl.InputMethod;
}
}
public override void Dispose()
{
Native!.SetParent(null);
base.Dispose();
}
internal sealed override void Init(MacOSTopLevelHandle handle)
{
base.Init(handle);
@ -71,16 +81,6 @@ namespace Avalonia.Native
}
}
public override void Show(bool activate, bool isDialog)
{
var parent = _parent;
while (parent is PopupImpl p)
parent = p._parent;
if (parent is WindowImpl w)
w.Native.TakeFocusFromChildren();
base.Show(false, isDialog);
}
public override IPopupImpl CreatePopup() => new PopupImpl(Factory, this);
public void SetWindowManagerAddShadowHint(bool enabled)

2
src/Avalonia.Native/TopLevelImpl.cs

@ -106,7 +106,7 @@ internal class TopLevelImpl : ITopLevelImpl, IFramebufferPlatformSurface
public IAvnTopLevel? Native => _handle?.Native;
public IPlatformHandle? Handle => _handle;
public AvaloniaNativeTextInputMethod? InputMethod { get; private set; }
public AvaloniaNativeTextInputMethod? InputMethod { get; protected set; }
public Size ClientSize
{
get

19
src/Windows/Avalonia.Win32/PopupImpl.cs

@ -22,25 +22,6 @@ namespace Avalonia.Win32
{
// Popups are always shown non-activated.
UnmanagedMethods.ShowWindow(Handle.Handle, UnmanagedMethods.ShowWindowCommand.ShowNoActivate);
// We need to steal focus if it's held by a child window of our toplevel window
var parent = _parent;
while(parent != null)
{
if(parent is PopupImpl pi)
parent = pi._parent;
else
break;
}
if(parent == null)
return;
var focusOwner = UnmanagedMethods.GetFocus();
if (focusOwner != IntPtr.Zero &&
UnmanagedMethods.GetAncestor(focusOwner, UnmanagedMethods.GetAncestorFlags.GA_ROOT)
== parent.Handle?.Handle)
UnmanagedMethods.SetFocus(parent.Handle.Handle);
}
protected override bool ShouldTakeFocusOnClick => false;

Loading…
Cancel
Save