ReactOS  0.4.14-dev-838-g99f979d
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  ok(hr == S_OK, "Failed: %08x\n", hr);
157  cnt = 1;
158  hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
159  ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
160 
162  ok(hr == S_OK, "Failed: %08x\n", hr);
163  mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0);
165  ok(hr == S_OK, "Failed: %08x\n", hr);
166 
168  ok(hr == S_OK, "Failed: %08x\n", hr);
169  cnt = 1;
170  hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
171  ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
172 
173  /* Check for buffer overflow */
174  for (i = 0; i < 6; i++)
175  mouse_event(MOUSEEVENTF_MOVE, 10 + i, 10 + i, 0, 0);
176 
177  cnt = 1;
178  hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
179  ok(hr == DI_OK, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
180  cnt = 1;
181  hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
182  ok(hr == DI_OK && cnt == 1, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
183 
184  /* Check for granularity property using BYOFFSET */
185  memset(&di_op, 0, sizeof(di_op));
186  di_op.diph.dwHow = DIPH_BYOFFSET;
187  di_op.diph.dwObj = DIMOFS_Y;
188  di_op.diph.dwSize = sizeof(DIPROPDWORD);
189  di_op.diph.dwHeaderSize = sizeof(DIPROPHEADER);
191  /* Granularity of Y axis should be 1! */
192  ok(hr == S_OK && di_op.dwData == 1, "GetProperty(): %08x, dwData: %i but should be 1.\n", hr, di_op.dwData);
193 
194  /* Check for granularity property using BYID */
195  memset(&di_op, 0, sizeof(di_op));
196  di_op.diph.dwHow = DIPH_BYID;
197  /* WINE_MOUSE_Y_AXIS_INSTANCE := 1 */
198  di_op.diph.dwObj = (DIDFT_MAKEINSTANCE(1) | DIDFT_RELAXIS);
199  di_op.diph.dwSize = sizeof(DIPROPDWORD);
200  di_op.diph.dwHeaderSize = sizeof(DIPROPHEADER);
202  /* Granularity of Y axis should be 1! */
203  ok(hr == S_OK && di_op.dwData == 1, "GetProperty(): %08x, dwData: %i but should be 1.\n", hr, di_op.dwData);
204 }
205  if (pMouse) IUnknown_Release(pMouse);
206 
207  DestroyWindow( hwnd2 );
208 }
209 
210 static void test_GetDeviceInfo(IDirectInputA *pDI)
211 {
212  HRESULT hr;
213  IDirectInputDeviceA *pMouse = NULL;
214  DIDEVICEINSTANCEA instA;
215  DIDEVICEINSTANCE_DX3A inst3A;
216 
217  hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL);
218  ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr);
219  if (FAILED(hr)) return;
220 
221  instA.dwSize = sizeof(instA);
223  ok(SUCCEEDED(hr), "got %08x\n", hr);
224 
225  inst3A.dwSize = sizeof(inst3A);
227  ok(SUCCEEDED(hr), "got %08x\n", hr);
228 
229  ok(instA.dwSize != inst3A.dwSize, "got %d, %d \n", instA.dwSize, inst3A.dwSize);
230  ok(IsEqualGUID(&instA.guidInstance, &inst3A.guidInstance), "got %s, %s\n",
232  ok(IsEqualGUID(&instA.guidProduct, &inst3A.guidProduct), "got %s, %s\n",
234  ok(instA.dwDevType == inst3A.dwDevType, "got %d, %d\n", instA.dwDevType, inst3A.dwDevType);
235 
236  IUnknown_Release(pMouse);
237 }
238 
239 static BOOL CALLBACK EnumAxes(const DIDEVICEOBJECTINSTANCEA *pdidoi, void *pContext)
240 {
241  if (IsEqualIID(&pdidoi->guidType, &GUID_XAxis) ||
242  IsEqualIID(&pdidoi->guidType, &GUID_YAxis) ||
243  IsEqualIID(&pdidoi->guidType, &GUID_ZAxis))
244  {
245  ok(pdidoi->dwFlags & DIDOI_ASPECTPOSITION, "Missing DIDOI_ASPECTPOSITION, flags are 0x%x\n",
246  pdidoi->dwFlags);
247  }
248  else
249  ok(pdidoi->dwFlags == 0, "Flags are 0x%x\n", pdidoi->dwFlags);
250 
251  return DIENUM_CONTINUE;
252 }
253 
254 static void test_mouse_EnumObjects(IDirectInputA *pDI)
255 {
256  HRESULT hr;
257  IDirectInputDeviceA *pMouse = NULL;
258 
259  hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL);
260  ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr);
261  if (FAILED(hr)) return;
262 
264  ok(hr==DI_OK,"IDirectInputDevice_EnumObjects() failed: %08x\n", hr);
265 
266  if (pMouse) IUnknown_Release(pMouse);
267 }
268 
269 static void mouse_tests(void)
270 {
271  HRESULT hr;
272  IDirectInputA *pDI = NULL;
274  HWND hwnd;
275  ULONG ref = 0;
276 
279  {
280  skip("Tests require a newer dinput version\n");
281  return;
282  }
283  ok(SUCCEEDED(hr), "DirectInputCreateA() failed: %08x\n", hr);
284  if (FAILED(hr)) return;
285 
286  hwnd = CreateWindowA("static", "Title", WS_OVERLAPPEDWINDOW, 10, 10, 200, 200, NULL, NULL,
287  NULL, NULL);
288  ok(hwnd != NULL, "err: %d\n", GetLastError());
289  if (hwnd)
290  {
292 
293  test_set_coop(pDI, hwnd);
294  test_acquire(pDI, hwnd);
295  test_GetDeviceInfo(pDI);
297 
299  }
300  if (pDI) ref = IUnknown_Release(pDI);
301  ok(!ref, "IDirectInput_Release() reference count = %d\n", ref);
302 }
303 
305 {
307 
308  mouse_tests();
309 
310  CoUninitialize();
311 }
static void test_set_coop(IDirectInputA *pDI, HWND hwnd)
Definition: mouse.c:51
GUID guidInstance
Definition: dinput.h:413
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:1614
#define IDirectInputDevice_EnumObjects(p, a, b, c)
Definition: dinput.h:1605
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:2296
#define CALLBACK
Definition: compat.h:27
static void mouse_tests(void)
Definition: mouse.c:269
#define DIDFT_MAKEINSTANCE(n)
Definition: dinput.h:762
#define IDirectInputDevice_GetDeviceState(p, a, b)
Definition: dinput.h:1610
const char * wine_dbgstr_guid(const GUID *guid)
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:1606
Definition: send.c:47
static HWND child
Definition: cursoricon.c:298
#define DIPH_DEVICE
Definition: dinput.h:835
#define DISCL_NONEXCLUSIVE
Definition: dinput.h:964
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)
unsigned int BOOL
Definition: ntddk_ex.h:94
static void test_mouse_EnumObjects(IDirectInputA *pDI)
Definition: mouse.c:254
#define DIPH_BYOFFSET
Definition: dinput.h:836
DWORD dwDevType
Definition: dinput.h:415
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4290
#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
GUID guidProduct
Definition: dinput.h:414
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
#define DIDOI_ASPECTPOSITION
Definition: dinput.h:820
LONG HRESULT
Definition: typedefs.h:77
POINT pMouse
Definition: magnifier.c:62
unsigned long DWORD
Definition: ntddk_ex.h:95
#define DISCL_FOREGROUND
Definition: dinput.h:965
#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:1611
#define IDirectInputDevice_SetProperty(p, a, b)
Definition: dinput.h:1607
#define IDirectInputDevice_Acquire(p)
Definition: dinput.h:1608
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:2067
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99
DWORD dwObj
Definition: dinput.h:830
static BOOL CALLBACK EnumAxes(const DIDEVICEOBJECTINSTANCEA *pdidoi, void *pContext)
Definition: mouse.c:239
#define IDirectInputDevice_SetDataFormat(p, a)
Definition: dinput.h:1612
#define IDirectInputDevice_GetDeviceInfo(p, a)
Definition: dinput.h:1616
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
#define DIMOFS_Y
Definition: dinput.h:2127
#define skip(...)
Definition: atltest.h:64
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
#define DI_OK
Definition: dinput.h:128
#define DIENUM_CONTINUE
Definition: dinput.h:188
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define IDirectInputDevice_Unacquire(p)
Definition: dinput.h:1609
DWORD dwHeaderSize
Definition: dinput.h:829
unsigned int ULONG
Definition: retypes.h:1
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:847
BOOL WINAPI SetForegroundWindow(_In_ HWND)
#define DIDFT_ALL
Definition: dinput.h:750
START_TEST(mouse)
Definition: mouse.c:304
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:229
static void test_GetDeviceInfo(IDirectInputA *pDI)
Definition: mouse.c:210
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#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