Module: wine Branch: master Commit: 8c5a4401449efc52f7309f7b8f45182138b4e13c URL: http://source.winehq.org/git/wine.git/?a=commit;h=8c5a4401449efc52f7309f7b8f...
Author: Vitaliy Margolen wine-patches@kievinfo.com Date: Tue Nov 1 23:45:39 2011 -0600
dinput: Window supplied to SetCooperativeLevel have to be top level window.
---
dlls/dinput/device.c | 2 ++ dlls/dinput/tests/keyboard.c | 18 ++++++++++++++++++ dlls/dinput/tests/mouse.c | 18 ++++++++++++++++++ 3 files changed, 38 insertions(+), 0 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index 72670f7..f5b7b4b 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -882,6 +882,8 @@ HRESULT WINAPI IDirectInputDevice2WImpl_SetCooperativeLevel(LPDIRECTINPUTDEVICE8 (dwflags & (DISCL_FOREGROUND | DISCL_BACKGROUND)) == (DISCL_FOREGROUND | DISCL_BACKGROUND)) return DIERR_INVALIDPARAM;
+ if (hwnd && GetWindowLongW(hwnd, GWL_STYLE) & WS_CHILD) return E_HANDLE; + if (dwflags == (DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)) hwnd = GetDesktopWindow();
diff --git a/dlls/dinput/tests/keyboard.c b/dlls/dinput/tests/keyboard.c index ecfd6c2..4b46a61 100644 --- a/dlls/dinput/tests/keyboard.c +++ b/dlls/dinput/tests/keyboard.c @@ -106,11 +106,18 @@ static const HRESULT SetCoop_real_window[16] = { E_INVALIDARG, E_NOTIMPL, S_OK, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG};
+static const HRESULT SetCoop_child_window[16] = { + E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, + E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG, + E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG, + E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG}; + static void test_set_coop(LPDIRECTINPUT pDI, HWND hwnd) { HRESULT hr; LPDIRECTINPUTDEVICE pKeyboard = NULL; int i; + HWND child;
hr = IDirectInput_CreateDevice(pDI, &GUID_SysKeyboard, &pKeyboard, NULL); ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr); @@ -127,6 +134,17 @@ static void test_set_coop(LPDIRECTINPUT pDI, HWND hwnd) ok(hr == SetCoop_real_window[i], "SetCooperativeLevel(hwnd, %d): %08x\n", i, hr); }
+ child = CreateWindow("static", "Title", WS_CHILD | WS_VISIBLE, + 10, 10, 50, 50, hwnd, NULL, NULL, NULL); + ok(child != NULL, "err: %d\n", GetLastError()); + + for (i=0; i<16; i++) + { + hr = IDirectInputDevice_SetCooperativeLevel(pKeyboard, child, i); + ok(hr == SetCoop_child_window[i], "SetCooperativeLevel(child, %d): %08x\n", i, hr); + } + + DestroyWindow(child); if (pKeyboard) IUnknown_Release(pKeyboard); }
diff --git a/dlls/dinput/tests/mouse.c b/dlls/dinput/tests/mouse.c index 0d6b88a..2cfb8cd 100644 --- a/dlls/dinput/tests/mouse.c +++ b/dlls/dinput/tests/mouse.c @@ -42,11 +42,18 @@ static const HRESULT SetCoop_real_window[16] = { E_INVALIDARG, E_NOTIMPL, S_OK, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG};
+static const HRESULT SetCoop_child_window[16] = { + E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, + E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG, + E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG, + E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG}; + static void test_set_coop(LPDIRECTINPUT pDI, HWND hwnd) { HRESULT hr; LPDIRECTINPUTDEVICE pMouse = NULL; int i; + HWND child;
hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL); ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr); @@ -63,6 +70,17 @@ static void test_set_coop(LPDIRECTINPUT pDI, HWND hwnd) ok(hr == SetCoop_real_window[i], "SetCooperativeLevel(hwnd, %d): %08x\n", i, hr); }
+ child = CreateWindow("static", "Title", WS_CHILD | WS_VISIBLE, + 10, 10, 50, 50, hwnd, NULL, NULL, NULL); + ok(child != NULL, "err: %d\n", GetLastError()); + + for (i=0; i<16; i++) + { + hr = IDirectInputDevice_SetCooperativeLevel(pMouse, child, i); + ok(hr == SetCoop_child_window[i], "SetCooperativeLevel(child, %d): %08x\n", i, hr); + } + + DestroyWindow(child); if (pMouse) IUnknown_Release(pMouse); }