void FillNotificationData(POPUPDATA2 *ppd, DWORD *disableWhen) { if (!IsValidNotification(ppd->lchNotification)) { *disableWhen = 0; return; } POPUPTREEDATA *ptd = (POPUPTREEDATA *)ppd->lchNotification; ppd->iSeconds = ptd->timeoutValue; *disableWhen = ptd->enabled ? ptd->disableWhen : 0xFFFFFFFF; LOGFONTA lf; // dummy to make FS happy (use LOGFONTA coz we use MS_FONT_GET) FontID fontid = { 0 }; // use ansi version of fontID coz POPUPNOTIFICATION use char fontid.cbSize = sizeof(fontid); mir_snprintf(fontid.group, PU_FNT_AND_COLOR"/%s", ptd->notification.lpzGroup); mir_snprintf(fontid.name, "%s (colors only)", ptd->notification.lpzName); ppd->colorText = (COLORREF)CallService(MS_FONT_GET, (WPARAM)&fontid, (LPARAM)&lf); ColourID colourid = { 0 }; // use ansi version of ColourID coz POPUPNOTIFICATION use char colourid.cbSize = sizeof(colourid); mir_snprintf(colourid.group, PU_FNT_AND_COLOR"/%s", ptd->notification.lpzGroup); mir_snprintf(colourid.name, "%s (colors only)", ptd->notification.lpzName); ppd->colorBack = (COLORREF)CallService(MS_COLOUR_GET, (WPARAM)&colourid, 0); ppd->lchIcon = IcoLib_GetIconByHandle(ptd->hIcoLib); }
bool PerformAction(HANDLE hNotification, HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { if (!IsValidNotification(hNotification)) return false; POPUPTREEDATA *ptd = (POPUPTREEDATA *)hNotification; char *lpzAction = NULL; switch (message) { case WM_LBUTTONUP: case WM_COMMAND: lpzAction = ptd->leftAction; break; case WM_RBUTTONUP: case WM_CONTEXTMENU: lpzAction = ptd->rightAction; break; default: return false; } if (!lstrcmpA(lpzAction, POPUP_ACTION_NOTHING)) return true; if (!lstrcmpA(lpzAction, POPUP_ACTION_DISMISS)) { PUDeletePopup(hwnd); return true; } for (int i=0; i < ptd->notification.actionCount; ++i) { if (!(ptd->notification.lpActions[i].dwFlags&PNAF_CALLBACK)) continue; if (lstrcmpA(ptd->notification.lpActions[i].lpzTitle, lpzAction)) continue; ptd->notification.lpActions[i].pfnCallback(hwnd, message, wparam, lparam, ptd->notification.lpActions[i].dwCookie); return true; } return false; }