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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user