From 951dfb930dcf78679274dd8949c36ad16649594d Mon Sep 17 00:00:00 2001 From: Yadciel Date: Fri, 8 May 2026 10:36:06 +0200 Subject: [PATCH] =?UTF-8?q?F=C3=BCge=20UTF-8-Unterst=C3=BCtzung=20f=C3=BCr?= =?UTF-8?q?=20Windows=20Tray=20hinzu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Konvertiert Menütexte und Tooltips von UTF-8 zu UTF-16, um die korrekte Anzeige von Nicht-ASCII-Zeichen (z.B. Umlaute) im System-Tray sicherzustellen. --- tray_windows.c | 55 +++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/tray_windows.c b/tray_windows.c index ecd2221..a286501 100644 --- a/tray_windows.c +++ b/tray_windows.c @@ -62,29 +62,39 @@ 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) { - InsertMenu(hmenu, *id, MF_SEPARATOR, TRUE, ""); + InsertMenuW(hmenu, *id, MF_SEPARATOR, TRUE, L""); } else { - MENUITEMINFO item; - memset(&item, 0, sizeof(item)); - item.cbSize = sizeof(MENUITEMINFO); - item.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA; - item.fType = 0; - item.fState = 0; - if (m->submenu != NULL) { - item.fMask = item.fMask | MIIM_SUBMENU; - item.hSubMenu = _tray_menu(m->submenu, id); - } - if (m->disabled) { - item.fState |= MFS_DISABLED; - } - if (m->checked) { - item.fState |= MFS_CHECKED; - } - item.wID = *id; - item.dwTypeData = (LPSTR)m->text; - item.dwItemData = (ULONG_PTR)m; + // UTF-8 zu UTF-16 (WCHAR) konvertieren + int len = MultiByteToWideChar(CP_UTF8, 0, m->text, -1, NULL, 0); + if (len > 0) { + wchar_t *wtext = (wchar_t*)malloc(len * sizeof(wchar_t)); + if (wtext) { + MultiByteToWideChar(CP_UTF8, 0, m->text, -1, wtext, len); - InsertMenuItem(hmenu, *id, TRUE, &item); + MENUITEMINFOW item; + memset(&item, 0, sizeof(item)); + item.cbSize = sizeof(MENUITEMINFOW); + item.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA; + item.fType = 0; + item.fState = 0; + if (m->submenu != NULL) { + item.fMask = item.fMask | MIIM_SUBMENU; + item.hSubMenu = _tray_menu(m->submenu, id); + } + if (m->disabled) { + item.fState |= MFS_DISABLED; + } + if (m->checked) { + item.fState |= MFS_CHECKED; + } + item.wID = *id; + item.dwTypeData = wtext; + item.dwItemData = (ULONG_PTR)m; + + InsertMenuItemW(hmenu, *id, TRUE, &item); + free(wtext); + } + } } } return hmenu; @@ -156,8 +166,7 @@ void tray_update(struct tray *tray) { g_icon_is_shared = icon_is_shared; } if(tray->tooltip != 0 && strlen(tray->tooltip) > 0) { - strncpy(nid.szTip, tray->tooltip, sizeof(nid.szTip) - 1); - nid.szTip[sizeof(nid.szTip) - 1] = '\0'; + MultiByteToWideChar(CP_UTF8, 0, tray->tooltip, -1, nid.szTip, sizeof(nid.szTip)/sizeof(wchar_t)); nid.uFlags |= NIF_TIP; } Shell_NotifyIcon(NIM_MODIFY, &nid);