aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Borges de Freitas <92enen@gmail.com>2023-02-13 10:26:41 +0000
committerMiguel Borges de Freitas <92enen@gmail.com>2023-02-21 11:23:37 +0000
commit4d9a6eebc5ff90c2df7f2598d7fdf138ebcf6d8d (patch)
tree23addbbda9ef3095a1aa37f7f7ab48f209bc23c0
parent009fc59225190cb07922c14389967591284fc2cc (diff)
[macos][nativewindowing] Remember window positions in window mode
-rw-r--r--system/settings/darwin_osx.xml15
-rw-r--r--xbmc/windowing/osx/WinSystemOSX.mm38
2 files changed, 47 insertions, 6 deletions
diff --git a/system/settings/darwin_osx.xml b/system/settings/darwin_osx.xml
index 5d73f3be53..ecf488a86c 100644
--- a/system/settings/darwin_osx.xml
+++ b/system/settings/darwin_osx.xml
@@ -9,4 +9,19 @@
</group>
</category>
</section>
+ <section id="interface" label="14206" help="38102">
+ <category id="window" label="0" help="36135">
+ <visible>false</visible>
+ <group id="1">
+ <setting id="window.top" type="integer" label="0" help="36136">
+ <level>4</level>
+ <default>0</default>
+ </setting>
+ <setting id="window.left" type="integer" label="0" help="36136">
+ <level>4</level>
+ <default>0</default>
+ </setting>
+ </group>
+ </category>
+ </section>
</settings>
diff --git a/xbmc/windowing/osx/WinSystemOSX.mm b/xbmc/windowing/osx/WinSystemOSX.mm
index 7a57e058ea..41c7038dda 100644
--- a/xbmc/windowing/osx/WinSystemOSX.mm
+++ b/xbmc/windowing/osx/WinSystemOSX.mm
@@ -60,6 +60,12 @@ using namespace std::chrono_literals;
#define MAX_DISPLAYS 32
#define DEFAULT_SCREEN_NAME @"Default"
+
+//! MacOS specific window top position setting
+#define SETTING_WINDOW_TOP @"window.top"
+//! MacOS specific window left position setting
+#define SETTING_WINDOW_LEFT @"window.left"
+
static NSWindow* blankingWindows[MAX_DISPLAYS];
size_t DisplayBitsPerPixelForMode(CGDisplayModeRef mode)
@@ -712,12 +718,23 @@ bool CWinSystemOSX::CreateNewWindow(const std::string& name, bool fullScreen, RE
}
else
{
- // if in window mode we center the window on the screen
- // TODO: we should remember window positions and use that instead, similar to what is currently done for windowsDX
- NSPoint centerOfTheScreen =
- NSMakePoint(screen.frame.origin.x + screen.frame.size.width / 2 - m_nWidth / 2,
- screen.frame.origin.y + screen.frame.size.height / 2 - m_nHeight / 2);
- [appWindow setFrameOrigin:centerOfTheScreen];
+ // if there are stored window positions use that as the origin point
+ const int top = settings->GetInt(SETTING_WINDOW_TOP.UTF8String);
+ const int left = settings->GetInt(SETTING_WINDOW_LEFT.UTF8String);
+
+ NSPoint windowPos;
+ if (top != 0 || left != 0)
+ {
+ windowPos = NSMakePoint(left, top);
+ }
+ else
+ {
+ // otherwise center the window on the screen
+ windowPos =
+ NSMakePoint(screen.frame.origin.x + screen.frame.size.width / 2 - m_nWidth / 2,
+ screen.frame.origin.y + screen.frame.size.height / 2 - m_nHeight / 2);
+ }
+ [appWindow setFrameOrigin:windowPos];
}
});
@@ -1230,6 +1247,15 @@ void CWinSystemOSX::OnMove(int x, int y)
CServiceBroker::GetAppMessenger()->PostMsg(TMSG_VIDEORESIZE, frame.size.width,
frame.size.height);
}
+ // store window position in window mode
+ if (!m_bFullScreen)
+ {
+ dispatch_sync(dispatch_get_main_queue(), ^{
+ settings->SetInt(SETTING_WINDOW_LEFT.UTF8String, m_appWindow.frame.origin.x);
+ settings->SetInt(SETTING_WINDOW_TOP.UTF8String, m_appWindow.frame.origin.y);
+ settings->Save();
+ });
+ }
}
void CWinSystemOSX::WindowChangedScreen()