Browse Source

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

(cherry picked from commit f2ed5c7a1b981b903e36d6d32d4a793ca64cc970)
Sam Lantinga 1 month ago
parent
commit
ff90984dc3
2 changed files with 8 additions and 23 deletions
  1. 8 21
      src/video/windows/SDL_windowswindow.c
  2. 0 2
      src/video/windows/SDL_windowswindow.h

+ 8 - 21
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

+ 0 - 2
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;