-
Notifications
You must be signed in to change notification settings - Fork 75
Open
Description
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); }Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels