[rcore] Fix native win32 window minimizing/maximizing (#5524)

* fixed typos preventing window from min/maxing

* fixed window style generation ignoring minimize precedence, causing errors in edge cases

* added maximize button on resizable windows

* fixed infinite loop when resizing the window manually

* activate window upon creation to set focus and show taskbar icon

* extended SanitizeFlags() to account for problematic resizing/mizing flag mixups
This commit is contained in:
mikeemm
2026-02-04 19:37:12 +01:00
committed by GitHub
parent ccfa3f762a
commit 4c1efc2bd3

View File

@ -141,7 +141,7 @@ static PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = NULL;
#define STYLE_MASK_READONLY (WS_MINIMIZE | WS_MAXIMIZE) #define STYLE_MASK_READONLY (WS_MINIMIZE | WS_MAXIMIZE)
#define STYLE_MASK_WRITABLE (~STYLE_MASK_READONLY) #define STYLE_MASK_WRITABLE (~STYLE_MASK_READONLY)
#define STYLE_FLAGS_RESIZABLE WS_THICKFRAME #define STYLE_FLAGS_RESIZABLE (WS_THICKFRAME | WS_MAXIMIZEBOX)
#define STYLE_FLAGS_UNDECORATED_OFF (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX) #define STYLE_FLAGS_UNDECORATED_OFF (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)
#define STYLE_FLAGS_UNDECORATED_ON WS_POPUP #define STYLE_FLAGS_UNDECORATED_ON WS_POPUP
@ -270,8 +270,8 @@ static DWORD MakeWindowStyle(unsigned flags)
// Minimized takes precedence over maximized // Minimized takes precedence over maximized
int mized = MIZED_NONE; int mized = MIZED_NONE;
if (FLAG_IS_SET(flags, FLAG_WINDOW_MINIMIZED)) mized = MIZED_MIN; if (flags & FLAG_WINDOW_MINIMIZED) mized = MIZED_MIN;
if (flags & FLAG_WINDOW_MAXIMIZED) mized = MIZED_MAX; else if (flags & FLAG_WINDOW_MAXIMIZED) mized = MIZED_MAX;
switch (mized) switch (mized)
{ {
@ -1590,8 +1590,6 @@ int InitPlatform(void)
if (rlGetVersion() == RL_OPENGL_11_SOFTWARE) // Using software renderer if (rlGetVersion() == RL_OPENGL_11_SOFTWARE) // Using software renderer
{ {
//ShowWindow(platform.hwnd, SW_SHOWDEFAULT); //SW_SHOWNORMAL
// Initialize software framebuffer // Initialize software framebuffer
BITMAPINFO bmi = { 0 }; BITMAPINFO bmi = { 0 };
ZeroMemory(&bmi, sizeof(bmi)); ZeroMemory(&bmi, sizeof(bmi));
@ -1620,6 +1618,9 @@ int InitPlatform(void)
CORE.Window.ready = true; CORE.Window.ready = true;
// Activate window to set focus and show taskbar icon
ShowWindow(platform.hwnd, SW_SHOWDEFAULT);
// Update flags (in case of deferred state change required) // Update flags (in case of deferred state change required)
UpdateFlags(platform.hwnd, platform.desiredFlags, platform.appScreenWidth, platform.appScreenHeight); UpdateFlags(platform.hwnd, platform.desiredFlags, platform.appScreenWidth, platform.appScreenHeight);
@ -1916,6 +1917,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpara
EndPaint(hwnd, &ps); EndPaint(hwnd, &ps);
} }
else DefWindowProc(hwnd, msg, wparam, lparam);
} }
case WM_INPUT: case WM_INPUT:
{ {
@ -2090,10 +2092,10 @@ static void UpdateWindowStyle(HWND hwnd, unsigned desiredFlags)
// Minimized takes precedence over maximized // Minimized takes precedence over maximized
Mized currentMized = MIZED_NONE; Mized currentMized = MIZED_NONE;
Mized desiredMized = MIZED_NONE; Mized desiredMized = MIZED_NONE;
if (CORE.Window.flags & WS_MINIMIZE) currentMized = MIZED_MIN; if (CORE.Window.flags & FLAG_WINDOW_MINIMIZED) currentMized = MIZED_MIN;
else if (CORE.Window.flags & WS_MAXIMIZE) currentMized = MIZED_MAX; else if (CORE.Window.flags & FLAG_WINDOW_MAXIMIZED) currentMized = MIZED_MAX;
if (desiredFlags & WS_MINIMIZE) currentMized = MIZED_MIN; if (desiredFlags & FLAG_WINDOW_MINIMIZED) desiredMized = MIZED_MIN;
else if (desiredFlags & WS_MAXIMIZE) currentMized = MIZED_MAX; else if (desiredFlags & FLAG_WINDOW_MAXIMIZED) desiredMized = MIZED_MAX;
if (currentMized != desiredMized) if (currentMized != desiredMized)
{ {
@ -2109,12 +2111,43 @@ static void UpdateWindowStyle(HWND hwnd, unsigned desiredFlags)
// Sanitize flags // Sanitize flags
static unsigned SanitizeFlags(int mode, unsigned flags) static unsigned SanitizeFlags(int mode, unsigned flags)
{ {
if ((flags & FLAG_WINDOW_MAXIMIZED) && (flags & FLAG_BORDERLESS_WINDOWED_MODE)) if (flags & FLAG_WINDOW_MAXIMIZED)
{
if (flags & FLAG_BORDERLESS_WINDOWED_MODE)
{ {
TRACELOG(LOG_WARNING, "WIN32: WINDOW: Borderless windows mode overriding maximized window flag"); TRACELOG(LOG_WARNING, "WIN32: WINDOW: Borderless windows mode overriding maximized window flag");
flags &= ~FLAG_WINDOW_MAXIMIZED; flags &= ~FLAG_WINDOW_MAXIMIZED;
} }
if (~flags & FLAG_WINDOW_RESIZABLE)
{
if (!(CORE.Window.flags & FLAG_WINDOW_MAXIMIZED))
{
TRACELOG(LOG_WARNING, "WIN32: WINDOW: Cannot maximize a non-resizable window");
flags &= ~FLAG_WINDOW_MAXIMIZED;
}
else if (CORE.Window.flags & FLAG_WINDOW_RESIZABLE)
{
TRACELOG(LOG_WARNING, "WIN32: WINDOW: Cannot set window as non-resizable when maximized");
flags |= FLAG_WINDOW_RESIZABLE;
}
}
else if (!(CORE.Window.flags & FLAG_WINDOW_MAXIMIZED))
{
if (CORE.Window.flags & FLAG_WINDOW_MINIMIZED)
{
// Window needs to be unminimized before it can be maximized since minimizing takes precedence
flags &= ~FLAG_WINDOW_MINIMIZED;
}
else if ((flags & FLAG_WINDOW_MINIMIZED) && !(CORE.Window.flags & FLAG_WINDOW_MINIMIZED))
{
TRACELOG(LOG_WARNING, "WIN32: WINDOW: Cannot minimize and maximize a window in the same frame");
flags &= ~FLAG_WINDOW_MINIMIZED;
flags &= ~FLAG_WINDOW_MAXIMIZED;
}
}
}
if (mode == 1) if (mode == 1)
{ {
if ((flags & FLAG_MSAA_4X_HINT) && (!(CORE.Window.flags & FLAG_MSAA_4X_HINT))) if ((flags & FLAG_MSAA_4X_HINT) && (!(CORE.Window.flags & FLAG_MSAA_4X_HINT)))