|
|
|
@ -1,3 +1,6 @@ |
|
|
|
// Copyright (c) The Avalonia Project. All rights reserved. |
|
|
|
// Licensed under the MIT license. See licence.md file in the project root for full license information. |
|
|
|
|
|
|
|
#include "common.h" |
|
|
|
#include "window.h" |
|
|
|
#include "KeyTransform.h" |
|
|
|
@ -35,26 +38,37 @@ public: |
|
|
|
|
|
|
|
virtual HRESULT Show() |
|
|
|
{ |
|
|
|
SetPosition(lastPositionSet); |
|
|
|
UpdateStyle(); |
|
|
|
[Window makeKeyAndOrderFront:Window]; |
|
|
|
return S_OK; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
SetPosition(lastPositionSet); |
|
|
|
UpdateStyle(); |
|
|
|
[Window makeKeyAndOrderFront:Window]; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT Hide () |
|
|
|
{ |
|
|
|
if(Window != nullptr) |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
[Window orderOut:Window]; |
|
|
|
if(Window != nullptr) |
|
|
|
{ |
|
|
|
[Window orderOut:Window]; |
|
|
|
} |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT Activate () |
|
|
|
{ |
|
|
|
if(Window != nullptr) |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
[Window makeKeyWindow]; |
|
|
|
if(Window != nullptr) |
|
|
|
{ |
|
|
|
[Window makeKeyWindow]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
@ -62,129 +76,186 @@ public: |
|
|
|
|
|
|
|
virtual HRESULT SetTopMost (bool value) |
|
|
|
{ |
|
|
|
[Window setLevel: value ? NSFloatingWindowLevel : NSNormalWindowLevel]; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
[Window setLevel: value ? NSFloatingWindowLevel : NSNormalWindowLevel]; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT Close() |
|
|
|
{ |
|
|
|
[Window close]; |
|
|
|
return S_OK; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
[Window close]; |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT GetClientSize(AvnSize* ret) |
|
|
|
{ |
|
|
|
if(ret == nullptr) |
|
|
|
return E_POINTER; |
|
|
|
auto frame = [View frame]; |
|
|
|
ret->Width = frame.size.width; |
|
|
|
ret->Height = frame.size.height; |
|
|
|
return S_OK; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
if(ret == nullptr) |
|
|
|
return E_POINTER; |
|
|
|
auto frame = [View frame]; |
|
|
|
ret->Width = frame.size.width; |
|
|
|
ret->Height = frame.size.height; |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT GetMaxClientSize(AvnSize* ret) |
|
|
|
{ |
|
|
|
if(ret == nullptr) |
|
|
|
return E_POINTER; |
|
|
|
|
|
|
|
auto size = [NSScreen.screens objectAtIndex:0].frame.size; |
|
|
|
|
|
|
|
ret->Height = size.height; |
|
|
|
ret->Width = size.width; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
if(ret == nullptr) |
|
|
|
return E_POINTER; |
|
|
|
|
|
|
|
auto size = [NSScreen.screens objectAtIndex:0].frame.size; |
|
|
|
|
|
|
|
ret->Height = size.height; |
|
|
|
ret->Width = size.width; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT GetScaling (double* ret) |
|
|
|
{ |
|
|
|
if(ret == nullptr) |
|
|
|
return E_POINTER; |
|
|
|
|
|
|
|
if(Window == nullptr) |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
*ret = 1; |
|
|
|
if(ret == nullptr) |
|
|
|
return E_POINTER; |
|
|
|
|
|
|
|
if(Window == nullptr) |
|
|
|
{ |
|
|
|
*ret = 1; |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
*ret = [Window backingScaleFactor]; |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT SetMinMaxSize (AvnSize minSize, AvnSize maxSize) |
|
|
|
{ |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
[Window setMinSize: ToNSSize(minSize)]; |
|
|
|
[Window setMaxSize: ToNSSize(maxSize)]; |
|
|
|
|
|
|
|
*ret = [Window backingScaleFactor]; |
|
|
|
return S_OK; |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT Resize(double x, double y) |
|
|
|
{ |
|
|
|
[Window setContentSize:NSSize{x, y}]; |
|
|
|
return S_OK; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
[Window setContentSize:NSSize{x, y}]; |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual void Invalidate (AvnRect rect) |
|
|
|
virtual HRESULT Invalidate (AvnRect rect) |
|
|
|
{ |
|
|
|
[View setNeedsDisplayInRect:[View frame]]; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
[View setNeedsDisplayInRect:[View frame]]; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual void BeginMoveDrag () |
|
|
|
virtual HRESULT BeginMoveDrag () |
|
|
|
{ |
|
|
|
auto lastEvent = [View lastMouseDownEvent]; |
|
|
|
|
|
|
|
if(lastEvent == nullptr) |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
return; |
|
|
|
auto lastEvent = [View lastMouseDownEvent]; |
|
|
|
|
|
|
|
if(lastEvent == nullptr) |
|
|
|
{ |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
[Window performWindowDragWithEvent:lastEvent]; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
[Window performWindowDragWithEvent:lastEvent]; |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT BeginResizeDrag (AvnWindowEdge edge) |
|
|
|
{ |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT GetPosition (AvnPoint* ret) |
|
|
|
{ |
|
|
|
if(ret == nullptr) |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
return E_POINTER; |
|
|
|
if(ret == nullptr) |
|
|
|
{ |
|
|
|
return E_POINTER; |
|
|
|
} |
|
|
|
|
|
|
|
auto frame = [Window frame]; |
|
|
|
|
|
|
|
ret->X = frame.origin.x; |
|
|
|
ret->Y = frame.origin.y + frame.size.height; |
|
|
|
|
|
|
|
*ret = ConvertPointY(*ret); |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
auto frame = [Window frame]; |
|
|
|
|
|
|
|
ret->X = frame.origin.x; |
|
|
|
ret->Y = frame.origin.y + frame.size.height; |
|
|
|
|
|
|
|
*ret = ConvertPointY(*ret); |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
virtual void SetPosition (AvnPoint point) |
|
|
|
virtual HRESULT SetPosition (AvnPoint point) |
|
|
|
{ |
|
|
|
lastPositionSet = point; |
|
|
|
[Window setFrameTopLeftPoint:ToNSPoint(ConvertPointY(point))]; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
lastPositionSet = point; |
|
|
|
[Window setFrameTopLeftPoint:ToNSPoint(ConvertPointY(point))]; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT PointToClient (AvnPoint point, AvnPoint* ret) |
|
|
|
{ |
|
|
|
if(ret == nullptr) |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
return E_POINTER; |
|
|
|
if(ret == nullptr) |
|
|
|
{ |
|
|
|
return E_POINTER; |
|
|
|
} |
|
|
|
|
|
|
|
point = ConvertPointY(point); |
|
|
|
auto viewPoint = [Window convertScreenToBase:ToNSPoint(point)]; |
|
|
|
|
|
|
|
*ret = [View translateLocalPoint:ToAvnPoint(viewPoint)]; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
point = ConvertPointY(point); |
|
|
|
auto viewPoint = [Window convertScreenToBase:ToNSPoint(point)]; |
|
|
|
|
|
|
|
*ret = [View translateLocalPoint:ToAvnPoint(viewPoint)]; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT PointToScreen (AvnPoint point, AvnPoint* ret) |
|
|
|
{ |
|
|
|
if(ret == nullptr) |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
return E_POINTER; |
|
|
|
if(ret == nullptr) |
|
|
|
{ |
|
|
|
return E_POINTER; |
|
|
|
} |
|
|
|
|
|
|
|
auto cocoaViewPoint = ToNSPoint([View translateLocalPoint:point]); |
|
|
|
auto cocoaScreenPoint = [Window convertBaseToScreen:cocoaViewPoint]; |
|
|
|
*ret = ConvertPointY(ToAvnPoint(cocoaScreenPoint)); |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
auto cocoaViewPoint = ToNSPoint([View translateLocalPoint:point]); |
|
|
|
auto cocoaScreenPoint = [Window convertBaseToScreen:cocoaViewPoint]; |
|
|
|
*ret = ConvertPointY(ToAvnPoint(cocoaScreenPoint)); |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT ThreadSafeSetSwRenderedFrame(AvnFramebuffer* fb, IUnknown* dispose) |
|
|
|
@ -195,10 +266,13 @@ public: |
|
|
|
|
|
|
|
virtual HRESULT SetCursor(IAvnCursor* cursor) |
|
|
|
{ |
|
|
|
Cursor* avnCursor = dynamic_cast<Cursor*>(cursor); |
|
|
|
this->cursor = avnCursor->GetNative(); |
|
|
|
UpdateCursor(); |
|
|
|
return S_OK; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
Cursor* avnCursor = dynamic_cast<Cursor*>(cursor); |
|
|
|
this->cursor = avnCursor->GetNative(); |
|
|
|
UpdateCursor(); |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual void UpdateCursor() |
|
|
|
@ -841,75 +915,87 @@ private: |
|
|
|
|
|
|
|
virtual HRESULT SetCanResize(bool value) |
|
|
|
{ |
|
|
|
_canResize = value; |
|
|
|
UpdateStyle(); |
|
|
|
return S_OK; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
_canResize = value; |
|
|
|
UpdateStyle(); |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT SetHasDecorations(bool value) |
|
|
|
{ |
|
|
|
_hasDecorations = value; |
|
|
|
UpdateStyle(); |
|
|
|
return S_OK; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
_hasDecorations = value; |
|
|
|
UpdateStyle(); |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT GetWindowState (AvnWindowState*ret) |
|
|
|
{ |
|
|
|
if(ret == nullptr) |
|
|
|
{ |
|
|
|
return E_POINTER; |
|
|
|
} |
|
|
|
|
|
|
|
if([Window isMiniaturized]) |
|
|
|
{ |
|
|
|
*ret = Minimized; |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
if([Window isZoomed]) |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
*ret = Maximized; |
|
|
|
if(ret == nullptr) |
|
|
|
{ |
|
|
|
return E_POINTER; |
|
|
|
} |
|
|
|
|
|
|
|
if([Window isMiniaturized]) |
|
|
|
{ |
|
|
|
*ret = Minimized; |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
if([Window isZoomed]) |
|
|
|
{ |
|
|
|
*ret = Maximized; |
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
*ret = Normal; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
*ret = Normal; |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
virtual HRESULT SetWindowState (AvnWindowState state) |
|
|
|
{ |
|
|
|
switch (state) { |
|
|
|
case Maximized: |
|
|
|
if([Window isMiniaturized]) |
|
|
|
{ |
|
|
|
[Window deminiaturize:Window]; |
|
|
|
} |
|
|
|
|
|
|
|
if(!IsZoomed()) |
|
|
|
{ |
|
|
|
DoZoom(); |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case Minimized: |
|
|
|
[Window miniaturize:Window]; |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
if([Window isMiniaturized]) |
|
|
|
{ |
|
|
|
[Window deminiaturize:Window]; |
|
|
|
} |
|
|
|
|
|
|
|
if(IsZoomed()) |
|
|
|
{ |
|
|
|
DoZoom(); |
|
|
|
} |
|
|
|
break; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
switch (state) { |
|
|
|
case Maximized: |
|
|
|
if([Window isMiniaturized]) |
|
|
|
{ |
|
|
|
[Window deminiaturize:Window]; |
|
|
|
} |
|
|
|
|
|
|
|
if(!IsZoomed()) |
|
|
|
{ |
|
|
|
DoZoom(); |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case Minimized: |
|
|
|
[Window miniaturize:Window]; |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
if([Window isMiniaturized]) |
|
|
|
{ |
|
|
|
[Window deminiaturize:Window]; |
|
|
|
} |
|
|
|
|
|
|
|
if(IsZoomed()) |
|
|
|
{ |
|
|
|
DoZoom(); |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
return S_OK; |
|
|
|
} |
|
|
|
|
|
|
|
protected: |
|
|
|
@ -939,6 +1025,9 @@ protected: |
|
|
|
|
|
|
|
extern IAvnWindow* CreateAvnWindow(IAvnWindowEvents*events) |
|
|
|
{ |
|
|
|
IAvnWindow* ptr = dynamic_cast<IAvnWindow*>(new WindowImpl(events)); |
|
|
|
return ptr; |
|
|
|
@autoreleasepool |
|
|
|
{ |
|
|
|
IAvnWindow* ptr = dynamic_cast<IAvnWindow*>(new WindowImpl(events)); |
|
|
|
return ptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|