From f2ed5c7a1b981b903e36d6d32d4a793ca64cc970 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Wed, 19 Mar 2025 22:00:42 -0700
Subject: [PATCH] Fix illegal calls to DwmGetWindowAttribute()
DWMWA_WINDOW_CORNER_PREFERENCE and DWMWA_BORDER_COLOR are only supported for DwmSetWindowAttribute(), they can't be queried.
Fixes https://github.com/libsdl-org/SDL/issues/12206
Closes https://github.com/libsdl-org/SDL/pull/12209
---
src/video/windows/SDL_windowswindow.c | 29 ++++++++-------------------
src/video/windows/SDL_windowswindow.h | 2 --
2 files changed, 8 insertions(+), 23 deletions(-)
diff --git a/src/video/windows/SDL_windowswindow.c b/src/video/windows/SDL_windowswindow.c
index daaa90713ffb2..4e2d412e06f62 100644
--- a/src/video/windows/SDL_windowswindow.c
+++ b/src/video/windows/SDL_windowswindow.c
@@ -447,7 +447,6 @@ static bool SetupWindowData(SDL_VideoDevice *_this, SDL_Window *window, HWND hwn
data->videodata = videodata;
data->initializing = true;
data->last_displayID = window->last_displayID;
- data->dwma_border_color = DWMWA_COLOR_DEFAULT;
data->hint_erase_background_mode = GetEraseBackgroundModeHint();
@@ -1265,42 +1264,30 @@ void WIN_RestoreWindow(SDL_VideoDevice *_this, SDL_Window *window)
}
}
-static DWM_WINDOW_CORNER_PREFERENCE WIN_UpdateCornerRoundingForHWND(HWND hwnd, DWM_WINDOW_CORNER_PREFERENCE cornerPref)
+static void WIN_UpdateCornerRoundingForHWND(HWND hwnd, DWM_WINDOW_CORNER_PREFERENCE cornerPref)
{
- DWM_WINDOW_CORNER_PREFERENCE oldPref = DWMWCP_DEFAULT;
-
SDL_SharedObject *handle = SDL_LoadObject("dwmapi.dll");
if (handle) {
- DwmGetWindowAttribute_t DwmGetWindowAttributeFunc = (DwmGetWindowAttribute_t)SDL_LoadFunction(handle, "DwmGetWindowAttribute");
DwmSetWindowAttribute_t DwmSetWindowAttributeFunc = (DwmSetWindowAttribute_t)SDL_LoadFunction(handle, "DwmSetWindowAttribute");
- if (DwmGetWindowAttributeFunc && DwmSetWindowAttributeFunc) {
- DwmGetWindowAttributeFunc(hwnd, DWMWA_WINDOW_CORNER_PREFERENCE, &oldPref, sizeof(oldPref));
+ if (DwmSetWindowAttributeFunc) {
DwmSetWindowAttributeFunc(hwnd, DWMWA_WINDOW_CORNER_PREFERENCE, &cornerPref, sizeof(cornerPref));
}
SDL_UnloadObject(handle);
}
-
- return oldPref;
}
-static COLORREF WIN_UpdateBorderColorForHWND(HWND hwnd, COLORREF colorRef)
+static void WIN_UpdateBorderColorForHWND(HWND hwnd, COLORREF colorRef)
{
- COLORREF oldPref = DWMWA_COLOR_DEFAULT;
-
SDL_SharedObject *handle = SDL_LoadObject("dwmapi.dll");
if (handle) {
- DwmGetWindowAttribute_t DwmGetWindowAttributeFunc = (DwmGetWindowAttribute_t)SDL_LoadFunction(handle, "DwmGetWindowAttribute");
DwmSetWindowAttribute_t DwmSetWindowAttributeFunc = (DwmSetWindowAttribute_t)SDL_LoadFunction(handle, "DwmSetWindowAttribute");
- if (DwmGetWindowAttributeFunc && DwmSetWindowAttributeFunc) {
- DwmGetWindowAttributeFunc(hwnd, DWMWA_BORDER_COLOR, &oldPref, sizeof(oldPref));
+ if (DwmSetWindowAttributeFunc) {
DwmSetWindowAttributeFunc(hwnd, DWMWA_BORDER_COLOR, &colorRef, sizeof(colorRef));
}
SDL_UnloadObject(handle);
}
-
- return oldPref;
}
/**
@@ -1366,13 +1353,13 @@ SDL_FullscreenResult WIN_SetWindowFullscreen(SDL_VideoDevice *_this, SDL_Window
}
// Disable corner rounding & border color (Windows 11+) so the window fills the full screen
- data->windowed_mode_corner_rounding = WIN_UpdateCornerRoundingForHWND(hwnd, DWMWCP_DONOTROUND);
- data->dwma_border_color = WIN_UpdateBorderColorForHWND(hwnd, DWMWA_COLOR_NONE);
+ WIN_UpdateCornerRoundingForHWND(hwnd, DWMWCP_DONOTROUND);
+ WIN_UpdateBorderColorForHWND(hwnd, DWMWA_COLOR_NONE);
} else {
BOOL menu;
- WIN_UpdateCornerRoundingForHWND(hwnd, (DWM_WINDOW_CORNER_PREFERENCE)data->windowed_mode_corner_rounding);
- WIN_UpdateBorderColorForHWND(hwnd, data->dwma_border_color);
+ WIN_UpdateCornerRoundingForHWND(hwnd, DWMWCP_DEFAULT);
+ WIN_UpdateBorderColorForHWND(hwnd, DWMWA_COLOR_DEFAULT);
/* Restore window-maximization state, as applicable.
Special care is taken to *not* do this if and when we're
diff --git a/src/video/windows/SDL_windowswindow.h b/src/video/windows/SDL_windowswindow.h
index a2c9a2110fe3d..3d1aaed0a24fb 100644
--- a/src/video/windows/SDL_windowswindow.h
+++ b/src/video/windows/SDL_windowswindow.h
@@ -87,8 +87,6 @@ struct SDL_WindowData
RECT initial_size_rect;
RECT cursor_clipped_rect; // last successfully committed clipping rect for this window
RECT cursor_ctrlock_rect; // this is Windows-specific, but probably does not need to be per-window
- UINT windowed_mode_corner_rounding;
- COLORREF dwma_border_color;
bool mouse_tracked;
bool destroy_parent_with_window;
SDL_DisplayID last_displayID;