Vitaliy Margolen : dinput: Window supplied to SetCooperativeLevel have to be top level window.
Alexandre Julliard
julliard at winehq.org
Wed Nov 2 14:23:36 CDT 2011
Module: wine
Branch: master
Commit: 8c5a4401449efc52f7309f7b8f45182138b4e13c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8c5a4401449efc52f7309f7b8f45182138b4e13c
Author: Vitaliy Margolen <wine-patches at 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);
}
More information about the wine-cvs
mailing list