Browse Source

Reset the window icon when returning from fullscreen mode

Fixes https://github.com/libsdl-org/SDL/issues/14522
Sam Lantinga 2 weeks ago
parent
commit
8fa93d64ab
2 changed files with 18 additions and 3 deletions
  1. 17 3
      src/video/windows/SDL_windowswindow.c
  2. 1 0
      src/video/windows/SDL_windowswindow.h

+ 17 - 3
src/video/windows/SDL_windowswindow.c

@@ -582,7 +582,6 @@ static void CleanupWindowData(SDL_VideoDevice *_this, SDL_Window *window)
     SDL_WindowData *data = window->internal;
 
     if (data) {
-
 #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
         if (data->drop_target) {
             WIN_AcceptDragAndDrop(window, false);
@@ -591,6 +590,9 @@ static void CleanupWindowData(SDL_VideoDevice *_this, SDL_Window *window)
         if (data->keyboard_hook) {
             UnhookWindowsHookEx(data->keyboard_hook);
         }
+        if (data->hicon) {
+            DestroyIcon(data->hicon);
+        }
         ReleaseDC(data->hwnd, data->hdc);
         RemoveProp(data->hwnd, TEXT("SDL_WindowData"));
 #endif
@@ -837,7 +839,8 @@ void WIN_SetWindowTitle(SDL_VideoDevice *_this, SDL_Window *window)
 bool WIN_SetWindowIcon(SDL_VideoDevice *_this, SDL_Window *window, SDL_Surface *icon)
 {
 #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)
-    HWND hwnd = window->internal->hwnd;
+    SDL_WindowData *data = window->internal;
+    HWND hwnd = data->hwnd;
     HICON hicon = NULL;
     BYTE *icon_bmp;
     int icon_len, mask_len, row_len, y;
@@ -888,9 +891,14 @@ bool WIN_SetWindowIcon(SDL_VideoDevice *_this, SDL_Window *window, SDL_Surface *
     SDL_small_free(icon_bmp, isstack);
 
     if (!hicon) {
-        result = SDL_SetError("SetWindowIcon() failed, error %08X", (unsigned int)GetLastError());
+        return SDL_SetError("SetWindowIcon() failed, error %08X", (unsigned int)GetLastError());
     }
 
+    if (data->hicon) {
+        DestroyIcon(data->hicon);
+    }
+    data->hicon = hicon;
+
     // Set the icon for the window
     SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);
 
@@ -1364,6 +1372,12 @@ SDL_FullscreenResult WIN_SetWindowFullscreen(SDL_VideoDevice *_this, SDL_Window
         WIN_MaximizeWindow(_this, window);
     }
 
+    if (!fullscreen && data && data->hicon) {
+        // Reset the icon for the window when returning from fullscreen mode
+        SendMessage(hwnd, WM_SETICON, ICON_SMALL, 0);
+        SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)data->hicon);
+    }
+
 #ifdef HIGHDPI_DEBUG
     SDL_Log("WIN_SetWindowFullscreen: %d finished. Set window to %d,%d, %dx%d", (int)fullscreen, x, y, w, h);
 #endif

+ 1 - 0
src/video/windows/SDL_windowswindow.h

@@ -68,6 +68,7 @@ struct SDL_WindowData
     HDC mdc;
     HINSTANCE hinstance;
     HBITMAP hbm;
+    HICON hicon;
     WNDPROC wndproc;
     HHOOK keyboard_hook;
     WPARAM mouse_button_flags;