mirror of
https://github.com/raysan5/raylib.git
synced 2026-02-06 06:09:17 -05:00
[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:
@ -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)))
|
||||||
|
|||||||
Reference in New Issue
Block a user