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 45 WINE_DEFAULT_DEBUG_CHANNEL(appbar); 46 47 struct appbar_cmd 48 { 49 DWORD dwMsg; 50 ULONG return_map; 51 DWORD return_process; 52 struct _AppBarData abd; 53 }; 54 55 struct appbar_response 56 { 57 ULONGLONG result; 58 struct _AppBarData abd; 59 }; 60 61 /************************************************************************* 62 * SHAppBarMessage [SHELL32.@] 63 */ 64 UINT_PTR WINAPI SHAppBarMessage(DWORD msg, PAPPBARDATA data) 65 { 66 struct appbar_cmd command; 67 struct appbar_response* response; 68 HANDLE return_map; 69 LPVOID return_view; 70 HWND appbarmsg_window; 71 COPYDATASTRUCT cds; 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 84 case ABM_GETAUTOHIDEBAR: 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 93 case ABM_GETTASKBARPOS: 94 TRACE("rc: %s\n", wine_dbgstr_rect(&data->rc)); 95 break; 96 97 case ABM_SETAUTOHIDEBAR: 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 } 168