From adadb5be7815f0e9a404afeda04f72122918c234 Mon Sep 17 00:00:00 2001 From: Vitaliy Margolen Date: Sat, 16 Sep 2006 12:25:29 -0600 Subject: [PATCH] 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 363d1b82fed..5d4c04e0200 100644 --- a/dlls/dinput/mouse.c +++ b/dlls/dinput/mouse.c @@ -363,14 +363,23 @@ static HRESULT WINAPI SysMouseAImpl_SetCooperativeLevel( 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 07b4c015c77..fa542b1e980 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 @@ -32,8 +34,64 @@ #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)