Module: wine Branch: master Commit: adadb5be7815f0e9a404afeda04f72122918c234 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=adadb5be7815f0e9a404afed...
Author: Vitaliy Margolen wine-patch@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)