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