ReactOS  0.4.13-dev-249-gcba1a2f
mouse.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2005 Robert Reif
3  * Copyright (c) 2006 Vitaliy Margolen
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19 
20 #define DIRECTINPUT_VERSION 0x0700
21 
22 #define COBJMACROS
23 #include <windows.h>
24 
25 #include <math.h>
26 #include <stdlib.h>
27 
28 #include "wine/test.h"
29 #include "windef.h"
30 #include "wingdi.h"
31 #include "dinput.h"
32 
33 static const HRESULT SetCoop_null_window[16] = {
38 
39 static const HRESULT SetCoop_real_window[16] = {
44 
45 static const HRESULT SetCoop_child_window[16] = {
50 
51 static void test_set_coop(IDirectInputA *pDI, HWND hwnd)
52 {
53  HRESULT hr;
54  IDirectInputDeviceA *pMouse = NULL;
55  int i;
56  HWND child;
57 
58  hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL);
59  ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr);
60  if (FAILED(hr)) return;
61 
62  for (i=0; i<16; i++)
63  {
65  ok(hr == SetCoop_null_window[i], "SetCooperativeLevel(NULL, %d): %08x\n", i, hr);
66  }
67  for (i=0; i<16; i++)
68  {
70  ok(hr == SetCoop_real_window[i], "SetCooperativeLevel(hwnd, %d): %08x\n", i, hr);
71  }
72 
73  child = CreateWindowA("static", "Title", WS_CHILD | WS_VISIBLE, 10, 10, 50, 50, hwnd, NULL,
74  NULL, NULL);
75  ok(child != NULL, "err: %d\n", GetLastError());
76 
77  for (i=0; i<16; i++)
78  {
80  ok(hr == SetCoop_child_window[i], "SetCooperativeLevel(child, %d): %08x\n", i, hr);
81  }
82 
84  if (pMouse) IUnknown_Release(pMouse);
85 }
86 
87 static void test_acquire(IDirectInputA *pDI, HWND hwnd)
88 {
89  HRESULT hr;
90  IDirectInputDeviceA *pMouse = NULL;
91  DIMOUSESTATE m_state;
92  HWND hwnd2;
93  DIPROPDWORD di_op;
94  DIDEVICEOBJECTDATA mouse_state;
95  DWORD cnt;
96  int i;
97 
99  {
100  skip("Not running as foreground app, skipping acquire tests\n");
101  return;
102  }
103 
104  hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL);
105  ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr);
106  if (FAILED(hr)) return;
107 
109  ok(hr == S_OK, "SetCooperativeLevel: %08x\n", hr);
110 
111  memset(&di_op, 0, sizeof(di_op));
112  di_op.dwData = 5;
113  di_op.diph.dwHow = DIPH_DEVICE;
114  di_op.diph.dwSize = sizeof(DIPROPDWORD);
115  di_op.diph.dwHeaderSize = sizeof(DIPROPHEADER);
117  ok(hr == S_OK, "SetProperty() failed: %08x\n", hr);
118 
120  ok(SUCCEEDED(hr), "IDirectInputDevice_SetDataFormat() failed: %08x\n", hr);
122  ok(hr == S_FALSE, "IDirectInputDevice_Unacquire() should have failed: %08x\n", hr);
124  ok(SUCCEEDED(hr), "IDirectInputDevice_Acquire() failed: %08x\n", hr);
126  ok(hr == S_FALSE, "IDirectInputDevice_Acquire() should have failed: %08x\n", hr);
127 
128  /* Foreground coop level requires window to have focus */
129  /* Create a temporary window, this should make dinput
130  * lose mouse input */
131  hwnd2 = CreateWindowA("static", "Temporary", WS_VISIBLE, 10, 210, 200, 200, NULL, NULL, NULL,
132  NULL);
133  ok(hwnd2 != NULL, "CreateWindowA failed with %u\n", GetLastError());
134 
135  hr = IDirectInputDevice_GetDeviceState(pMouse, sizeof(m_state), &m_state);
136  ok(hr == DIERR_NOTACQUIRED, "GetDeviceState() should have failed: %08x\n", hr);
137 
139  ok(hr == DIERR_OTHERAPPHASPRIO, "Acquire() should have failed: %08x\n", hr);
140 
143  ok(hr == S_OK, "Acquire() failed: %08x\n", hr);
144 
146  skip("ROSTESTS-176/CORE-9710: Skipping randomly failing tests\n");
147 else {
148 
149  mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0);
150  cnt = 1;
151  hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
152  ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
153 
154  mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0);
156  cnt = 1;
157  hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
158  ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
159 
161  mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0);
164  cnt = 1;
165  hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
166  ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
167 
168  /* Check for buffer overflow */
169  for (i = 0; i < 6; i++)
170  mouse_event(MOUSEEVENTF_MOVE, 10 + i, 10 + i, 0, 0);
171 
172  cnt = 1;
173  hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
174  ok(hr == DI_OK, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
175  cnt = 1;
176  hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
177  ok(hr == DI_OK && cnt == 1, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
178 
179  /* Check for granularity property using BYOFFSET */
180  memset(&di_op, 0, sizeof(di_op));
181  di_op.diph.dwHow = DIPH_BYOFFSET;
182  di_op.diph.dwObj = DIMOFS_Y;
183  di_op.diph.dwSize = sizeof(DIPROPDWORD);
184  di_op.diph.dwHeaderSize = sizeof(DIPROPHEADER);
186  /* Granularity of Y axis should be 1! */
187  ok(hr == S_OK && di_op.dwData == 1, "GetProperty(): %08x, dwData: %i but should be 1.\n", hr, di_op.dwData);
188 
189  /* Check for granularity property using BYID */
190  memset(&di_op, 0, sizeof(di_op));
191  di_op.diph.dwHow = DIPH_BYID;
192  /* WINE_MOUSE_Y_AXIS_INSTANCE := 1 */
193  di_op.diph.dwObj = (DIDFT_MAKEINSTANCE(1) | DIDFT_RELAXIS);
194  di_op.diph.dwSize = sizeof(DIPROPDWORD);
195  di_op.diph.dwHeaderSize = sizeof(DIPROPHEADER);
197  /* Granularity of Y axis should be 1! */
198  ok(hr == S_OK && di_op.dwData == 1, "GetProperty(): %08x, dwData: %i but should be 1.\n", hr, di_op.dwData);
199 }
200  if (pMouse) IUnknown_Release(pMouse);
201 
202  DestroyWindow( hwnd2 );
203 }
204 
205 static void mouse_tests(void)
206 {
207  HRESULT hr;
208  IDirectInputA *pDI = NULL;
210  HWND hwnd;
211  ULONG ref = 0;
212 
215  {
216  skip("Tests require a newer dinput version\n");
217  return;
218  }
219  ok(SUCCEEDED(hr), "DirectInputCreateA() failed: %08x\n", hr);
220  if (FAILED(hr)) return;
221 
222  hwnd = CreateWindowA("static", "Title", WS_OVERLAPPEDWINDOW, 10, 10, 200, 200, NULL, NULL,
223  NULL, NULL);
224  ok(hwnd != NULL, "err: %d\n", GetLastError());
225  if (hwnd)
226  {
228 
229  test_set_coop(pDI, hwnd);
230  test_acquire(pDI, hwnd);
231 
233  }
234  if (pDI) ref = IUnknown_Release(pDI);
235  ok(!ref, "IDirectInput_Release() reference count = %d\n", ref);
236 }
237 
239 {
241 
242  mouse_tests();
243 
244  CoUninitialize();
245 }
static void test_set_coop(IDirectInputA *pDI, HWND hwnd)
Definition: mouse.c:51
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
DWORD dwSize
Definition: dinput.h:828
#define E_HANDLE
Definition: winerror.h:2850
static const HRESULT SetCoop_null_window[16]
Definition: mouse.c:33
HRESULT hr
Definition: shlfolder.c:183
#define DIPH_BYID
Definition: dinput.h:837
#define IDirectInputDevice_SetCooperativeLevel(p, a, b)
Definition: dinput.h:1616
const DIDATAFORMAT c_dfDIMouse
Definition: data_formats.c:270
#define DIERR_NOTACQUIRED
Definition: dinput.h:167
#define IDirectInput_CreateDevice(p, a, b, c)
Definition: dinput.h:2243
static void mouse_tests(void)
Definition: mouse.c:205
#define DIDFT_MAKEINSTANCE(n)
Definition: dinput.h:762
#define IDirectInputDevice_GetDeviceState(p, a, b)
Definition: dinput.h:1612
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define WS_CHILD
Definition: pedump.c:617
int winetest_interactive
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
DWORD dwHow
Definition: dinput.h:831
BOOL WINAPI DestroyWindow(_In_ HWND)
#define IDirectInputDevice_GetProperty(p, a, b)
Definition: dinput.h:1608
Definition: send.c:47
static HWND child
Definition: cursoricon.c:298
#define DIPH_DEVICE
Definition: dinput.h:835
#define DISCL_NONEXCLUSIVE
Definition: dinput.h:966
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HINSTANCE hInstance
Definition: charmap.c:20
DIPROPHEADER diph
Definition: dinput.h:843
HWND WINAPI SetActiveWindow(_In_ HWND)
#define DIPH_BYOFFSET
Definition: dinput.h:836
#define ok(value,...)
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4184
#define S_FALSE
Definition: winerror.h:2357
void WINAPI mouse_event(_In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ ULONG_PTR)
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
#define SW_SHOW
Definition: winuser.h:769
#define DIPROP_BUFFERSIZE
Definition: dinput.h:885
#define DIERR_OLDDIRECTINPUTVERSION
Definition: dinput.h:141
LONG HRESULT
Definition: typedefs.h:77
POINT pMouse
Definition: magnifier.c:64
unsigned long DWORD
Definition: ntddk_ex.h:95
#define DISCL_FOREGROUND
Definition: dinput.h:967
#define DIPROP_GRANULARITY
Definition: dinput.h:891
static void test_acquire(IDirectInputA *pDI, HWND hwnd)
Definition: mouse.c:87
#define DIRECTINPUT_VERSION
Definition: mouse.c:20
DWORD dwData
Definition: dinput.h:844
#define IDirectInputDevice_GetDeviceData(p, a, b, c, d)
Definition: dinput.h:1613
#define IDirectInputDevice_SetProperty(p, a, b)
Definition: dinput.h:1609
#define IDirectInputDevice_Acquire(p)
Definition: dinput.h:1610
struct DIPROPHEADER DIPROPHEADER
#define S_OK
Definition: intsafe.h:59
#define DIERR_OTHERAPPHASPRIO
Definition: dinput.h:162
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1169
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:1991
#define E_NOTIMPL
Definition: ddrawi.h:99
DWORD dwObj
Definition: dinput.h:830
#define IDirectInputDevice_SetDataFormat(p, a)
Definition: dinput.h:1614
#define DIMOFS_Y
Definition: dinput.h:2129
#define skip(...)
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1897
#define DI_OK
Definition: dinput.h:128
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define IDirectInputDevice_Unacquire(p)
Definition: dinput.h:1611
DWORD dwHeaderSize
Definition: dinput.h:829
unsigned int ULONG
Definition: retypes.h:1
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:845
BOOL WINAPI SetForegroundWindow(_In_ HWND)
START_TEST(mouse)
Definition: mouse.c:238
static const HRESULT SetCoop_real_window[16]
Definition: mouse.c:39
#define WS_VISIBLE
Definition: pedump.c:620
struct DIPROPDWORD DIPROPDWORD
#define memset(x, y, z)
Definition: compat.h:39
HRESULT WINAPI DECLSPEC_HOTPATCH DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter)
Definition: dinput_main.c:227
#define SUCCEEDED(hr)
Definition: intsafe.h:57
static const HRESULT SetCoop_child_window[16]
Definition: mouse.c:45
#define DIDFT_RELAXIS
Definition: dinput.h:751