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
|
#include "common.h"
#include "menu.h"
#include "options.h"
#include "utils.h"
HANDLE hMenuBuildEvent, hStartItem, hStopItem;
void FixMenuIcons() {
// fix menu icons
CLISTMENUITEM menu = {0};
menu.cbSize=sizeof(menu);
menu.flags = CMIM_ICON;
menu.hIcon = hLockIcon;
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStartItem, (LPARAM)&menu);
menu.hIcon = hUnlockIcon;
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStopItem, (LPARAM)&menu);
}
int PrebuildContactMenu(WPARAM wParam, LPARAM lParam) {
HANDLE hContact = (HANDLE)wParam;
CLISTMENUITEM mi = {0};
mi.cbSize = sizeof(mi);
mi.flags = CMIM_FLAGS | CMIF_NOTOFFLINE;
char *proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
char *uname = (char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, 0);
WORD pol = CONTACT_DEFAULT_POLICY;
if(!proto || !uname || DBGetContactSettingByte(hContact, proto, "ChatRoom", 0) == 1) {
goto hide_all;
}
if(proto && metaproto && strcmp(proto, metaproto) == 0) {
// make menu act as per most online subcontact
hContact = (HANDLE)CallService(MS_MC_GETMOSTONLINECONTACT, (WPARAM)hContact, 0);
if(!hContact)
goto hide_all;
uname = (char *)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, 0);
proto = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
}
pol = DBGetContactSettingWord(hContact, MODULE, "Policy", CONTACT_DEFAULT_POLICY);
if(pol == CONTACT_DEFAULT_POLICY) pol = options.default_policy;
if(pol == OTRL_POLICY_NEVER || pol == OTRL_POLICY_ALWAYS) {
goto hide_all;
}
{
ConnContext *context = otrl_context_find(otr_user_state, uname, MODULE, proto, FALSE, 0, 0, 0);
bool encrypted = context && context->msgstate != OTRL_MSGSTATE_PLAINTEXT;
if(encrypted) {
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStopItem, (LPARAM)&mi);
mi.flags |= CMIF_HIDDEN;
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStartItem, (LPARAM)&mi);
} else {
if(pol == OTRL_POLICY_MANUAL_MOD) {
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStartItem, (LPARAM)&mi);
mi.flags |= CMIF_HIDDEN;
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStopItem, (LPARAM)&mi);
} else { // should only be 'opportunistic'
goto hide_all;
}
}
}
return 0;
hide_all:
mi.flags |= CMIF_HIDDEN;
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStopItem, (LPARAM)&mi);
CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hStartItem, (LPARAM)&mi);
return 0;
}
void InitMenu() {
CLISTMENUITEM mi = {0};
mi.cbSize = sizeof(mi);
mi.flags = CMIF_NOTOFFLINE;
mi.position = -400000;
mi.pszName = Translate("Stop OTR");
mi.pszService = MS_OTR_MENUSTOP;
mi.hIcon = hUnlockIcon;
hStopItem = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi);
mi.pszName = Translate("Start OTR");
mi.pszService = MS_OTR_MENUSTART;
mi.hIcon = hLockIcon;
hStartItem = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&mi);
hMenuBuildEvent = HookEvent(ME_CLIST_PREBUILDCONTACTMENU, PrebuildContactMenu);
}
void DeinitMenu() {
}
|