From fc77dda6434ad2bcdf1ad72c569783686d724dbd Mon Sep 17 00:00:00 2001 From: Yadciel Date: Fri, 8 May 2026 15:29:24 +0200 Subject: [PATCH] Migriere Windows Tray zu expliziten Wide-Character APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Diese Änderung stellt sicher, dass alle relevanten Windows API-Aufrufe und Datenstrukturen die Wide-Character (W-) Versionen verwenden. Dies gewährleistet eine konsistente und robuste Behandlung von Unicode-Zeichen, insbesondere nach der Einführung der UTF-8-Unterstützung für Menütexte und Tooltips. Zusätzlich wird die erzwungene statische Verlinkung der C-Laufzeitbibliothek (`/MT`) entfernt, um die Kompatibilität zu verbessern und die Binärgröße zu reduzieren, indem die standardmäßige dynamische Verlinkung ermöglicht wird. --- CMakeLists.txt | 1 - tray_windows.c | 34 ++++++++++++++++++---------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d2d5825..9767d80 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,6 @@ add_library(tray STATIC ${SRCS}) set_property(TARGET tray PROPERTY C_STANDARD 99) if(WIN32) target_compile_definitions(tray PRIVATE TRAY_WINAPI=1 WIN32_LEAN_AND_MEAN NOMINMAX) - target_compile_options(tray PRIVATE "/MT$<$:d>") else() if(UNIX) if(APPLE) diff --git a/tray_windows.c b/tray_windows.c index a286501..eee43a7 100644 --- a/tray_windows.c +++ b/tray_windows.c @@ -1,13 +1,15 @@ #include #include +#include +#include #include "tray.h" #define WM_TRAY_CALLBACK_MESSAGE (WM_USER + 1) -#define WC_TRAY_CLASS_NAME "TRAY" +#define WC_TRAY_CLASS_NAME L"TRAY" #define ID_TRAY_FIRST 1000 -static WNDCLASSEX wc; -static NOTIFYICONDATA nid; +static WNDCLASSEXW wc; +static NOTIFYICONDATAW nid; static HWND hwnd; static HMENU hmenu = NULL; static struct tray *g_tray = NULL; @@ -42,10 +44,10 @@ static LRESULT CALLBACK _tray_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, break; case WM_COMMAND: if (wparam >= ID_TRAY_FIRST) { - MENUITEMINFO item = { - .cbSize = sizeof(MENUITEMINFO), .fMask = MIIM_ID | MIIM_DATA, + MENUITEMINFOW item = { + .cbSize = sizeof(MENUITEMINFOW), .fMask = MIIM_ID | MIIM_DATA, }; - if (GetMenuItemInfo(hmenu, wparam, FALSE, &item)) { + if (GetMenuItemInfoW(hmenu, wparam, FALSE, &item)) { struct tray_menu *menu = (struct tray_menu *)item.dwItemData; if (menu != NULL && menu->cb != NULL) { menu->cb(menu); @@ -55,14 +57,14 @@ static LRESULT CALLBACK _tray_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, } break; } - return DefWindowProc(hwnd, msg, wparam, lparam); + return DefWindowProcW(hwnd, msg, wparam, lparam); } static HMENU _tray_menu(struct tray_menu *m, UINT *id) { HMENU hmenu = CreatePopupMenu(); for (; m != NULL && m->text != NULL; m++, (*id)++) { if (strcmp(m->text, "-") == 0) { - InsertMenuW(hmenu, *id, MF_SEPARATOR, TRUE, L""); + InsertMenuW(hmenu, *id, MF_BYPOSITION | MF_SEPARATOR, *id, L""); } else { // UTF-8 zu UTF-16 (WCHAR) konvertieren int len = MultiByteToWideChar(CP_UTF8, 0, m->text, -1, NULL, 0); @@ -102,15 +104,15 @@ static HMENU _tray_menu(struct tray_menu *m, UINT *id) { int tray_init(struct tray *tray) { memset(&wc, 0, sizeof(wc)); - wc.cbSize = sizeof(WNDCLASSEX); + wc.cbSize = sizeof(WNDCLASSEXW); wc.lpfnWndProc = _tray_wnd_proc; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = WC_TRAY_CLASS_NAME; - if (!RegisterClassEx(&wc)) { + if (!RegisterClassExW(&wc)) { return -1; } - hwnd = CreateWindowEx(0, WC_TRAY_CLASS_NAME, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0); + hwnd = CreateWindowExW(0, WC_TRAY_CLASS_NAME, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0); if (hwnd == NULL) { return -1; } @@ -122,7 +124,7 @@ int tray_init(struct tray *tray) { nid.uID = 0; nid.uFlags = NIF_ICON | NIF_MESSAGE; nid.uCallbackMessage = WM_TRAY_CALLBACK_MESSAGE; - Shell_NotifyIcon(NIM_ADD, &nid); + Shell_NotifyIconW(NIM_ADD, &nid); g_tray = tray; tray_update(tray); @@ -156,7 +158,7 @@ void tray_update(struct tray *tray) { icon = (HICON)tray->icon_handle; icon_is_shared = tray->icon_is_shared; } else if (tray->icon) { - ExtractIconEx(tray->icon, 0, NULL, &icon, 1); + ExtractIconExA(tray->icon, 0, NULL, &icon, 1); } if (nid.hIcon && !g_icon_is_shared) { DestroyIcon(nid.hIcon); @@ -169,7 +171,7 @@ void tray_update(struct tray *tray) { MultiByteToWideChar(CP_UTF8, 0, tray->tooltip, -1, nid.szTip, sizeof(nid.szTip)/sizeof(wchar_t)); nid.uFlags |= NIF_TIP; } - Shell_NotifyIcon(NIM_MODIFY, &nid); + Shell_NotifyIconW(NIM_MODIFY, &nid); if (prevmenu != NULL) { DestroyMenu(prevmenu); @@ -177,7 +179,7 @@ void tray_update(struct tray *tray) { } void tray_exit(void) { - Shell_NotifyIcon(NIM_DELETE, &nid); + Shell_NotifyIconW(NIM_DELETE, &nid); if (nid.hIcon != 0 && !g_icon_is_shared) { DestroyIcon(nid.hIcon); } @@ -185,6 +187,6 @@ void tray_exit(void) { DestroyMenu(hmenu); } PostQuitMessage(0); - UnregisterClass(WC_TRAY_CLASS_NAME, GetModuleHandle(NULL)); + UnregisterClassW(WC_TRAY_CLASS_NAME, GetModuleHandle(NULL)); }