Add window resizing and positioning on Mac

This commit is contained in:
Wojtek Figat
2022-01-18 19:10:13 +01:00
parent 2aa3624f81
commit f9eb709a18
5 changed files with 98 additions and 2 deletions

View File

@@ -81,6 +81,15 @@ Vector2 MacUtils::PosToCoca(const Vector2& pos)
return result;
}
Vector2 MacUtils::CocaToPos(const Vector2& pos)
{
// MacOS uses y-coordinate starting at the bottom of the screen
Vector2 result = pos;
result -= GetScreensOrigin();
result.Y *= -1;
return result;
}
Vector2 MacUtils::GetScreensOrigin()
{
Vector2 result = Vector2::Zero;

View File

@@ -11,5 +11,6 @@ public:
static String ToString(CFStringRef str);
static CFStringRef ToString(const StringView& str);
static Vector2 PosToCoca(const Vector2& pos);
static Vector2 CocaToPos(const Vector2& pos);
static Vector2 GetScreensOrigin();
};

View File

@@ -430,7 +430,7 @@ MacWindow::MacWindow(const CreateWindowSettings& settings)
NSUInteger styleMask = NSWindowStyleMaskClosable;
if (settings.IsRegularWindow)
{
styleMask |= NSWindowStyleMaskTitled | NSWindowStyleMaskFullSizeContentView;
styleMask |= NSWindowStyleMaskTitled;
if (settings.AllowMinimize)
styleMask |= NSWindowStyleMaskMiniaturizable;
if (settings.HasSizingFrame || settings.AllowMaximize)
@@ -468,7 +468,6 @@ MacWindow::MacWindow(const CreateWindowSettings& settings)
// TODO: impl StartPosition for MacWindow
// TODO: impl Fullscreen for MacWindow
// TODO: impl ShowInTaskbar for MacWindow
// TODO: impl ActivateWhenFirstShown for MacWindow
// TODO: impl AllowInput for MacWindow
// TODO: impl AllowDragAndDrop for MacWindow
// TODO: impl IsTopmost for MacWindow
@@ -558,6 +557,8 @@ void MacWindow::Minimize()
if (!_settings.AllowMinimize)
return;
NSWindow* window = (NSWindow*)_window;
if (!window)
return;
if (!window.miniaturized)
[window miniaturize:nil];
}
@@ -601,15 +602,90 @@ void MacWindow::SetIsFullscreen(bool isFullscreen)
// TODO: fullscreen mode on Mac
}
void MacWindow::SetClientBounds(const Rectangle& clientArea)
{
NSWindow* window = (NSWindow*)_window;
if (!window)
return;
NSRect oldRect = [window frame];
NSRect newRect = NSMakeRect(0, 0, clientArea.Size.X, clientArea.Size.Y);
newRect = [window frameRectForContentRect:newRect];
//newRect.origin.x = oldRect.origin.x;
//newRect.origin.y = NSMaxY(oldRect) - newRect.size.height;
Vector2 pos = MacUtils::PosToCoca(clientArea.Location);
NSRect frameStart = [window frameRectForContentRect:NSMakeRect(0, 0, 0, 0)];
newRect.origin.x = pos.X;
newRect.origin.y = pos.Y - newRect.size.height + frameStart.size.height;
[window setFrame:newRect display:YES];
}
void MacWindow::SetPosition(const Vector2& position)
{
NSWindow* window = (NSWindow*)_window;
if (!window)
return;
Vector2 pos = MacUtils::PosToCoca(position);
NSRect rect = [window frame];
[window setFrameOrigin:NSMakePoint(pos.X, pos.Y - rect.size.height)];
}
Vector2 MacWindow::GetPosition() const
{
NSWindow* window = (NSWindow*)_window;
if (!window)
return Vector2::Zero;
NSRect rect = [window frame];
return MacUtils::CocaToPos(Vector2(rect.origin.x, rect.origin.y + rect.size.height));
}
Vector2 MacWindow::GetSize() const
{
NSWindow* window = (NSWindow*)_window;
if (!window)
return Vector2::Zero;
NSRect rect = [window frame];
return Vector2(rect.size.width, rect.size.height);
}
Vector2 MacWindow::GetClientSize() const
{
return _clientSize;
}
Vector2 MacWindow::ScreenToClient(const Vector2& screenPos) const
{
NSWindow* window = (NSWindow*)_window;
if (!window)
return screenPos;
NSRect frameStart = [window frameRectForContentRect:NSMakeRect(0, 0, 0, 0)];
return screenPos - GetPosition() - Vector2(0, frameStart.size.height);
}
Vector2 MacWindow::ClientToScreen(const Vector2& clientPos) const
{
NSWindow* window = (NSWindow*)_window;
if (!window)
return clientPos;
NSRect frameStart = [window frameRectForContentRect:NSMakeRect(0, 0, 0, 0)];
return GetPosition() + Vector2(0, frameStart.size.height) + clientPos;
}
void MacWindow::SetOpacity(float opacity)
{
NSWindow* window = (NSWindow*)_window;
if (!window)
return;
[window setAlphaValue:opacity];
}
void MacWindow::Focus()
{
NSWindow* window = (NSWindow*)_window;
if (!window)
return;
[window makeKeyAndOrderFront:window];
}
@@ -617,6 +693,8 @@ void MacWindow::SetTitle(const StringView& title)
{
_title = title;
NSWindow* window = (NSWindow*)_window;
if (!window)
return;
[window setTitle:(__bridge NSString*)MacUtils::ToString(_title)];
}

View File

@@ -38,6 +38,13 @@ public:
bool IsClosed() const override;
bool IsForegroundWindow() const override;
void BringToFront(bool force) override;
void SetClientBounds(const Rectangle& clientArea) override;
void SetPosition(const Vector2& position) override;
Vector2 GetPosition() const override;
Vector2 GetSize() const override;
Vector2 GetClientSize() const override;
Vector2 ScreenToClient(const Vector2& screenPos) const override;
Vector2 ClientToScreen(const Vector2& clientPos) const override;
void SetIsFullscreen(bool isFullscreen) override;
void SetOpacity(float opacity) override;
void Focus() override;