Füge UTF-8-Unterstützung für Windows Tray hinzu

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.
This commit is contained in:
2026-05-08 10:36:06 +02:00
parent a71be4e1e3
commit 951dfb930d

View File

@@ -62,29 +62,39 @@ static HMENU _tray_menu(struct tray_menu *m, UINT *id) {
HMENU hmenu = CreatePopupMenu(); HMENU hmenu = CreatePopupMenu();
for (; m != NULL && m->text != NULL; m++, (*id)++) { for (; m != NULL && m->text != NULL; m++, (*id)++) {
if (strcmp(m->text, "-") == 0) { if (strcmp(m->text, "-") == 0) {
InsertMenu(hmenu, *id, MF_SEPARATOR, TRUE, ""); InsertMenuW(hmenu, *id, MF_SEPARATOR, TRUE, L"");
} else { } else {
MENUITEMINFO item; // UTF-8 zu UTF-16 (WCHAR) konvertieren
memset(&item, 0, sizeof(item)); int len = MultiByteToWideChar(CP_UTF8, 0, m->text, -1, NULL, 0);
item.cbSize = sizeof(MENUITEMINFO); if (len > 0) {
item.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA; wchar_t *wtext = (wchar_t*)malloc(len * sizeof(wchar_t));
item.fType = 0; if (wtext) {
item.fState = 0; MultiByteToWideChar(CP_UTF8, 0, m->text, -1, wtext, len);
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;
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; return hmenu;
@@ -156,8 +166,7 @@ void tray_update(struct tray *tray) {
g_icon_is_shared = icon_is_shared; g_icon_is_shared = icon_is_shared;
} }
if(tray->tooltip != 0 && strlen(tray->tooltip) > 0) { if(tray->tooltip != 0 && strlen(tray->tooltip) > 0) {
strncpy(nid.szTip, tray->tooltip, sizeof(nid.szTip) - 1); MultiByteToWideChar(CP_UTF8, 0, tray->tooltip, -1, nid.szTip, sizeof(nid.szTip)/sizeof(wchar_t));
nid.szTip[sizeof(nid.szTip) - 1] = '\0';
nid.uFlags |= NIF_TIP; nid.uFlags |= NIF_TIP;
} }
Shell_NotifyIcon(NIM_MODIFY, &nid); Shell_NotifyIcon(NIM_MODIFY, &nid);