1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#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 = { 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]) {
TCHAR path[MAX_PATH];
GetModuleFileName(hInst, path, sizeof(path));
SKINICONDESC sid = { 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 = GetContactProto(hContact);
HICON icon0 = LoadSkinnedProtoIcon(szProto, ID_STATUS_ONLINE);
HICON resIcon = getOverlayedIcon(icon0, icon1, FALSE);
ReleaseIconEx(icon1);
Skin_ReleaseIcon(icon0);
return resIcon;
}
|