[CLT2012]
[reactos.git] / dll / win32 / shell32 / systray.cpp
1 /*
2 * Copyright 2004 Martin Fuchs
3 *
4 * Pass on icon notification messages to the systray implementation
5 * in the currently running shell.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include <precomp.h>
23
24 /* copy data structure for tray notifications */
25 typedef struct TrayNotifyCDS_Dummy {
26 DWORD cookie;
27 DWORD notify_code;
28 DWORD nicon_data[1]; // placeholder for NOTIFYICONDATA structure
29 } TrayNotifyCDS_Dummy;
30
31 /* The only difference between Shell_NotifyIconA and Shell_NotifyIconW is the call to SendMessageA/W. */
32 static BOOL SHELL_NotifyIcon(DWORD dwMessage, void* pnid, HWND nid_hwnd, int nid_size, BOOL unicode)
33 {
34 HWND hwnd;
35 COPYDATASTRUCT data;
36
37 BOOL ret = FALSE;
38 int len = sizeof(TrayNotifyCDS_Dummy) - sizeof(DWORD) + nid_size;
39
40 TrayNotifyCDS_Dummy* pnotify_data = (TrayNotifyCDS_Dummy*) alloca(len);
41
42 pnotify_data->cookie = 1;
43 pnotify_data->notify_code = dwMessage;
44 memcpy(&pnotify_data->nicon_data, pnid, nid_size);
45
46 data.dwData = 1;
47 data.cbData = len;
48 data.lpData = pnotify_data;
49
50 for(hwnd = 0; (hwnd = FindWindowExW(0, hwnd, L"Shell_TrayWnd", NULL)); )
51 if ((unicode ? SendMessageW : SendMessageA)(hwnd, WM_COPYDATA, (WPARAM)nid_hwnd, (LPARAM)&data))
52 ret = TRUE;
53
54 return ret;
55 }
56
57
58 /*************************************************************************
59 * Shell_NotifyIcon [SHELL32.296]
60 * Shell_NotifyIconA [SHELL32.297]
61 */
62 BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid)
63 {
64 return SHELL_NotifyIcon(dwMessage, pnid, pnid->hWnd, pnid->cbSize, FALSE);
65 }
66
67 /*************************************************************************
68 * Shell_NotifyIconW [SHELL32.298]
69 */
70 BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW pnid)
71 {
72 return SHELL_NotifyIcon(dwMessage, pnid, pnid->hWnd, pnid->cbSize, TRUE);
73 }