Hi,
I needed cross-platform full-screen support for DesktopWindow and asked perplexity to implement it for Windows, Mac, and Linux. Here are the diffs if you'd like to include them.
I tested the linux version and it works, the MacOS and Win variant is untested.
1. Header Interface
Add to DesktopWindow struct:
void setFullScreen (bool);
2. Linux Pimpl (#if CHOC_LINUX)
void setFullScreen (bool b) {
if (b) gtk_window_fullscreen (GTK_WINDOW (window));
else gtk_window_unfullscreen (GTK_WINDOW (window));
}
3. macOS Pimpl (#if CHOC_APPLE)
Add constant to Pimpl statics:
static constexpr long NSWindowStyleMaskFullScreen = (1 << 14);
Add method:
void setFullScreen (bool shouldBeFullScreen) {
CHOC_AUTORELEASE_BEGIN
auto style = objc::call<unsigned long> (window, "styleMask");
if (((style & NSWindowStyleMaskFullScreen) != 0) != shouldBeFullScreen)
objc::call<void> (window, "toggleFullScreen:", (id) nullptr);
CHOC_AUTORELEASE_END
}
4. Windows Pimpl (#if CHOC_WINDOWS)
Add members to Pimpl:
bool isFullScreen = false;
WINDOWPLACEMENT savedWindowPlacement = {};
LONG savedStyle = 0;
Add method:
void setFullScreen (bool shouldBeFullScreen) {
if (shouldBeFullScreen == isFullScreen) return;
isFullScreen = shouldBeFullScreen;
if (isFullScreen) {
savedStyle = GetWindowLong (hwnd, GWL_STYLE);
savedWindowPlacement.length = sizeof (WINDOWPLACEMENT);
GetWindowPlacement (hwnd, &savedWindowPlacement);
MONITORINFO mi = { sizeof(mi) };
if (GetMonitorInfo (MonitorFromWindow (hwnd, MONITOR_DEFAULTTOPRIMARY), &mi)) {
SetWindowLong (hwnd, GWL_STYLE, savedStyle & ~(WS_CAPTION | WS_THICKFRAME));
SetWindowPos (hwnd, HWND_TOP, mi.rcMonitor.left, mi.rcMonitor.top,
mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top,
SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
}
} else {
SetWindowLong (hwnd, GWL_STYLE, savedStyle);
SetWindowPlacement (hwnd, &savedWindowPlacement);
SetWindowPos (hwnd, nullptr, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
}
}
5. Implementation Footer
inline void DesktopWindow::setFullScreen (bool b) { pimpl->setFullScreen (b); }
Hi,
I needed cross-platform full-screen support for
DesktopWindowand asked perplexity to implement it for Windows, Mac, and Linux. Here are the diffs if you'd like to include them.I tested the linux version and it works, the MacOS and Win variant is untested.
1. Header Interface
Add to
DesktopWindowstruct:2. Linux Pimpl (
#if CHOC_LINUX)3. macOS Pimpl (
#if CHOC_APPLE)Add constant to Pimpl statics:
Add method:
4. Windows Pimpl (
#if CHOC_WINDOWS)Add members to Pimpl:
Add method:
5. Implementation Footer