Browse Source

OSX backend calls OnResized to keep WindowState inSync.

pull/3699/head
Dan Walmsley 7 years ago
parent
commit
5a3602ffd5
  1. 1
      native/Avalonia.Native/src/OSX/window.h
  2. 100
      native/Avalonia.Native/src/OSX/window.mm

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

@ -34,6 +34,7 @@ struct INSWindowHolder
struct IWindowStateChanged struct IWindowStateChanged
{ {
virtual void WindowStateChanged () = 0; virtual void WindowStateChanged () = 0;
virtual void OnResized () = 0;
}; };
#endif /* window_h */ #endif /* window_h */

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

@ -31,9 +31,11 @@ public:
AvnPoint lastPositionSet; AvnPoint lastPositionSet;
NSString* _lastTitle; NSString* _lastTitle;
IAvnAppMenu* _mainMenu; IAvnAppMenu* _mainMenu;
bool _shown;
WindowBaseImpl(IAvnWindowBaseEvents* events, IAvnGlContext* gl) WindowBaseImpl(IAvnWindowBaseEvents* events, IAvnGlContext* gl)
{ {
_shown = false;
_mainMenu = nullptr; _mainMenu = nullptr;
BaseEvents = events; BaseEvents = events;
_glContext = gl; _glContext = gl;
@ -115,6 +117,8 @@ public:
[NSApp activateIgnoringOtherApps:YES]; [NSApp activateIgnoringOtherApps:YES];
[Window setTitle:_lastTitle]; [Window setTitle:_lastTitle];
_shown = true;
return S_OK; return S_OK;
} }
@ -615,57 +619,64 @@ private:
{ {
_lastWindowState = state; _lastWindowState = state;
switch (state) { if(_shown)
case Maximized: {
lastPositionSet.X = 0; switch (state) {
lastPositionSet.Y = 0; case Maximized:
lastPositionSet.X = 0;
if([Window isMiniaturized]) lastPositionSet.Y = 0;
{
[Window deminiaturize:Window]; if([Window isMiniaturized])
} {
[Window deminiaturize:Window];
if(!IsZoomed()) }
{
DoZoom(); if(!IsZoomed())
} {
break; DoZoom();
}
case Minimized: break;
[Window miniaturize:Window];
break; case Minimized:
[Window miniaturize:Window];
default: break;
if([Window isMiniaturized])
{ default:
[Window deminiaturize:Window]; if([Window isMiniaturized])
} {
[Window deminiaturize:Window];
if(IsZoomed()) }
{
DoZoom(); if(IsZoomed())
} {
break; DoZoom();
}
break;
}
} }
return S_OK; return S_OK;
} }
} }
protected: public:
virtual void OnResized () override virtual void OnResized () override
{ {
auto windowState = [Window isMiniaturized] ? Minimized if(_shown)
: (IsZoomed() ? Maximized : Normal);
if (windowState != _lastWindowState)
{ {
_lastWindowState = windowState; auto windowState = [Window isMiniaturized] ? Minimized
: (IsZoomed() ? Maximized : Normal);
WindowEvents->WindowStateChanged(windowState); if (windowState != _lastWindowState)
{
_lastWindowState = windowState;
WindowEvents->WindowStateChanged(windowState);
}
} }
} }
protected:
virtual NSWindowStyleMask GetStyle() override virtual NSWindowStyleMask GetStyle() override
{ {
unsigned long s = NSWindowStyleMaskBorderless; unsigned long s = NSWindowStyleMaskBorderless;
@ -1360,6 +1371,16 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
} }
} }
- (void)windowDidResize:(NSNotification *)notification
{
auto parent = dynamic_cast<IWindowStateChanged*>(_parent.operator->());
if(parent != nullptr)
{
parent->OnResized();
}
}
- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame - (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame
{ {
return true; return true;
@ -1430,6 +1451,7 @@ protected:
[Window setContentSize:NSSize{x, y}]; [Window setContentSize:NSSize{x, y}];
[Window setFrameTopLeftPoint:ToNSPoint(ConvertPointY(lastPositionSet))]; [Window setFrameTopLeftPoint:ToNSPoint(ConvertPointY(lastPositionSet))];
return S_OK; return S_OK;
} }
} }

Loading…
Cancel
Save