Browse Source

Fixed bug 2841 - Hint to set resource id for window icon

Alexey

Seems to be a missing functionality. I want to set an icon from RC file. I cant pass MAKEINTRESOURCE(X) string to SDL_RegisterApp() cause string returned by MAKEINTRESOURCE string is not actually a string and SDL_strlen will crash. Moreover LoadImage seems to be loading wrong icon size. LoadIcon seems to be fine.
Sam Lantinga 7 years ago
parent
commit
c87e1d525c
2 changed files with 21 additions and 3 deletions
  1. 6 0
      include/SDL_hints.h
  2. 15 3
      src/video/windows/SDL_windowsevents.c

+ 6 - 0
include/SDL_hints.h

@@ -221,6 +221,12 @@ extern "C" {
  */
 #define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN    "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN"
 
+/**
+ * \brief A variable to specify custom icon resource id from RC file on Windows platform 
+ */
+#define SDL_HINT_WINDOWS_INTRESOURCE_ICON       "SDL_WINDOWS_INTRESOURCE_ICON"
+#define SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL "SDL_WINDOWS_INTRESOURCE_ICON_SMALL"
+
 /**
  *  \brief  A variable controlling whether the windows message loop is processed by SDL 
  *

+ 15 - 3
src/video/windows/SDL_windowsevents.c

@@ -28,6 +28,7 @@
 #include "SDL_syswm.h"
 #include "SDL_timer.h"
 #include "SDL_vkeys.h"
+#include "SDL_hints.h"
 #include "../../events/SDL_events_c.h"
 #include "../../events/SDL_touch_c.h"
 #include "../../events/scancodes_windows.h"
@@ -1070,6 +1071,7 @@ HINSTANCE SDL_Instance = NULL;
 int
 SDL_RegisterApp(char *name, Uint32 style, void *hInst)
 {
+    const char *hint;
     WNDCLASSEX wcex;
     TCHAR path[MAX_PATH];
 
@@ -1106,9 +1108,19 @@ SDL_RegisterApp(char *name, Uint32 style, void *hInst)
     wcex.cbClsExtra     = 0;
     wcex.cbWndExtra     = 0;
 
-    /* Use the first icon as a default icon, like in the Explorer */
-    GetModuleFileName(SDL_Instance, path, MAX_PATH);
-    ExtractIconEx(path, 0, &wcex.hIcon, &wcex.hIconSm, 1);
+    hint = SDL_GetHint(SDL_HINT_WINDOWS_INTRESOURCE_ICON);
+    if (hint && *hint) {
+        wcex.hIcon = LoadIcon(SDL_Instance, MAKEINTRESOURCE(SDL_atoi(hint)));
+
+        hint = SDL_GetHint(SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL);
+        if (hint && *hint) {
+            wcex.hIconSm = LoadIcon(SDL_Instance, MAKEINTRESOURCE(SDL_atoi(hint)));
+        }
+    } else {
+        /* Use the first icon as a default icon, like in the Explorer */
+        GetModuleFileName(SDL_Instance, path, MAX_PATH);
+        ExtractIconEx(path, 0, &wcex.hIcon, &wcex.hIconSm, 1);
+    }
 
     if (!RegisterClassEx(&wcex)) {
         return SDL_SetError("Couldn't register application class");