1 /* 2 * Copyright (c) 2005 Robert Reif 3 * Copyright (c) 2006 Vitaliy Margolen 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 18 */ 19 20 #include "precomp.h" 21 22 static const HRESULT SetCoop_null_window[16] = { 23 E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, 24 E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG, 25 E_INVALIDARG, E_HANDLE, S_OK, E_INVALIDARG, 26 E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG}; 27 28 static const HRESULT SetCoop_real_window[16] = { 29 E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, 30 E_INVALIDARG, S_OK, S_OK, E_INVALIDARG, 31 E_INVALIDARG, E_NOTIMPL, S_OK, E_INVALIDARG, 32 E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG}; 33 34 static const HRESULT SetCoop_child_window[16] = { 35 E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, 36 E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG, 37 E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG, 38 E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG}; 39 40 static void test_set_coop(IDirectInputA *pDI, HWND hwnd) 41 { 42 HRESULT hr; 43 IDirectInputDeviceA *pMouse = NULL; 44 int i; 45 HWND child; 46 47 hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL); 48 ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr); 49 if (FAILED(hr)) return; 50 51 for (i=0; i<16; i++) 52 { 53 hr = IDirectInputDevice_SetCooperativeLevel(pMouse, NULL, i); 54 ok(hr == SetCoop_null_window[i], "SetCooperativeLevel(NULL, %d): %08x\n", i, hr); 55 } 56 for (i=0; i<16; i++) 57 { 58 hr = IDirectInputDevice_SetCooperativeLevel(pMouse, hwnd, i); 59 ok(hr == SetCoop_real_window[i], "SetCooperativeLevel(hwnd, %d): %08x\n", i, hr); 60 } 61 62 child = CreateWindowA("static", "Title", WS_CHILD | WS_VISIBLE, 10, 10, 50, 50, hwnd, NULL, 63 NULL, NULL); 64 ok(child != NULL, "err: %d\n", GetLastError()); 65 66 for (i=0; i<16; i++) 67 { 68 hr = IDirectInputDevice_SetCooperativeLevel(pMouse, child, i); 69 ok(hr == SetCoop_child_window[i], "SetCooperativeLevel(child, %d): %08x\n", i, hr); 70 } 71 72 DestroyWindow(child); 73 if (pMouse) IUnknown_Release(pMouse); 74 } 75 76 static void test_acquire(IDirectInputA *pDI, HWND hwnd) 77 { 78 HRESULT hr; 79 IDirectInputDeviceA *pMouse = NULL; 80 DIMOUSESTATE m_state; 81 HWND hwnd2; 82 DIPROPDWORD di_op; 83 DIDEVICEOBJECTDATA mouse_state; 84 DWORD cnt; 85 MSG msg; 86 int i; 87 88 if (! SetForegroundWindow(hwnd)) 89 { 90 skip("Not running as foreground app, skipping acquire tests\n"); 91 return; 92 } 93 94 hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL); 95 ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr); 96 if (FAILED(hr)) return; 97 98 hr = IDirectInputDevice_SetCooperativeLevel(pMouse, hwnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); 99 ok(hr == S_OK, "SetCooperativeLevel: %08x\n", hr); 100 101 memset(&di_op, 0, sizeof(di_op)); 102 di_op.dwData = 5; 103 di_op.diph.dwHow = DIPH_DEVICE; 104 di_op.diph.dwSize = sizeof(DIPROPDWORD); 105 di_op.diph.dwHeaderSize = sizeof(DIPROPHEADER); 106 hr = IDirectInputDevice_SetProperty(pMouse, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&di_op); 107 ok(hr == S_OK, "SetProperty() failed: %08x\n", hr); 108 109 hr = IDirectInputDevice_SetDataFormat(pMouse, &c_dfDIMouse); 110 ok(SUCCEEDED(hr), "IDirectInputDevice_SetDataFormat() failed: %08x\n", hr); 111 hr = IDirectInputDevice_Unacquire(pMouse); 112 ok(hr == S_FALSE, "IDirectInputDevice_Unacquire() should have failed: %08x\n", hr); 113 hr = IDirectInputDevice_Acquire(pMouse); 114 ok(SUCCEEDED(hr), "IDirectInputDevice_Acquire() failed: %08x\n", hr); 115 hr = IDirectInputDevice_Acquire(pMouse); 116 ok(hr == S_FALSE, "IDirectInputDevice_Acquire() should have failed: %08x\n", hr); 117 118 /* Foreground coop level requires window to have focus */ 119 /* Create a temporary window, this should make dinput 120 * lose mouse input */ 121 hwnd2 = CreateWindowA("static", "Temporary", WS_VISIBLE, 10, 210, 200, 200, NULL, NULL, NULL, 122 NULL); 123 ok(hwnd2 != NULL, "CreateWindowA failed with %u\n", GetLastError()); 124 while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); 125 126 hr = IDirectInputDevice_GetDeviceState(pMouse, sizeof(m_state), &m_state); 127 ok(hr == DIERR_NOTACQUIRED, "GetDeviceState() should have failed: %08x\n", hr); 128 /* Workaround so we can test other things. Remove when Wine is fixed */ 129 IDirectInputDevice_Unacquire(pMouse); 130 131 hr = IDirectInputDevice_Acquire(pMouse); 132 ok(hr == DIERR_OTHERAPPHASPRIO, "Acquire() should have failed: %08x\n", hr); 133 134 SetActiveWindow( hwnd ); 135 hr = IDirectInputDevice_Acquire(pMouse); 136 ok(hr == S_OK, "Acquire() failed: %08x\n", hr); 137 138 if (!winetest_interactive) 139 skip("ROSTESTS-176/CORE-9710: Skipping randomly failing tests\n"); 140 else { 141 142 mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0); 143 cnt = 1; 144 hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0); 145 ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt); 146 147 mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0); 148 IDirectInputDevice_Unacquire(pMouse); 149 cnt = 1; 150 hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0); 151 ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt); 152 153 IDirectInputDevice_Acquire(pMouse); 154 mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0); 155 IDirectInputDevice_Unacquire(pMouse); 156 IDirectInputDevice_Acquire(pMouse); 157 cnt = 1; 158 hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0); 159 ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt); 160 161 /* Check for buffer owerflow */ 162 for (i = 0; i < 6; i++) 163 mouse_event(MOUSEEVENTF_MOVE, 10 + i, 10 + i, 0, 0); 164 165 cnt = 1; 166 hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0); 167 ok(hr == DI_OK, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt); 168 cnt = 1; 169 hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0); 170 ok(hr == DI_OK && cnt == 1, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt); 171 } 172 if (pMouse) IUnknown_Release(pMouse); 173 174 DestroyWindow( hwnd2 ); 175 } 176 177 static void mouse_tests(void) 178 { 179 HRESULT hr; 180 IDirectInputA *pDI = NULL; 181 HINSTANCE hInstance = GetModuleHandleW(NULL); 182 HWND hwnd; 183 ULONG ref = 0; 184 185 hr = DirectInputCreateA(hInstance, DIRECTINPUT_VERSION, &pDI, NULL); 186 if (hr == DIERR_OLDDIRECTINPUTVERSION) 187 { 188 skip("Tests require a newer dinput version\n"); 189 return; 190 } 191 ok(SUCCEEDED(hr), "DirectInputCreateA() failed: %08x\n", hr); 192 if (FAILED(hr)) return; 193 194 hwnd = CreateWindowA("static", "Title", WS_OVERLAPPEDWINDOW, 10, 10, 200, 200, NULL, NULL, 195 NULL, NULL); 196 ok(hwnd != NULL, "err: %d\n", GetLastError()); 197 if (hwnd) 198 { 199 ShowWindow(hwnd, SW_SHOW); 200 201 test_set_coop(pDI, hwnd); 202 test_acquire(pDI, hwnd); 203 204 DestroyWindow(hwnd); 205 } 206 if (pDI) ref = IUnknown_Release(pDI); 207 ok(!ref, "IDirectInput_Release() reference count = %d\n", ref); 208 } 209 210 START_TEST(mouse) 211 { 212 CoInitialize(NULL); 213 214 mouse_tests(); 215 216 CoUninitialize(); 217 } 218