forked from Yadciel/c_tray
implemented nested submenus in winapi
This commit is contained in:
59
tray.h
59
tray.h
@@ -218,6 +218,38 @@ static LRESULT CALLBACK _tray_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam,
|
|||||||
return DefWindowProc(hwnd, msg, wparam, lparam);
|
return DefWindowProc(hwnd, msg, wparam, lparam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HMENU _tray_menu(struct tray_menu *m) {
|
||||||
|
HMENU hmenu = CreatePopupMenu();
|
||||||
|
for (int i = 0; m != NULL && m->text != NULL; m++, i++) {
|
||||||
|
if (strcmp(m->text, "-") == 0) {
|
||||||
|
InsertMenu(hmenu, i, MF_SEPARATOR, TRUE, "");
|
||||||
|
} 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);
|
||||||
|
}
|
||||||
|
if (m->disabled) {
|
||||||
|
item.fState |= MFS_DISABLED;
|
||||||
|
}
|
||||||
|
if (m->checked) {
|
||||||
|
item.fState |= MFS_CHECKED;
|
||||||
|
}
|
||||||
|
item.wID = i + ID_TRAY_FIRST;
|
||||||
|
item.dwTypeData = m->text;
|
||||||
|
item.dwItemData = (ULONG_PTR)m;
|
||||||
|
|
||||||
|
InsertMenuItem(hmenu, i, TRUE, &item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hmenu;
|
||||||
|
}
|
||||||
|
|
||||||
static int tray_init(struct tray *tray) {
|
static int tray_init(struct tray *tray) {
|
||||||
memset(&wc, 0, sizeof(wc));
|
memset(&wc, 0, sizeof(wc));
|
||||||
wc.cbSize = sizeof(WNDCLASSEX);
|
wc.cbSize = sizeof(WNDCLASSEX);
|
||||||
@@ -263,32 +295,7 @@ static int tray_loop(int blocking) {
|
|||||||
|
|
||||||
static void tray_update(struct tray *tray) {
|
static void tray_update(struct tray *tray) {
|
||||||
HMENU prevmenu = hmenu;
|
HMENU prevmenu = hmenu;
|
||||||
int i = 0;
|
hmenu = _tray_menu(tray->menu);
|
||||||
hmenu = CreatePopupMenu();
|
|
||||||
for (struct tray_menu *m = tray->menu; m != NULL && m->text != NULL;
|
|
||||||
m++, i++) {
|
|
||||||
if (strcmp(m->text, "-") == 0) {
|
|
||||||
InsertMenu(hmenu, i, MF_SEPARATOR, TRUE, "");
|
|
||||||
} 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->disabled) {
|
|
||||||
item.fState |= MFS_DISABLED;
|
|
||||||
}
|
|
||||||
if (m->checked) {
|
|
||||||
item.fState |= MFS_CHECKED;
|
|
||||||
}
|
|
||||||
item.wID = i + ID_TRAY_FIRST;
|
|
||||||
item.dwTypeData = m->text;
|
|
||||||
item.dwItemData = (ULONG_PTR)m;
|
|
||||||
|
|
||||||
InsertMenuItem(hmenu, i, TRUE, &item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SendMessage(hwnd, WM_INITMENUPOPUP, (WPARAM)hmenu, 0);
|
SendMessage(hwnd, WM_INITMENUPOPUP, (WPARAM)hmenu, 0);
|
||||||
HICON icon;
|
HICON icon;
|
||||||
ExtractIconEx(tray->icon, 0, NULL, &icon, 1);
|
ExtractIconEx(tray->icon, 0, NULL, &icon, 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user