Skip to content

Commit

Permalink
Fixed bug 2841 - Hint to set resource id for window icon
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
slouken committed Aug 13, 2017
1 parent 18cceb5 commit c87e1d5
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
6 changes: 6 additions & 0 deletions include/SDL_hints.h
Expand Up @@ -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
*
Expand Down
18 changes: 15 additions & 3 deletions src/video/windows/SDL_windowsevents.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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];

Expand Down Expand Up @@ -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");
Expand Down

0 comments on commit c87e1d5

Please sign in to comment.