2 * SHAppBarMessage implementation
4 * Copyright 2008 Vincent Povirk for CodeWeavers
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.
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.
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
34 #include "wine/debug.h"
35 #include "wine/unicode.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(appbar
);
39 struct appbar_data_msg
/* platform-independent data */
42 UINT uCallbackMessage
;
52 struct appbar_data_msg abd
;
55 struct appbar_response
58 struct appbar_data_msg abd
;
61 /*************************************************************************
62 * SHAppBarMessage [SHELL32.@]
64 UINT_PTR WINAPI
SHAppBarMessage(DWORD msg
, PAPPBARDATA data
)
66 struct appbar_cmd command
;
67 struct appbar_response
* response
;
70 HWND appbarmsg_window
;
73 static const WCHAR classname
[] = {'W','i','n','e','A','p','p','B','a','r',0};
77 TRACE("msg=%d, data={cb=%d, hwnd=%p}\n", msg
, data
->cbSize
, data
->hWnd
);
79 /* These members are message dependent */
83 TRACE("callback: %x\n", data
->uCallbackMessage
);
86 case ABM_GETAUTOHIDEBAR
:
87 TRACE("edge: %d\n", data
->uEdge
);
92 TRACE("edge: %d, rc: %s\n", data
->uEdge
, wine_dbgstr_rect(&data
->rc
));
95 case ABM_GETTASKBARPOS
:
96 TRACE("rc: %s\n", wine_dbgstr_rect(&data
->rc
));
99 case ABM_SETAUTOHIDEBAR
:
100 TRACE("edge: %d, lParam: %lx\n", data
->uEdge
, data
->lParam
);
104 FIXME("unknown msg: %d\n", msg
);
108 if (data
->cbSize
< sizeof(APPBARDATA
))
110 WARN("data at %p is too small\n", data
);
114 command
.abd
.hWnd
= HandleToLong( 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
;
120 return_map
= CreateFileMappingW(INVALID_HANDLE_VALUE
, 0, PAGE_READWRITE
, 0, sizeof(struct appbar_response
), NULL
);
121 if (return_map
== NULL
)
123 ERR("couldn't create file mapping\n");
126 command
.return_map
= HandleToUlong( return_map
);
128 command
.return_process
= GetCurrentProcessId();
130 appbarmsg_window
= FindWindowW(classname
, NULL
);
131 if (appbarmsg_window
== NULL
)
133 ERR("couldn't find appbar window\n");
134 CloseHandle(return_map
);
139 cds
.cbData
= sizeof(command
);
140 cds
.lpData
= &command
;
142 SendMessageTimeoutW(appbarmsg_window
, WM_COPYDATA
, (WPARAM
)data
->hWnd
, (LPARAM
)&cds
, SMTO_BLOCK
, INFINITE
, &msg_result
);
144 return_view
= MapViewOfFile(return_map
, FILE_MAP_READ
, 0, 0, sizeof(struct appbar_response
));
145 if (return_view
== NULL
)
147 ERR("MapViewOfFile failed\n");
148 CloseHandle(return_map
);
152 response
= return_view
;
154 ret
= response
->result
;
157 data
->hWnd
= UlongToHandle( 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
;
163 UnmapViewOfFile(return_view
);
165 CloseHandle(return_map
);