Module: wine Branch: master Commit: dd08ef4063bdf97a80441b88e41b3d5eb25cf158 URL: http://source.winehq.org/git/wine.git/?a=commit;h=dd08ef4063bdf97a80441b88e4...
Author: Bernhard Übelacker bernhardu@vr-web.de Date: Tue Nov 24 21:25:58 2015 +0100
dinput: Fail in SetCooperativeLevel on invalid hwnd.
MotoGP 3 demo fails to accept key presses to control the driver. The game calls SetCooperativeLevel twice. First with an invalid hwnd (but not NULL) and later with the real hwnd.
Signed-off-by: Bernhard Übelacker bernhardu@vr-web.de Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dinput/device.c | 4 ++-- dlls/dinput/tests/keyboard.c | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index 1ba6ffc..e525f01 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -1028,10 +1028,10 @@ HRESULT WINAPI IDirectInputDevice2WImpl_SetCooperativeLevel(LPDIRECTINPUTDEVICE8
if (hwnd && GetWindowLongW(hwnd, GWL_STYLE) & WS_CHILD) return E_HANDLE;
- if (dwflags == (DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)) + if (!hwnd && dwflags == (DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)) hwnd = GetDesktopWindow();
- if (!hwnd) return E_HANDLE; + if (!IsWindow(hwnd)) return E_HANDLE;
/* For security reasons native does not allow exclusive background level for mouse and keyboard only */ diff --git a/dlls/dinput/tests/keyboard.c b/dlls/dinput/tests/keyboard.c index 520740d..e51e332 100644 --- a/dlls/dinput/tests/keyboard.c +++ b/dlls/dinput/tests/keyboard.c @@ -121,6 +121,12 @@ static const HRESULT SetCoop_null_window[16] = { E_INVALIDARG, E_HANDLE, S_OK, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG};
+static const HRESULT SetCoop_invalid_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 const HRESULT SetCoop_real_window[16] = { E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, S_OK, S_OK, E_INVALIDARG, @@ -151,6 +157,11 @@ static void test_set_coop(IDirectInputA *pDI, HWND hwnd) } for (i=0; i<16; i++) { + hr = IDirectInputDevice_SetCooperativeLevel(pKeyboard, (HWND)0x400000, i); + ok(hr == SetCoop_invalid_window[i], "SetCooperativeLevel(invalid, %d): %08x\n", i, hr); + } + for (i=0; i<16; i++) + { hr = IDirectInputDevice_SetCooperativeLevel(pKeyboard, hwnd, i); ok(hr == SetCoop_real_window[i], "SetCooperativeLevel(hwnd, %d): %08x\n", i, hr); }