From 0aa319e4f985abf6370f404bbaf5dbce6754b6be Mon Sep 17 00:00:00 2001
From: Scrooge86x <[EMAIL REDACTED]>
Date: Tue, 14 Jan 2025 01:56:52 +0100
Subject: [PATCH] Added support for custom tray icon on Windows via SDL hints.
SDL_CreateTray now respects SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL
and SDL_HINT_WINDOWS_INTRESOURCE_ICON hints and uses the specified icon
as the tray icon.
---
src/tray/windows/SDL_tray.c | 30 ++++++++++++++++++++++++++----
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/src/tray/windows/SDL_tray.c b/src/tray/windows/SDL_tray.c
index c73a1d5510fd1..526c19004ef18 100644
--- a/src/tray/windows/SDL_tray.c
+++ b/src/tray/windows/SDL_tray.c
@@ -187,6 +187,28 @@ static wchar_t *escape_label(const char *in)
return out;
}
+static HICON load_default_icon()
+{
+ HINSTANCE hInstance = GetModuleHandle(NULL);
+ if (!hInstance) {
+ return LoadIcon(NULL, IDI_APPLICATION);
+ }
+
+ const char *hint = SDL_GetHint(SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL);
+ if (hint && *hint) {
+ HICON icon = LoadIcon(hInstance, MAKEINTRESOURCE(SDL_atoi(hint)));
+ return icon ? icon : LoadIcon(NULL, IDI_APPLICATION);
+ }
+
+ hint = SDL_GetHint(SDL_HINT_WINDOWS_INTRESOURCE_ICON);
+ if (hint && *hint) {
+ HICON icon = LoadIcon(hInstance, MAKEINTRESOURCE(SDL_atoi(hint)));
+ return icon ? icon : LoadIcon(NULL, IDI_APPLICATION);
+ }
+
+ return LoadIcon(NULL, IDI_APPLICATION);
+}
+
SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip)
{
SDL_Tray *tray = (SDL_Tray *)SDL_malloc(sizeof(*tray));
@@ -216,12 +238,12 @@ SDL_Tray *SDL_CreateTray(SDL_Surface *icon, const char *tooltip)
tray->nid.hIcon = CreateIconFromSurface(icon);
if (!tray->nid.hIcon) {
- tray->nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ tray->nid.hIcon = load_default_icon();
}
tray->icon = tray->nid.hIcon;
} else {
- tray->nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ tray->nid.hIcon = load_default_icon();
tray->icon = tray->nid.hIcon;
}
@@ -245,12 +267,12 @@ void SDL_SetTrayIcon(SDL_Tray *tray, SDL_Surface *icon)
tray->nid.hIcon = CreateIconFromSurface(icon);
if (!tray->nid.hIcon) {
- tray->nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ tray->nid.hIcon = load_default_icon();
}
tray->icon = tray->nid.hIcon;
} else {
- tray->nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ tray->nid.hIcon = load_default_icon();
tray->icon = tray->nid.hIcon;
}