xref: /reactos/dll/win32/shell32/wine/appbar.c (revision 32d615fc)
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  */
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