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