Skip to content

Commit 4c1efc2

Browse files
authored
[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
1 parent ccfa3f7 commit 4c1efc2

1 file changed

Lines changed: 45 additions & 12 deletions

File tree

src/platforms/rcore_desktop_win32.c

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ static PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = NULL;
141141
#define STYLE_MASK_READONLY (WS_MINIMIZE | WS_MAXIMIZE)
142142
#define STYLE_MASK_WRITABLE (~STYLE_MASK_READONLY)
143143

144-
#define STYLE_FLAGS_RESIZABLE WS_THICKFRAME
144+
#define STYLE_FLAGS_RESIZABLE (WS_THICKFRAME | WS_MAXIMIZEBOX)
145145

146146
#define STYLE_FLAGS_UNDECORATED_OFF (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)
147147
#define STYLE_FLAGS_UNDECORATED_ON WS_POPUP
@@ -270,8 +270,8 @@ static DWORD MakeWindowStyle(unsigned flags)
270270

271271
// Minimized takes precedence over maximized
272272
int mized = MIZED_NONE;
273-
if (FLAG_IS_SET(flags, FLAG_WINDOW_MINIMIZED)) mized = MIZED_MIN;
274-
if (flags & FLAG_WINDOW_MAXIMIZED) mized = MIZED_MAX;
273+
if (flags & FLAG_WINDOW_MINIMIZED) mized = MIZED_MIN;
274+
else if (flags & FLAG_WINDOW_MAXIMIZED) mized = MIZED_MAX;
275275

276276
switch (mized)
277277
{
@@ -1590,8 +1590,6 @@ int InitPlatform(void)
15901590

15911591
if (rlGetVersion() == RL_OPENGL_11_SOFTWARE) // Using software renderer
15921592
{
1593-
//ShowWindow(platform.hwnd, SW_SHOWDEFAULT); //SW_SHOWNORMAL
1594-
15951593
// Initialize software framebuffer
15961594
BITMAPINFO bmi = { 0 };
15971595
ZeroMemory(&bmi, sizeof(bmi));
@@ -1620,6 +1618,9 @@ int InitPlatform(void)
16201618

16211619
CORE.Window.ready = true;
16221620

1621+
// Activate window to set focus and show taskbar icon
1622+
ShowWindow(platform.hwnd, SW_SHOWDEFAULT);
1623+
16231624
// Update flags (in case of deferred state change required)
16241625
UpdateFlags(platform.hwnd, platform.desiredFlags, platform.appScreenWidth, platform.appScreenHeight);
16251626

@@ -1916,6 +1917,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpara
19161917

19171918
EndPaint(hwnd, &ps);
19181919
}
1920+
else DefWindowProc(hwnd, msg, wparam, lparam);
19191921
}
19201922
case WM_INPUT:
19211923
{
@@ -2090,10 +2092,10 @@ static void UpdateWindowStyle(HWND hwnd, unsigned desiredFlags)
20902092
// Minimized takes precedence over maximized
20912093
Mized currentMized = MIZED_NONE;
20922094
Mized desiredMized = MIZED_NONE;
2093-
if (CORE.Window.flags & WS_MINIMIZE) currentMized = MIZED_MIN;
2094-
else if (CORE.Window.flags & WS_MAXIMIZE) currentMized = MIZED_MAX;
2095-
if (desiredFlags & WS_MINIMIZE) currentMized = MIZED_MIN;
2096-
else if (desiredFlags & WS_MAXIMIZE) currentMized = MIZED_MAX;
2095+
if (CORE.Window.flags & FLAG_WINDOW_MINIMIZED) currentMized = MIZED_MIN;
2096+
else if (CORE.Window.flags & FLAG_WINDOW_MAXIMIZED) currentMized = MIZED_MAX;
2097+
if (desiredFlags & FLAG_WINDOW_MINIMIZED) desiredMized = MIZED_MIN;
2098+
else if (desiredFlags & FLAG_WINDOW_MAXIMIZED) desiredMized = MIZED_MAX;
20972099

20982100
if (currentMized != desiredMized)
20992101
{
@@ -2109,10 +2111,41 @@ static void UpdateWindowStyle(HWND hwnd, unsigned desiredFlags)
21092111
// Sanitize flags
21102112
static unsigned SanitizeFlags(int mode, unsigned flags)
21112113
{
2112-
if ((flags & FLAG_WINDOW_MAXIMIZED) && (flags & FLAG_BORDERLESS_WINDOWED_MODE))
2114+
if (flags & FLAG_WINDOW_MAXIMIZED)
21132115
{
2114-
TRACELOG(LOG_WARNING, "WIN32: WINDOW: Borderless windows mode overriding maximized window flag");
2115-
flags &= ~FLAG_WINDOW_MAXIMIZED;
2116+
if (flags & FLAG_BORDERLESS_WINDOWED_MODE)
2117+
{
2118+
TRACELOG(LOG_WARNING, "WIN32: WINDOW: Borderless windows mode overriding maximized window flag");
2119+
flags &= ~FLAG_WINDOW_MAXIMIZED;
2120+
}
2121+
2122+
if (~flags & FLAG_WINDOW_RESIZABLE)
2123+
{
2124+
if (!(CORE.Window.flags & FLAG_WINDOW_MAXIMIZED))
2125+
{
2126+
TRACELOG(LOG_WARNING, "WIN32: WINDOW: Cannot maximize a non-resizable window");
2127+
flags &= ~FLAG_WINDOW_MAXIMIZED;
2128+
}
2129+
else if (CORE.Window.flags & FLAG_WINDOW_RESIZABLE)
2130+
{
2131+
TRACELOG(LOG_WARNING, "WIN32: WINDOW: Cannot set window as non-resizable when maximized");
2132+
flags |= FLAG_WINDOW_RESIZABLE;
2133+
}
2134+
}
2135+
else if (!(CORE.Window.flags & FLAG_WINDOW_MAXIMIZED))
2136+
{
2137+
if (CORE.Window.flags & FLAG_WINDOW_MINIMIZED)
2138+
{
2139+
// Window needs to be unminimized before it can be maximized since minimizing takes precedence
2140+
flags &= ~FLAG_WINDOW_MINIMIZED;
2141+
}
2142+
else if ((flags & FLAG_WINDOW_MINIMIZED) && !(CORE.Window.flags & FLAG_WINDOW_MINIMIZED))
2143+
{
2144+
TRACELOG(LOG_WARNING, "WIN32: WINDOW: Cannot minimize and maximize a window in the same frame");
2145+
flags &= ~FLAG_WINDOW_MINIMIZED;
2146+
flags &= ~FLAG_WINDOW_MAXIMIZED;
2147+
}
2148+
}
21162149
}
21172150

21182151
if (mode == 1)

0 commit comments

Comments
 (0)