diff options
author | Miguel Borges de Freitas <92enen@gmail.com> | 2023-02-13 10:26:41 +0000 |
---|---|---|
committer | Miguel Borges de Freitas <92enen@gmail.com> | 2023-02-21 11:23:37 +0000 |
commit | 4d9a6eebc5ff90c2df7f2598d7fdf138ebcf6d8d (patch) | |
tree | 23addbbda9ef3095a1aa37f7f7ab48f209bc23c0 | |
parent | 009fc59225190cb07922c14389967591284fc2cc (diff) |
[macos][nativewindowing] Remember window positions in window mode
-rw-r--r-- | system/settings/darwin_osx.xml | 15 | ||||
-rw-r--r-- | xbmc/windowing/osx/WinSystemOSX.mm | 38 |
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() |