#include "AvatarHistory.h" enum IconIndex { I_HISTORY, I_OVERLAY }; typedef struct { TCHAR* szDescr; char* szName; int defIconID; BOOL core; } IconStruct; static IconStruct iconList[] = { { LPGENT("History"), "core_main_10", IDI_AVATARHIST, TRUE }, { LPGENT("Avatar Overlay"), "avh_overlay", IDI_AVATAROVERLAY, FALSE } }; extern HANDLE hHooks[]; static HICON LoadIconEx(IconIndex i) { HICON hIcon; if (hHooks[4]) hIcon = Skin_GetIcon(iconList[(int)i].szName); else hIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(iconList[(int)i].defIconID), IMAGE_ICON, 0, 0, 0); return hIcon; } static void ReleaseIconEx(HICON hIcon) { if (hHooks[4]) Skin_ReleaseIcon(hIcon); else DestroyIcon(hIcon); } static void IcoLibUpdateMenus() { CLISTMENUITEM mi = {0}; mi.cbSize = sizeof(mi); mi.flags = CMIM_FLAGS | CMIM_ICON; mi.hIcon = createDefaultOverlayedIcon(FALSE); CallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenu, ( LPARAM )&mi ); DestroyIcon(mi.hIcon); } int IcoLibIconsChanged(WPARAM wParam, LPARAM lParam) { IcoLibUpdateMenus(); return 0; } void SetupIcoLib() { if (hHooks[4]) { SKINICONDESC sid = {0}; TCHAR path[MAX_PATH]; GetModuleFileName(hInst, path, sizeof(path)); sid.cbSize = sizeof(sid); sid.ptszSection = LPGENT("Avatar History"); sid.ptszDefaultFile = path; sid.flags = SIDF_ALL_TCHAR; for (unsigned i = 0; i < MAX_REGS(iconList); i++) { if (!iconList[i].core) { sid.ptszDescription = iconList[i].szDescr; sid.pszName = iconList[i].szName; sid.iDefaultIndex = -iconList[i].defIconID; Skin_AddIcon(&sid); } } } IcoLibUpdateMenus(); } static HICON getOverlayedIcon(HICON icon, HICON overlay, BOOL big) { HIMAGELIST il = ImageList_Create( GetSystemMetrics(big?SM_CXICON:SM_CXSMICON), GetSystemMetrics(big?SM_CYICON:SM_CYSMICON), ILC_COLOR32|ILC_MASK, 2, 2); ImageList_AddIcon(il, icon); ImageList_AddIcon(il, overlay); HIMAGELIST newImage = ImageList_Merge(il,0,il,1,0,0); ImageList_Destroy(il); HICON hIcon = ImageList_GetIcon(newImage, 0, 0); ImageList_Destroy(newImage); return hIcon; // the result should be destroyed by DestroyIcon() } HICON createDefaultOverlayedIcon(BOOL big) { HICON icon0 = LoadIconEx(I_HISTORY); HICON icon1 = LoadIconEx(I_OVERLAY); HICON resIcon = getOverlayedIcon(icon0, icon1, FALSE); ReleaseIconEx(icon0); ReleaseIconEx(icon1); return resIcon; } HICON createProtoOverlayedIcon(HANDLE hContact) { HICON icon1 = LoadIconEx(I_OVERLAY); char *szProto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); HICON icon0 = LoadSkinnedProtoIcon(szProto, ID_STATUS_ONLINE); HICON resIcon = getOverlayedIcon(icon0, icon1, FALSE); ReleaseIconEx(icon1); Skin_ReleaseIcon(icon0); return resIcon; }