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
32 #include "wine/debug.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(appbar
);
36 struct appbar_data_msg
/* platform-independent data */
39 UINT uCallbackMessage
;
49 struct appbar_data_msg abd
;
52 struct appbar_response
55 struct appbar_data_msg abd
;
58 /*************************************************************************
59 * SHAppBarMessage [SHELL32.@]
61 UINT_PTR WINAPI
SHAppBarMessage(DWORD msg
, PAPPBARDATA data
)
63 struct appbar_cmd command
;
64 struct appbar_response
* response
;
67 HWND appbarmsg_window
;
72 TRACE("msg=%ld, data={cb=%ld, hwnd=%p}\n", msg
, data
->cbSize
, data
->hWnd
);
74 /* These members are message dependent */
78 TRACE("callback: %x\n", data
->uCallbackMessage
);
81 case ABM_GETAUTOHIDEBAR
:
82 TRACE("edge: %d\n", data
->uEdge
);
87 TRACE("edge: %d, rc: %s\n", data
->uEdge
, wine_dbgstr_rect(&data
->rc
));
90 case ABM_GETTASKBARPOS
:
91 TRACE("rc: %s\n", wine_dbgstr_rect(&data
->rc
));
94 case ABM_SETAUTOHIDEBAR
:
95 TRACE("edge: %d, lParam: %Ix\n", data
->uEdge
, data
->lParam
);
99 FIXME("unknown msg: %ld\n", msg
);
103 if (data
->cbSize
< sizeof(APPBARDATA
))
105 WARN("data at %p is too small\n", data
);
109 command
.abd
.hWnd
= HandleToLong( data
->hWnd
);
110 command
.abd
.uCallbackMessage
= data
->uCallbackMessage
;
111 command
.abd
.uEdge
= data
->uEdge
;
112 command
.abd
.rc
= data
->rc
;
113 command
.abd
.lParam
= data
->lParam
;
115 return_map
= CreateFileMappingW(INVALID_HANDLE_VALUE
, 0, PAGE_READWRITE
, 0, sizeof(struct appbar_response
), NULL
);
116 if (return_map
== NULL
)
118 ERR("couldn't create file mapping\n");
121 command
.return_map
= HandleToUlong( return_map
);
123 command
.return_process
= GetCurrentProcessId();
125 appbarmsg_window
= FindWindowW(L
"WineAppBar", NULL
);
126 if (appbarmsg_window
== NULL
)
128 ERR("couldn't find appbar window\n");
129 CloseHandle(return_map
);
134 cds
.cbData
= sizeof(command
);
135 cds
.lpData
= &command
;
137 SendMessageTimeoutW(appbarmsg_window
, WM_COPYDATA
, (WPARAM
)data
->hWnd
, (LPARAM
)&cds
, SMTO_BLOCK
, INFINITE
, &msg_result
);
139 return_view
= MapViewOfFile(return_map
, FILE_MAP_READ
, 0, 0, sizeof(struct appbar_response
));
140 if (return_view
== NULL
)
142 ERR("MapViewOfFile failed\n");
143 CloseHandle(return_map
);
147 response
= return_view
;
149 ret
= response
->result
;
152 data
->hWnd
= UlongToHandle( response
->abd
.hWnd
);
153 data
->uCallbackMessage
= response
->abd
.uCallbackMessage
;
154 data
->uEdge
= response
->abd
.uEdge
;
155 data
->rc
= response
->abd
.rc
;
156 data
->lParam
= response
->abd
.lParam
;
158 UnmapViewOfFile(return_view
);
160 CloseHandle(return_map
);