Browse Source

Prevent dialog parent from becoming key window.

pull/6188/head
Steven Kirk 5 years ago
parent
commit
32c0eac415
  1. 1
      native/Avalonia.Native/src/OSX/window.h
  2. 42
      native/Avalonia.Native/src/OSX/window.mm
  3. 2
      src/Avalonia.Native/WindowImplBase.cs
  4. 2
      src/Avalonia.Native/avn.idl

1
native/Avalonia.Native/src/OSX/window.h

@ -34,6 +34,7 @@ class WindowBaseImpl;
-(double) getScaling; -(double) getScaling;
-(double) getExtendedTitleBarHeight; -(double) getExtendedTitleBarHeight;
-(void) setIsExtended:(bool)value; -(void) setIsExtended:(bool)value;
-(bool) isDialog;
@end @end
struct INSWindowHolder struct INSWindowHolder

42
native/Avalonia.Native/src/OSX/window.mm

@ -105,7 +105,7 @@ public:
return Window; return Window;
} }
virtual HRESULT Show(bool activate) override virtual HRESULT Show(bool activate, bool isDialog) override
{ {
@autoreleasepool @autoreleasepool
{ {
@ -488,6 +488,11 @@ public:
return S_OK; return S_OK;
} }
virtual bool IsDialog()
{
return false;
}
protected: protected:
virtual NSWindowStyleMask GetStyle() virtual NSWindowStyleMask GetStyle()
{ {
@ -518,6 +523,7 @@ private:
NSRect _preZoomSize; NSRect _preZoomSize;
bool _transitioningWindowState; bool _transitioningWindowState;
bool _isClientAreaExtended; bool _isClientAreaExtended;
bool _isDialog;
AvnExtendClientAreaChromeHints _extendClientHints; AvnExtendClientAreaChromeHints _extendClientHints;
FORWARD_IUNKNOWN() FORWARD_IUNKNOWN()
@ -573,11 +579,12 @@ private:
} }
} }
virtual HRESULT Show (bool activate) override virtual HRESULT Show (bool activate, bool isDialog) override
{ {
@autoreleasepool @autoreleasepool
{ {
WindowBaseImpl::Show(activate); _isDialog = isDialog;
WindowBaseImpl::Show(activate, isDialog);
HideOrShowTrafficLights(); HideOrShowTrafficLights();
@ -1070,6 +1077,11 @@ private:
} }
} }
virtual bool IsDialog() override
{
return _isDialog;
}
protected: protected:
virtual NSWindowStyleMask GetStyle() override virtual NSWindowStyleMask GetStyle() override
{ {
@ -1858,6 +1870,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
_isExtended = value; _isExtended = value;
} }
-(bool) isDialog
{
return _parent->IsDialog();
}
-(double) getScaling -(double) getScaling
{ {
return _lastScaling; return _lastScaling;
@ -2047,7 +2064,22 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
-(BOOL)canBecomeKeyWindow -(BOOL)canBecomeKeyWindow
{ {
return _canBecomeKeyAndMain; if (_canBecomeKeyAndMain)
{
// If the window has a child window being shown as a dialog then don't allow it to become the key window.
for(NSWindow* uch in [self childWindows])
{
auto ch = objc_cast<AvnWindow>(uch);
if(ch == nil)
continue;
if (ch.isDialog)
return false;
}
return true;
}
return false;
} }
-(BOOL)canBecomeMainWindow -(BOOL)canBecomeMainWindow

2
src/Avalonia.Native/WindowImplBase.cs

@ -353,7 +353,7 @@ namespace Avalonia.Native
public virtual void Show(bool activate, bool isDialog) public virtual void Show(bool activate, bool isDialog)
{ {
_native.Show(activate.AsComBool()); _native.Show(activate.AsComBool(), isDialog.AsComBool());
} }

2
src/Avalonia.Native/avn.idl

@ -430,7 +430,7 @@ interface IAvnString : IUnknown
[uuid(e5aca675-02b7-4129-aa79-d6e417210bda)] [uuid(e5aca675-02b7-4129-aa79-d6e417210bda)]
interface IAvnWindowBase : IUnknown interface IAvnWindowBase : IUnknown
{ {
HRESULT Show(bool activate); HRESULT Show(bool activate, bool isDialog);
HRESULT Hide(); HRESULT Hide();
HRESULT Close(); HRESULT Close();
HRESULT Activate(); HRESULT Activate();

Loading…
Cancel
Save