@ -54,6 +54,8 @@ public:
virtual HRESULT ObtainNSWindowHandle(void** ret) override
virtual HRESULT ObtainNSWindowHandle(void** ret) override
{
{
START_COM_CALL;
if (ret == nullptr)
if (ret == nullptr)
{
{
return E_POINTER;
return E_POINTER;
@ -66,6 +68,8 @@ public:
virtual HRESULT ObtainNSWindowHandleRetained(void** ret) override
virtual HRESULT ObtainNSWindowHandleRetained(void** ret) override
{
{
START_COM_CALL;
if (ret == nullptr)
if (ret == nullptr)
{
{
return E_POINTER;
return E_POINTER;
@ -78,6 +82,8 @@ public:
virtual HRESULT ObtainNSViewHandle(void** ret) override
virtual HRESULT ObtainNSViewHandle(void** ret) override
{
{
START_COM_CALL;
if (ret == nullptr)
if (ret == nullptr)
{
{
return E_POINTER;
return E_POINTER;
@ -90,6 +96,8 @@ public:
virtual HRESULT ObtainNSViewHandleRetained(void** ret) override
virtual HRESULT ObtainNSViewHandleRetained(void** ret) override
{
{
START_COM_CALL;
if (ret == nullptr)
if (ret == nullptr)
{
{
return E_POINTER;
return E_POINTER;
@ -107,23 +115,27 @@ public:
virtual HRESULT Show(bool activate) override
virtual HRESULT Show(bool activate) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
SetPosition(lastPositionSet);
SetPosition(lastPositionSet);
UpdateStyle();
UpdateStyle();
[Window setContentView: StandardContainer];
[Window setContentView: StandardContainer];
[Window setTitle:_lastTitle];
if(ShouldTakeFocusOnShow() && activate)
if(ShouldTakeFocusOnShow() && activate)
{
{
[Window orderFront: Window];
[Window makeKeyAndOrderFront:Window];
[Window makeKeyAndOrderFront:Window];
[Window makeFirstResponder:View];
[NSApp activateIgnoringOtherApps:YES];
[NSApp activateIgnoringOtherApps:YES];
}
}
else
else
{
{
[Window orderFront: Window];
[Window orderFront: Window];
}
}
[Window setTitle:_lastTitle];
_shown = true;
_shown = true;
@ -138,6 +150,8 @@ public:
virtual HRESULT Hide () override
virtual HRESULT Hide () override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if(Window != nullptr)
if(Window != nullptr)
@ -152,6 +166,8 @@ public:
virtual HRESULT Activate () override
virtual HRESULT Activate () override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if(Window != nullptr)
if(Window != nullptr)
@ -166,6 +182,8 @@ public:
virtual HRESULT SetTopMost (bool value) override
virtual HRESULT SetTopMost (bool value) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
[Window setLevel: value ? NSFloatingWindowLevel : NSNormalWindowLevel];
[Window setLevel: value ? NSFloatingWindowLevel : NSNormalWindowLevel];
@ -176,11 +194,16 @@ public:
virtual HRESULT Close() override
virtual HRESULT Close() override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if (Window != nullptr)
if (Window != nullptr)
{
{
[Window close];
auto window = Window;
Window = nullptr;
[window close];
}
}
return S_OK;
return S_OK;
@ -189,6 +212,8 @@ public:
virtual HRESULT GetClientSize(AvnSize* ret) override
virtual HRESULT GetClientSize(AvnSize* ret) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if(ret == nullptr)
if(ret == nullptr)
@ -202,8 +227,25 @@ public:
}
}
}
}
virtual HRESULT GetFrameSize(AvnSize* ret) override
{
@autoreleasepool
{
if(ret == nullptr)
return E_POINTER;
auto frame = [Window frame];
ret->Width = frame.size.width;
ret->Height = frame.size.height;
return S_OK;
}
}
virtual HRESULT GetScaling (double* ret) override
virtual HRESULT GetScaling (double* ret) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if(ret == nullptr)
if(ret == nullptr)
@ -222,6 +264,8 @@ public:
virtual HRESULT SetMinMaxSize (AvnSize minSize, AvnSize maxSize) override
virtual HRESULT SetMinMaxSize (AvnSize minSize, AvnSize maxSize) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
[Window setMinSize: ToNSSize(minSize)];
[Window setMinSize: ToNSSize(minSize)];
@ -233,6 +277,8 @@ public:
virtual HRESULT Resize(double x, double y) override
virtual HRESULT Resize(double x, double y) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
auto maxSize = [Window maxSize];
auto maxSize = [Window maxSize];
@ -272,6 +318,8 @@ public:
virtual HRESULT Invalidate (AvnRect rect) override
virtual HRESULT Invalidate (AvnRect rect) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
[View setNeedsDisplayInRect:[View frame]];
[View setNeedsDisplayInRect:[View frame]];
@ -282,6 +330,8 @@ public:
virtual HRESULT SetMainMenu(IAvnMenu* menu) override
virtual HRESULT SetMainMenu(IAvnMenu* menu) override
{
{
START_COM_CALL;
_mainMenu = menu;
_mainMenu = menu;
auto nativeMenu = dynamic_cast<AvnAppMenu*>(menu);
auto nativeMenu = dynamic_cast<AvnAppMenu*>(menu);
@ -300,6 +350,8 @@ public:
virtual HRESULT BeginMoveDrag () override
virtual HRESULT BeginMoveDrag () override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
auto lastEvent = [View lastMouseDownEvent];
auto lastEvent = [View lastMouseDownEvent];
@ -317,11 +369,15 @@ public:
virtual HRESULT BeginResizeDrag (AvnWindowEdge edge) override
virtual HRESULT BeginResizeDrag (AvnWindowEdge edge) override
{
{
START_COM_CALL;
return S_OK;
return S_OK;
}
}
virtual HRESULT GetPosition (AvnPoint* ret) override
virtual HRESULT GetPosition (AvnPoint* ret) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if(ret == nullptr)
if(ret == nullptr)
@ -342,6 +398,8 @@ public:
virtual HRESULT SetPosition (AvnPoint point) override
virtual HRESULT SetPosition (AvnPoint point) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
lastPositionSet = point;
lastPositionSet = point;
@ -353,6 +411,8 @@ public:
virtual HRESULT PointToClient (AvnPoint point, AvnPoint* ret) override
virtual HRESULT PointToClient (AvnPoint point, AvnPoint* ret) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if(ret == nullptr)
if(ret == nullptr)
@ -371,6 +431,8 @@ public:
virtual HRESULT PointToScreen (AvnPoint point, AvnPoint* ret) override
virtual HRESULT PointToScreen (AvnPoint point, AvnPoint* ret) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if(ret == nullptr)
if(ret == nullptr)
@ -388,12 +450,16 @@ public:
virtual HRESULT ThreadSafeSetSwRenderedFrame(AvnFramebuffer* fb, IUnknown* dispose) override
virtual HRESULT ThreadSafeSetSwRenderedFrame(AvnFramebuffer* fb, IUnknown* dispose) override
{
{
START_COM_CALL;
[View setSwRenderedFrame: fb dispose: dispose];
[View setSwRenderedFrame: fb dispose: dispose];
return S_OK;
return S_OK;
}
}
virtual HRESULT SetCursor(IAvnCursor* cursor) override
virtual HRESULT SetCursor(IAvnCursor* cursor) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
Cursor* avnCursor = dynamic_cast<Cursor*>(cursor);
Cursor* avnCursor = dynamic_cast<Cursor*>(cursor);
@ -423,6 +489,8 @@ public:
virtual HRESULT CreateGlRenderTarget(IAvnGlSurfaceRenderTarget** ppv) override
virtual HRESULT CreateGlRenderTarget(IAvnGlSurfaceRenderTarget** ppv) override
{
{
START_COM_CALL;
if(View == NULL)
if(View == NULL)
return E_FAIL;
return E_FAIL;
*ppv = [renderTarget createSurfaceRenderTarget];
*ppv = [renderTarget createSurfaceRenderTarget];
@ -431,6 +499,8 @@ public:
virtual HRESULT CreateNativeControlHost(IAvnNativeControlHost** retOut) override
virtual HRESULT CreateNativeControlHost(IAvnNativeControlHost** retOut) override
{
{
START_COM_CALL;
if(View == NULL)
if(View == NULL)
return E_FAIL;
return E_FAIL;
*retOut = ::CreateNativeControlHost(View);
*retOut = ::CreateNativeControlHost(View);
@ -439,6 +509,8 @@ public:
virtual HRESULT SetBlurEnabled (bool enable) override
virtual HRESULT SetBlurEnabled (bool enable) override
{
{
START_COM_CALL;
[StandardContainer ShowBlur:enable];
[StandardContainer ShowBlur:enable];
return S_OK;
return S_OK;
@ -448,6 +520,8 @@ public:
IAvnClipboard* clipboard, IAvnDndResultCallback* cb,
IAvnClipboard* clipboard, IAvnDndResultCallback* cb,
void* sourceHandle) override
void* sourceHandle) override
{
{
START_COM_CALL;
auto item = TryGetPasteboardItem(clipboard);
auto item = TryGetPasteboardItem(clipboard);
[item setString:@"" forType:GetAvnCustomDataType()];
[item setString:@"" forType:GetAvnCustomDataType()];
if(item == nil)
if(item == nil)
@ -549,6 +623,11 @@ private:
void HideOrShowTrafficLights ()
void HideOrShowTrafficLights ()
{
{
if (Window == nil)
{
return;
}
for (id subview in Window.contentView.superview.subviews) {
for (id subview in Window.contentView.superview.subviews) {
if ([subview isKindOfClass:NSClassFromString(@"NSTitlebarContainerView")]) {
if ([subview isKindOfClass:NSClassFromString(@"NSTitlebarContainerView")]) {
NSView *titlebarView = [subview subviews][0];
NSView *titlebarView = [subview subviews][0];
@ -575,8 +654,10 @@ private:
virtual HRESULT Show (bool activate) override
virtual HRESULT Show (bool activate) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
WindowBaseImpl::Show(activate);
WindowBaseImpl::Show(activate);
HideOrShowTrafficLights();
HideOrShowTrafficLights();
@ -587,6 +668,8 @@ private:
virtual HRESULT SetEnabled (bool enable) override
virtual HRESULT SetEnabled (bool enable) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
[Window setEnabled:enable];
[Window setEnabled:enable];
@ -596,6 +679,8 @@ private:
virtual HRESULT SetParent (IAvnWindow* parent) override
virtual HRESULT SetParent (IAvnWindow* parent) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if(parent == nullptr)
if(parent == nullptr)
@ -707,6 +792,8 @@ private:
virtual HRESULT SetCanResize(bool value) override
virtual HRESULT SetCanResize(bool value) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
_canResize = value;
_canResize = value;
@ -717,6 +804,8 @@ private:
virtual HRESULT SetDecorations(SystemDecorations value) override
virtual HRESULT SetDecorations(SystemDecorations value) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
auto currentWindowState = _lastWindowState;
auto currentWindowState = _lastWindowState;
@ -782,6 +871,8 @@ private:
virtual HRESULT SetTitle (char* utf8title) override
virtual HRESULT SetTitle (char* utf8title) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
_lastTitle = [NSString stringWithUTF8String:(const char*)utf8title];
_lastTitle = [NSString stringWithUTF8String:(const char*)utf8title];
@ -793,6 +884,8 @@ private:
virtual HRESULT SetTitleBarColor(AvnColor color) override
virtual HRESULT SetTitleBarColor(AvnColor color) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
float a = (float)color.Alpha / 255.0f;
float a = (float)color.Alpha / 255.0f;
@ -822,6 +915,8 @@ private:
virtual HRESULT GetWindowState (AvnWindowState*ret) override
virtual HRESULT GetWindowState (AvnWindowState*ret) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if(ret == nullptr)
if(ret == nullptr)
@ -855,86 +950,111 @@ private:
virtual HRESULT TakeFocusFromChildren () override
virtual HRESULT TakeFocusFromChildren () override
{
{
if(Window == nil)
START_COM_CALL;
return S_OK;
if([Window isKeyWindow])
[Window makeFirstResponder: View];
return S_OK;
@autoreleasepool
{
if(Window == nil)
return S_OK;
if([Window isKeyWindow])
[Window makeFirstResponder: View];
return S_OK;
}
}
}
virtual HRESULT SetExtendClientArea (bool enable) override
virtual HRESULT SetExtendClientArea (bool enable) override
{
{
_isClientAreaExtended = enable;
START_COM_CALL ;
if(enable)
@autoreleasepool
{
{
Window.titleVisibility = NSWindowTitleHidden ;
_isClientAreaExtended = enable ;
[Window setTitlebarAppearsTransparent:true];
if(enable)
auto wantsTitleBar = (_extendClientHints & AvnSystemChrome) || (_extendClientHints & AvnPreferSystemChrome);
if (wantsTitleBar)
{
[StandardContainer ShowTitleBar:true];
}
else
{
[StandardContainer ShowTitleBar:false];
}
if(_extendClientHints & AvnOSXThickTitleBar)
{
{
Window.toolbar = [NSToolbar new];
Window.titleVisibility = NSWindowTitleHidden;
Window.toolbar.showsBaselineSeparator = false;
[Window setTitlebarAppearsTransparent:true];
auto wantsTitleBar = (_extendClientHints & AvnSystemChrome) || (_extendClientHints & AvnPreferSystemChrome);
if (wantsTitleBar)
{
[StandardContainer ShowTitleBar:true];
}
else
{
[StandardContainer ShowTitleBar:false];
}
if(_extendClientHints & AvnOSXThickTitleBar)
{
Window.toolbar = [NSToolbar new];
Window.toolbar.showsBaselineSeparator = false;
}
else
{
Window.toolbar = nullptr;
}
}
}
else
else
{
{
Window.titleVisibility = NSWindowTitleVisible;
Window.toolbar = nullptr;
Window.toolbar = nullptr;
[Window setTitlebarAppearsTransparent:false];
View.layer.zPosition = 0;
}
}
[Window setIsExtended:enable];
HideOrShowTrafficLights();
UpdateStyle();
return S_OK;
}
}
else
{
Window.titleVisibility = NSWindowTitleVisible;
Window.toolbar = nullptr;
[Window setTitlebarAppearsTransparent:false];
View.layer.zPosition = 0;
}
[Window setIsExtended:enable];
HideOrShowTrafficLights();
UpdateStyle();
return S_OK;
}
}
virtual HRESULT SetExtendClientAreaHints (AvnExtendClientAreaChromeHints hints) override
virtual HRESULT SetExtendClientAreaHints (AvnExtendClientAreaChromeHints hints) override
{
{
_extendClientHints = hints ;
START_COM_CALL;
SetExtendClientArea(_isClientAreaExtended);
@autoreleasepool
return S_OK;
{
_extendClientHints = hints;
SetExtendClientArea(_isClientAreaExtended);
return S_OK;
}
}
}
virtual HRESULT GetExtendTitleBarHeight (double*ret) override
virtual HRESULT GetExtendTitleBarHeight (double*ret) override
{
{
if(ret == nullptr)
START_COM_CALL;
@autoreleasepool
{
{
return E_POINTER;
if(ret == nullptr)
{
return E_POINTER;
}
*ret = [Window getExtendedTitleBarHeight];
return S_OK;
}
}
*ret = [Window getExtendedTitleBarHeight];
return S_OK;
}
}
virtual HRESULT SetExtendTitleBarHeight (double value) override
virtual HRESULT SetExtendTitleBarHeight (double value) override
{
{
[StandardContainer SetTitleBarHeightHint:value];
START_COM_CALL;
return S_OK;
@autoreleasepool
{
[StandardContainer SetTitleBarHeightHint:value];
return S_OK;
}
}
}
void EnterFullScreenMode ()
void EnterFullScreenMode ()
@ -963,8 +1083,15 @@ private:
virtual HRESULT SetWindowState (AvnWindowState state) override
virtual HRESULT SetWindowState (AvnWindowState state) override
{
{
START_COM_CALL;
@autoreleasepool
@autoreleasepool
{
{
if(Window == nullptr)
{
return S_OK;
}
if(_actualWindowState == state)
if(_actualWindowState == state)
{
{
return S_OK;
return S_OK;
@ -1911,7 +2038,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
{
{
if(![self windowShouldClose:self]) return;
if(![self windowShouldClose:self]) return;
}
}
[self close];
[self close];
}
}