dinput: Return proper errors in SetCooperativeLevel.
Vitaliy Margolen
wine-patch at kievinfo.com
Sat Sep 16 13:25:29 CDT 2006
ChangeLog:
dinput: Return proper errors in SetCooperativeLevel.
With tests.
dlls/dinput/mouse.c | 15 +++++++++---
dlls/dinput/tests/mouse.c | 58 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+), 3 deletions(-)
-------------- next part --------------
b23587e270d461489771fc5f82a829c5c3c983f9
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 10bae86..af76bd8 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-patches
mailing list