1 /*
2 * SHAppBarMessage implementation
3 *
4 * Copyright 2008 Vincent Povirk for CodeWeavers
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21 //
22 // Adapted from Wine appbar.c .
23 //
24
25 #include <wine/config.h>
26
27 #include <stdlib.h>
28 #include <string.h>
29 #include <stdarg.h>
30 #include <stdio.h>
31
32 #include <windef.h>
33 #include <winbase.h>
34 #include <winerror.h>
35 #include <shellapi.h>
36 #include <winuser.h>
37 #include <shlobj.h>
38 #include <shlwapi.h>
39 #include <undocshell.h>
40
41 #include <wine/debug.h>
42 #include <wine/unicode.h>
43
44 #include "shell32_main.h"
45
46 WINE_DEFAULT_DEBUG_CHANNEL(appbar);
47
48 struct appbar_cmd
49 {
50 DWORD dwMsg;
51 ULONG return_map;
52 DWORD return_process;
53 struct _AppBarData abd;
54 };
55
56 struct appbar_response
57 {
58 ULONGLONG result;
59 struct _AppBarData abd;
60 };
61
62 /*************************************************************************
63 * SHAppBarMessage [SHELL32.@]
64 */
SHAppBarMessage(DWORD msg,PAPPBARDATA data)65 UINT_PTR WINAPI SHAppBarMessage(DWORD msg, PAPPBARDATA data)
66 {
67 struct appbar_cmd command;
68 struct appbar_response* response;
69 HANDLE return_map;
70 LPVOID return_view;
71 HWND appbarmsg_window;
72 COPYDATASTRUCT cds;
73
74 UINT_PTR ret = 0;
75
76 TRACE("msg=%d, data={cb=%d, hwnd=%p}\n", msg, data->cbSize, data->hWnd);
77
78 /* These members are message dependent */
79 switch(msg)
80 {
81 case ABM_NEW:
82 TRACE("callback: %x\n", data->uCallbackMessage);
83 break;
84
85 case ABM_GETAUTOHIDEBAR:
86 TRACE("edge: %d\n", data->uEdge);
87 break;
88
89 case ABM_QUERYPOS:
90 case ABM_SETPOS:
91 TRACE("edge: %d, rc: %s\n", data->uEdge, wine_dbgstr_rect(&data->rc));
92 break;
93
94 case ABM_GETTASKBARPOS:
95 TRACE("rc: %s\n", wine_dbgstr_rect(&data->rc));
96 break;
97
98 case ABM_SETAUTOHIDEBAR:
99 TRACE("edge: %d, lParam: %lx\n", data->uEdge, data->lParam);
100 break;
101
102 default:
103 FIXME("unknown msg: %d\n", msg);
104 break;
105 }
106
107 if (data->cbSize < sizeof(APPBARDATA))
108 {
109 WARN("data at %p is too small\n", data);
110 return FALSE;
111 }
112
113 command.dwMsg = msg;
114 command.abd.hWnd = data->hWnd;
115 command.abd.uCallbackMessage = data->uCallbackMessage;
116 command.abd.uEdge = data->uEdge;
117 command.abd.rc = data->rc;
118 command.abd.lParam = data->lParam;
119
120 return_map = CreateFileMappingW(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, sizeof(struct appbar_response), NULL);
121 if (return_map == NULL)
122 {
123 ERR("couldn't create file mapping\n");
124 return 0;
125 }
126 command.return_map = HandleToUlong( return_map );
127
128 command.return_process = GetCurrentProcessId();
129
130 appbarmsg_window = FindWindowW(L"Shell_TrayWnd", NULL);
131 if (appbarmsg_window == NULL)
132 {
133 ERR("couldn't find appbar window\n");
134 CloseHandle(return_map);
135 return 0;
136 }
137
138 cds.dwData = TABDMC_APPBAR;
139 cds.cbData = sizeof(command);
140 cds.lpData = &command;
141
142 SendMessageW(appbarmsg_window, WM_COPYDATA, (WPARAM)data->hWnd, (LPARAM)&cds);
143
144 return_view = MapViewOfFile(return_map, FILE_MAP_READ, 0, 0, sizeof(struct appbar_response));
145 if (return_view == NULL)
146 {
147 ERR("MapViewOfFile failed\n");
148 CloseHandle(return_map);
149 return 0;
150 }
151
152 response = return_view;
153
154 ret = response->result;
155 if (ret)
156 {
157 data->hWnd = response->abd.hWnd;
158 data->uCallbackMessage = response->abd.uCallbackMessage;
159 data->uEdge = response->abd.uEdge;
160 data->rc = response->abd.rc;
161 data->lParam = response->abd.lParam;
162 }
163 UnmapViewOfFile(return_view);
164
165 CloseHandle(return_map);
166
167 return ret;
168 }
169