| 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
 | #include "headers.h"
static HANDLE hProcessJumpList = 0;
static void ProcessJumpListImpl(char *arg)
{
	char *prefix = mir_strdup(arg);
	char *argument = strchr(prefix, ':');
	if (argument) *argument++ = 0;
	NotifyEventHooks(hProcessJumpList, (WPARAM)prefix, (LPARAM)argument);
	mir_free(prefix);
}
static LRESULT CALLBACK MirandaJumpListProcessorWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_COPYDATA:
		{
			COPYDATASTRUCT *data = (COPYDATASTRUCT *)lParam;
			ProcessJumpListImpl((char *)data->lpData);
			break;
		}
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}
extern "C" __declspec(dllexport) void ProcessJumpList(HWND, HINSTANCE, LPSTR arg, UINT)
{
	char miranda_path[MAX_PATH];
	GetModuleFileNameA(g_hInst, miranda_path, SIZEOF(miranda_path));
	lstrcpyA(strstr(_strlwr(miranda_path), "plugins\\w7ui.dll"), "miranda32.exe");
	if (HWND hwnd = FindWindowA("MirandaJumpListProcessor", miranda_path))
	{
		COPYDATASTRUCT data = {0};
		data.dwData = 0;
		data.cbData = lstrlenA(arg) + 1;
		data.lpData = arg;
		SendMessage(hwnd, WM_COPYDATA, 0, (LPARAM)&data);
	} else
	{
		char command[MAX_PATH * 2];
		wsprintfA(command, "\"%s\" -jump %s", miranda_path, arg);
		WinExec(command, SW_SHOWNORMAL);
	}
}
static int OnJumpListItems(WPARAM, LPARAM lParam)
{
	WCHAR *category = (WCHAR *)lParam;
	if (!category)
	{
		MJumpList_AddItem(SKINICON_STATUS_ONLINE,    TranslateT("Online"),         L"status", L"online");
		MJumpList_AddItem(SKINICON_STATUS_DND,       TranslateT("Do not disturb"), L"status", L"dnd");
		MJumpList_AddItem(SKINICON_STATUS_INVISIBLE, TranslateT("Invisible"),      L"status", L"invisible");
		MJumpList_AddItem(SKINICON_STATUS_OFFLINE,   TranslateT("Offline"),        L"status", L"offline");
		return 0;
	}
	return 0;
}
static int OnJumpListProcess(WPARAM wParam, LPARAM lParam)
{
	char *prefix = (char *)wParam;
	char *argument = (char *)lParam;
	if (!lstrcmpA(prefix, "status"))
	{
		if (!lstrcmpA(argument, "online"))
		{
			CallService(MS_CLIST_SETSTATUSMODE, ID_STATUS_ONLINE, 0);
		} else
		if (!lstrcmpA(argument, "dnd"))
		{
			CallService(MS_CLIST_SETSTATUSMODE, ID_STATUS_DND, 0);
		} else
		if (!lstrcmpA(argument, "invisible"))
		{
			CallService(MS_CLIST_SETSTATUSMODE, ID_STATUS_INVISIBLE, 0);
		} else
		if (!lstrcmpA(argument, "offline"))
		{
			CallService(MS_CLIST_SETSTATUSMODE, ID_STATUS_OFFLINE, 0);
		}
		return 1;
	}
	return 0;
}
void LoadJumpList()
{
	hProcessJumpList = CreateHookableEvent(ME_JUMPLIST_PROCESS);
}
void InitJumpList()
{
	HookEvent(ME_JUMPLIST_BUILDITEMS, OnJumpListItems);
	HookEvent(ME_JUMPLIST_PROCESS, OnJumpListProcess);
	if (char *cmd = strstr(GetCommandLineA(), " -jump "))
		ProcessJumpListImpl(cmd + 7);
	WNDCLASSEX wcx = {0};
	wcx.cbSize = sizeof(wcx);
	wcx.lpfnWndProc = MirandaJumpListProcessorWndProc;
	wcx.hInstance = g_hInst;
	wcx.lpszClassName = _T("MirandaJumpListProcessor");
	RegisterClassEx(&wcx);
	char miranda_path[MAX_PATH];
	GetModuleFileNameA(g_hInst, miranda_path, SIZEOF(miranda_path));
	lstrcpyA(strstr(_strlwr(miranda_path), "plugins\\w7ui.dll"), "miranda32.exe");
	HWND hwnd = CreateWindowA("MirandaJumpListProcessor", miranda_path, 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, g_hInst, NULL);
	ShowWindow(hwnd, SW_HIDE);
	CJumpListBuilder::Rebuild();
}
 |