ReactOS 0.4.15-dev-7670-g69b08be
appbar.c
Go to the documentation of this file.
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
40#include "undocshell.h"
41
42#include <wine/debug.h>
43#include <wine/unicode.h>
44
46
47struct appbar_cmd
48{
52 struct _AppBarData abd;
53};
54
55struct appbar_response
56{
58 struct _AppBarData abd;
59};
60
61/*************************************************************************
62 * SHAppBarMessage [SHELL32.@]
63 */
65{
66 struct appbar_cmd command;
67 struct appbar_response* response;
68 HANDLE return_map;
69 LPVOID return_view;
70 HWND appbarmsg_window;
72
73 UINT_PTR ret = 0;
74
75 TRACE("msg=%d, data={cb=%d, hwnd=%p}\n", msg, data->cbSize, data->hWnd);
76
77 /* These members are message dependent */
78 switch(msg)
79 {
80 case ABM_NEW:
81 TRACE("callback: %x\n", data->uCallbackMessage);
82 break;
83
85 TRACE("edge: %d\n", data->uEdge);
86 break;
87
88 case ABM_QUERYPOS:
89 case ABM_SETPOS:
90 TRACE("edge: %d, rc: %s\n", data->uEdge, wine_dbgstr_rect(&data->rc));
91 break;
92
94 TRACE("rc: %s\n", wine_dbgstr_rect(&data->rc));
95 break;
96
98 TRACE("edge: %d, lParam: %lx\n", data->uEdge, data->lParam);
99 break;
100
101 default:
102 FIXME("unknown msg: %d\n", msg);
103 break;
104 }
105
106 if (data->cbSize < sizeof(APPBARDATA))
107 {
108 WARN("data at %p is too small\n", data);
109 return FALSE;
110 }
111
112 command.dwMsg = msg;
113 command.abd.hWnd = data->hWnd;
114 command.abd.uCallbackMessage = data->uCallbackMessage;
115 command.abd.uEdge = data->uEdge;
116 command.abd.rc = data->rc;
117 command.abd.lParam = data->lParam;
118
119 return_map = CreateFileMappingW(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, sizeof(struct appbar_response), NULL);
120 if (return_map == NULL)
121 {
122 ERR("couldn't create file mapping\n");
123 return 0;
124 }
125 command.return_map = HandleToUlong( return_map );
126
127 command.return_process = GetCurrentProcessId();
128
129 appbarmsg_window = FindWindowW(L"Shell_TrayWnd", NULL);
130 if (appbarmsg_window == NULL)
131 {
132 ERR("couldn't find appbar window\n");
133 CloseHandle(return_map);
134 return 0;
135 }
136
137 cds.dwData = TABDMC_APPBAR;
138 cds.cbData = sizeof(command);
139 cds.lpData = &command;
140
141 SendMessageW(appbarmsg_window, WM_COPYDATA, (WPARAM)data->hWnd, (LPARAM)&cds);
142
143 return_view = MapViewOfFile(return_map, FILE_MAP_READ, 0, 0, sizeof(struct appbar_response));
144 if (return_view == NULL)
145 {
146 ERR("MapViewOfFile failed\n");
147 CloseHandle(return_map);
148 return 0;
149 }
150
151 response = return_view;
152
153 ret = response->result;
154 if (ret)
155 {
156 data->hWnd = response->abd.hWnd;
157 data->uCallbackMessage = response->abd.uCallbackMessage;
158 data->uEdge = response->abd.uEdge;
159 data->rc = response->abd.rc;
160 data->lParam = response->abd.lParam;
161 }
162 UnmapViewOfFile(return_view);
163
164 CloseHandle(return_map);
165
166 return ret;
167}
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define HandleToUlong(h)
Definition: basetsd.h:79
#define FIXME(fmt,...)
Definition: debug.h:111
#define WARN(fmt,...)
Definition: debug.h:112
#define ERR(fmt,...)
Definition: debug.h:110
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define UnmapViewOfFile
Definition: compat.h:746
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define FILE_MAP_READ
Definition: compat.h:776
#define MapViewOfFile
Definition: compat.h:745
UINT_PTR WINAPI SHAppBarMessage(DWORD msg, PAPPBARDATA data)
Definition: appbar.c:64
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
#define PAGE_READWRITE
Definition: nt_native.h:1304
#define L(x)
Definition: ntvdm.h:50
#define ABM_GETTASKBARPOS
Definition: shellapi.h:64
#define ABM_SETAUTOHIDEBAR
Definition: shellapi.h:67
#define ABM_SETPOS
Definition: shellapi.h:62
#define ABM_NEW
Definition: shellapi.h:59
#define ABM_GETAUTOHIDEBAR
Definition: shellapi.h:66
#define ABM_QUERYPOS
Definition: shellapi.h:61
#define TRACE(s)
Definition: solgame.cpp:4
struct _AppBarData abd
Definition: appbar.cpp:43
DWORD return_process
Definition: appbar.cpp:42
DWORD dwMsg
Definition: appbar.cpp:40
ULONG return_map
Definition: appbar.cpp:41
struct _AppBarData abd
Definition: appbar.cpp:49
ULONGLONG result
Definition: appbar.cpp:48
ULONG_PTR dwData
Definition: winuser.h:3000
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
#define TABDMC_APPBAR
Definition: undocshell.h:794
int ret
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define WM_COPYDATA
Definition: winuser.h:1663
HWND WINAPI FindWindowW(_In_opt_ LPCWSTR, _In_opt_ LPCWSTR)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)