Vitaliy Margolen : dinput: Return proper errors in SetCooperativeLevel.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Sep 20 05:33:51 CDT 2006


Module: wine
Branch: master
Commit: adadb5be7815f0e9a404afeda04f72122918c234
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=adadb5be7815f0e9a404afeda04f72122918c234

Author: Vitaliy Margolen <wine-patch at kievinfo.com>
Date:   Sat Sep 16 12:25:29 2006 -0600

dinput: Return proper errors in SetCooperativeLevel.

---

 dlls/dinput/mouse.c       |   15 +++++++++---
 dlls/dinput/tests/mouse.c |   58 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+), 3 deletions(-)

diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 363d1b8..5d4c04e 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -363,14 +363,23 @@ static HRESULT WINAPI SysMouseAImpl_SetC
 	TRACE(" cooperative level : ");
 	_dump_cooperativelevel_DI(dwflags);
     }
+
+    if ((dwflags & (DISCL_EXCLUSIVE | DISCL_NONEXCLUSIVE)) == 0 ||
+        (dwflags & (DISCL_EXCLUSIVE | DISCL_NONEXCLUSIVE)) == (DISCL_EXCLUSIVE | DISCL_NONEXCLUSIVE) ||
+        (dwflags & (DISCL_FOREGROUND | DISCL_BACKGROUND)) == 0 ||
+        (dwflags & (DISCL_FOREGROUND | DISCL_BACKGROUND)) == (DISCL_FOREGROUND | DISCL_BACKGROUND))
+        return DIERR_INVALIDPARAM;
     
+    if (dwflags == (DISCL_NONEXCLUSIVE | DISCL_BACKGROUND))
+        hwnd = GetDesktopWindow();
+
+    if (!hwnd) return E_HANDLE;
+
     if (dwflags & DISCL_EXCLUSIVE && dwflags & DISCL_BACKGROUND) {
         return DIERR_UNSUPPORTED;
     }
-    
+
     /* Store the window which asks for the mouse */
-    if (!hwnd)
-	hwnd = GetDesktopWindow();
     This->win = hwnd;
     This->dwCoopLevel = dwflags;
     
diff --git a/dlls/dinput/tests/mouse.c b/dlls/dinput/tests/mouse.c
index 07b4c01..fa542b1 100644
--- a/dlls/dinput/tests/mouse.c
+++ b/dlls/dinput/tests/mouse.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2005 Robert Reif
+ * Copyright (c) 2006 Vitaliy Margolen
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -18,6 +19,7 @@
 
 #define DIRECTINPUT_VERSION 0x0700
 
+#define COBJMACROS
 #define NONAMELESSSTRUCT
 #define NONAMELESSUNION
 #include <windows.h>
@@ -32,8 +34,64 @@ #include "dinput.h"
 #include "dxerr8.h"
 #include "dinput_test.h"
 
+static const HRESULT SetCoop_null_window[16] =  {
+    E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG,
+    E_INVALIDARG, E_HANDLE,     E_HANDLE,     E_INVALIDARG,
+    E_INVALIDARG, E_HANDLE,     S_OK,         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,
+    E_INVALIDARG, E_NOTIMPL,    S_OK,         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;
+
+    hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL);
+    ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %s\n", DXGetErrorString8(hr));
+    if (FAILED(hr)) return;
+
+    for (i=0; i<16; i++)
+    {
+        hr = IDirectInputDevice_SetCooperativeLevel(pMouse, NULL, i);
+        ok(hr == SetCoop_null_window[i], "SetCooperativeLevel(NULL, %d): %s\n", i, DXGetErrorString8(hr));
+    }
+    for (i=0; i<16; i++)
+    {
+        hr = IDirectInputDevice_SetCooperativeLevel(pMouse, hwnd, i);
+        ok(hr == SetCoop_real_window[i], "SetCooperativeLevel(hwnd, %d): %s\n", i, DXGetErrorString8(hr));
+    }
+
+    if (pMouse) IUnknown_Release(pMouse);
+}
+
 static void mouse_tests(void)
 {
+    HRESULT hr;
+    LPDIRECTINPUT pDI = NULL;
+    HINSTANCE hInstance = GetModuleHandle(NULL);
+    HWND hwnd;
+
+    hr = DirectInputCreate(hInstance, DIRECTINPUT_VERSION, &pDI, NULL);
+    ok(SUCCEEDED(hr), "DirectInputCreate() failed: %s\n", DXGetErrorString8(hr));
+    if (FAILED(hr)) return;
+
+    hwnd = CreateWindow("static", "Title", WS_OVERLAPPEDWINDOW,
+                        10, 10, 200, 200, NULL, NULL, NULL, NULL);
+    ok(hwnd != NULL, "err: %ld\n", GetLastError());
+    if (!hwnd) return;
+
+    ShowWindow(hwnd, SW_SHOW);
+
+    test_set_coop(pDI, hwnd);
+
+    DestroyWindow(hwnd);
+    if (pDI) IUnknown_Release(pDI);
 }
 
 START_TEST(mouse)




More information about the wine-cvs mailing list