dinput: Move acquired flag to the base device class. Add tests.
This commit is contained in:
parent
813ae10f33
commit
f7eacd64d1
|
@ -447,6 +447,34 @@ BOOL DIEnumDevicesCallbackAtoW(LPCDIDEVICEOBJECTINSTANCEA lpddi, LPVOID lpvRef)
|
|||
return data->lpCallBack(&ddtmp, data->lpvRef);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Acquire
|
||||
*/
|
||||
|
||||
HRESULT WINAPI IDirectInputDevice2AImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
|
||||
{
|
||||
IDirectInputDevice2AImpl *This = (IDirectInputDevice2AImpl *)iface;
|
||||
|
||||
if (This->acquired) return S_FALSE;
|
||||
This->acquired = 1;
|
||||
|
||||
return DI_OK;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Unacquire
|
||||
*/
|
||||
|
||||
HRESULT WINAPI IDirectInputDevice2AImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
|
||||
{
|
||||
IDirectInputDevice2AImpl *This = (IDirectInputDevice2AImpl *)iface;
|
||||
|
||||
if (!This->acquired) return DI_NOEFFECT;
|
||||
This->acquired = 0;
|
||||
|
||||
return DI_OK;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* IDirectInputDeviceA
|
||||
*/
|
||||
|
|
|
@ -36,6 +36,7 @@ struct IDirectInputDevice2AImpl
|
|||
HANDLE hEvent;
|
||||
DWORD dwCoopLevel;
|
||||
HWND win;
|
||||
int acquired;
|
||||
};
|
||||
|
||||
/* Routines to do DataFormat / WineFormat conversions */
|
||||
|
@ -99,6 +100,8 @@ extern void _dump_DIDATAFORMAT(const DIDATAFORMAT *df) ;
|
|||
extern const char *_dump_dinput_GUID(const GUID *guid) ;
|
||||
|
||||
/* And the stubs */
|
||||
extern HRESULT WINAPI IDirectInputDevice2AImpl_Acquire(LPDIRECTINPUTDEVICE8A iface);
|
||||
extern HRESULT WINAPI IDirectInputDevice2AImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface);
|
||||
extern HRESULT WINAPI IDirectInputDevice2AImpl_SetDataFormat(
|
||||
LPDIRECTINPUTDEVICE8A iface,LPCDIDATAFORMAT df ) ;
|
||||
extern HRESULT WINAPI IDirectInputDevice2AImpl_SetCooperativeLevel(
|
||||
|
|
|
@ -108,7 +108,6 @@ struct JoystickImpl
|
|||
ObjProps *props;
|
||||
LPDIDEVICEOBJECTDATA data_queue;
|
||||
int queue_head, queue_tail, queue_len;
|
||||
BOOL acquired;
|
||||
char *name;
|
||||
DIDEVCAPS devcaps;
|
||||
LONG deadzone;
|
||||
|
@ -499,7 +498,6 @@ static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *di
|
|||
newDevice->base.lpVtbl = jvt;
|
||||
newDevice->base.ref = 1;
|
||||
newDevice->dinput = dinput;
|
||||
newDevice->acquired = FALSE;
|
||||
newDevice->overflow = FALSE;
|
||||
CopyMemory(&newDevice->base.guid, rguid, sizeof(*rguid));
|
||||
|
||||
|
@ -733,7 +731,7 @@ static HRESULT WINAPI JoystickAImpl_SetDataFormat(
|
|||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
|
||||
if (This->acquired) {
|
||||
if (This->base.acquired) {
|
||||
WARN("acquired\n");
|
||||
return DIERR_ACQUIRED;
|
||||
}
|
||||
|
@ -793,7 +791,7 @@ static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
|
|||
|
||||
TRACE("(%p)\n",This);
|
||||
|
||||
if (This->acquired) {
|
||||
if (This->base.acquired) {
|
||||
WARN("already acquired\n");
|
||||
return S_FALSE;
|
||||
}
|
||||
|
@ -809,7 +807,7 @@ static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
|
|||
}
|
||||
}
|
||||
|
||||
This->acquired = TRUE;
|
||||
This->base.acquired = 1;
|
||||
|
||||
return DI_OK;
|
||||
}
|
||||
|
@ -820,24 +818,19 @@ static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
|
|||
static HRESULT WINAPI JoystickAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
|
||||
{
|
||||
JoystickImpl *This = (JoystickImpl *)iface;
|
||||
HRESULT res;
|
||||
|
||||
TRACE("(%p)\n",This);
|
||||
|
||||
if (!This->acquired) {
|
||||
WARN("not acquired\n");
|
||||
return DIERR_NOTACQUIRED;
|
||||
}
|
||||
if ((res = IDirectInputDevice2AImpl_Unacquire(iface)) != DI_OK) return res;
|
||||
|
||||
if (This->joyfd!=-1) {
|
||||
TRACE("closing joystick device\n");
|
||||
close(This->joyfd);
|
||||
This->joyfd = -1;
|
||||
This->acquired = FALSE;
|
||||
return DI_OK;
|
||||
}
|
||||
|
||||
This->acquired = FALSE;
|
||||
|
||||
return DI_NOEFFECT;
|
||||
}
|
||||
|
||||
|
@ -1011,7 +1004,7 @@ static HRESULT WINAPI JoystickAImpl_GetDeviceState(
|
|||
|
||||
TRACE("(%p,0x%08x,%p)\n", This, len, ptr);
|
||||
|
||||
if (!This->acquired) {
|
||||
if (!This->base.acquired) {
|
||||
WARN("not acquired\n");
|
||||
return DIERR_NOTACQUIRED;
|
||||
}
|
||||
|
@ -1042,7 +1035,7 @@ static HRESULT WINAPI JoystickAImpl_GetDeviceData(
|
|||
|
||||
TRACE("(%p)->(dods=%d,entries=%d,fl=0x%08x)\n", This, dodsize, *entries, flags);
|
||||
|
||||
if (!This->acquired) {
|
||||
if (!This->base.acquired) {
|
||||
WARN("not acquired\n");
|
||||
return DIERR_NOTACQUIRED;
|
||||
}
|
||||
|
@ -1250,7 +1243,7 @@ static HRESULT WINAPI JoystickAImpl_Poll(LPDIRECTINPUTDEVICE8A iface)
|
|||
|
||||
TRACE("(%p)\n",This);
|
||||
|
||||
if (!This->acquired) {
|
||||
if (!This->base.acquired) {
|
||||
WARN("not acquired\n");
|
||||
return DIERR_NOTACQUIRED;
|
||||
}
|
||||
|
|
|
@ -51,8 +51,6 @@ struct SysKeyboardImpl
|
|||
IDirectInputImpl* dinput;
|
||||
|
||||
/* SysKeyboardAImpl */
|
||||
int acquired;
|
||||
|
||||
LPDIDEVICEOBJECTDATA data_queue; /* buffer for 'GetDeviceData'. Alloc at
|
||||
'Acquire', Free at 'Unacquire' */
|
||||
int queue_len; /* size of the queue - set in 'SetProperty' */
|
||||
|
@ -290,7 +288,7 @@ static HRESULT WINAPI SysKeyboardAImpl_SetProperty(
|
|||
|
||||
TRACE("(buffersize=%d)\n", pd->dwData);
|
||||
|
||||
if (This->acquired)
|
||||
if (This->base.acquired)
|
||||
return DIERR_INVALIDPARAM;
|
||||
|
||||
This->queue_len = pd->dwData;
|
||||
|
@ -321,7 +319,7 @@ static HRESULT WINAPI SysKeyboardAImpl_GetProperty(
|
|||
|
||||
TRACE("(buffersize=%d)\n", pd->dwData);
|
||||
|
||||
if (This->acquired)
|
||||
if (This->base.acquired)
|
||||
return DIERR_INVALIDPARAM;
|
||||
|
||||
pd->dwData = This->queue_len;
|
||||
|
@ -343,7 +341,7 @@ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceState(
|
|||
SysKeyboardImpl *This = (SysKeyboardImpl *)iface;
|
||||
TRACE("(%p)->(%d,%p)\n", This, len, ptr);
|
||||
|
||||
if (This->acquired == 0) return DIERR_NOTACQUIRED;
|
||||
if (!This->base.acquired) return DIERR_NOTACQUIRED;
|
||||
|
||||
if (len != WINE_DINPUT_KEYBOARD_MAX_KEYS)
|
||||
return DIERR_INVALIDPARAM;
|
||||
|
@ -379,7 +377,7 @@ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceData(
|
|||
TRACE("(%p) %p -> %p(%d) x%d, 0x%08x\n",
|
||||
This, dod, entries, entries ? *entries : 0, dodsize, flags);
|
||||
|
||||
if (!This->acquired)
|
||||
if (!This->base.acquired)
|
||||
return DIERR_NOTACQUIRED;
|
||||
|
||||
if (!This->data_queue)
|
||||
|
@ -476,11 +474,11 @@ static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface);
|
|||
static HRESULT WINAPI SysKeyboardAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
|
||||
{
|
||||
SysKeyboardImpl *This = (SysKeyboardImpl *)iface;
|
||||
HRESULT res;
|
||||
|
||||
TRACE("(%p)\n",This);
|
||||
|
||||
if (This->acquired) return DI_NOEFFECT;
|
||||
This->acquired = 1;
|
||||
if ((res = IDirectInputDevice2AImpl_Acquire(iface)) != DI_OK) return res;
|
||||
|
||||
if (current_lock != NULL) {
|
||||
FIXME("Not more than one keyboard can be acquired at the same time.\n");
|
||||
|
@ -505,22 +503,20 @@ static HRESULT WINAPI SysKeyboardAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
|
|||
|
||||
static HRESULT WINAPI SysKeyboardAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
|
||||
{
|
||||
SysKeyboardImpl *This = (SysKeyboardImpl *)iface;
|
||||
TRACE("(this=%p)\n",This);
|
||||
SysKeyboardImpl *This = (SysKeyboardImpl *)iface;
|
||||
HRESULT res;
|
||||
|
||||
if (This->acquired == 0)
|
||||
return DI_NOEFFECT;
|
||||
TRACE("(this=%p)\n",This);
|
||||
|
||||
set_dinput_hook(WH_KEYBOARD_LL, NULL);
|
||||
if ((res = IDirectInputDevice2AImpl_Unacquire(iface)) != DI_OK) return res;
|
||||
|
||||
/* No more locks */
|
||||
if (current_lock == This)
|
||||
current_lock = NULL;
|
||||
else
|
||||
ERR("this != current_lock\n");
|
||||
set_dinput_hook(WH_KEYBOARD_LL, NULL);
|
||||
|
||||
/* Unacquire device */
|
||||
This->acquired = 0;
|
||||
/* No more locks */
|
||||
if (current_lock == This)
|
||||
current_lock = NULL;
|
||||
else
|
||||
ERR("this != current_lock\n");
|
||||
|
||||
if (This->queue_len >= 0) {
|
||||
HeapFree(GetProcessHeap(), 0, This->data_queue);
|
||||
|
|
|
@ -133,7 +133,6 @@ struct SysMouseImpl
|
|||
* reach window borders (for e.g. shooters, "surface movement" games) */
|
||||
WARP_STATUS need_warp;
|
||||
DWORD last_warped;
|
||||
int acquired;
|
||||
CRITICAL_SECTION crit;
|
||||
|
||||
/* This is for mouse reporting. */
|
||||
|
@ -533,13 +532,11 @@ static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
|
|||
SysMouseImpl *This = (SysMouseImpl *)iface;
|
||||
RECT rect;
|
||||
POINT point;
|
||||
HRESULT res;
|
||||
|
||||
TRACE("(this=%p)\n",This);
|
||||
|
||||
if (This->acquired)
|
||||
return S_FALSE;
|
||||
|
||||
This->acquired = 1;
|
||||
|
||||
if ((res = IDirectInputDevice2AImpl_Acquire(iface)) != DI_OK) return res;
|
||||
|
||||
/* Store (in a global variable) the current lock */
|
||||
current_lock = (IDirectInputDevice8A*)This;
|
||||
|
@ -596,12 +593,11 @@ static HRESULT WINAPI SysMouseAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
|
|||
static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
|
||||
{
|
||||
SysMouseImpl *This = (SysMouseImpl *)iface;
|
||||
HRESULT res;
|
||||
|
||||
TRACE("(this=%p)\n",This);
|
||||
|
||||
if (0 == This->acquired) {
|
||||
return DI_NOEFFECT;
|
||||
}
|
||||
|
||||
if ((res = IDirectInputDevice2AImpl_Unacquire(iface)) != DI_OK) return res;
|
||||
|
||||
set_dinput_hook(WH_MOUSE_LL, NULL);
|
||||
if (This->base.dwCoopLevel & DISCL_EXCLUSIVE)
|
||||
|
@ -613,9 +609,6 @@ static HRESULT WINAPI SysMouseAImpl_Unacquire(LPDIRECTINPUTDEVICE8A iface)
|
|||
else
|
||||
ERR("this(%p) != current_lock(%p)\n", This, current_lock);
|
||||
|
||||
/* Unacquire device */
|
||||
This->acquired = 0;
|
||||
|
||||
/* And put the mouse cursor back where it was at acquire time */
|
||||
if (This->absolute == 0) {
|
||||
TRACE(" warping mouse back to (%d , %d)\n", This->org_coords.x, This->org_coords.y);
|
||||
|
@ -636,7 +629,7 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceState(
|
|||
) {
|
||||
SysMouseImpl *This = (SysMouseImpl *)iface;
|
||||
|
||||
if(This->acquired == 0) return DIERR_NOTACQUIRED;
|
||||
if(This->base.acquired == 0) return DIERR_NOTACQUIRED;
|
||||
|
||||
EnterCriticalSection(&(This->crit));
|
||||
TRACE("(this=%p,0x%08x,%p):\n", This, len, ptr);
|
||||
|
@ -694,7 +687,7 @@ static HRESULT WINAPI SysMouseAImpl_GetDeviceData(LPDIRECTINPUTDEVICE8A iface,
|
|||
entries, *entries,*entries == INFINITE ? " (INFINITE)" : "",
|
||||
flags, (flags & DIGDD_PEEK) ? " (DIGDD_PEEK)": "" );
|
||||
|
||||
if (This->acquired == 0) {
|
||||
if (This->base.acquired == 0) {
|
||||
WARN(" application tries to get data from an unacquired device !\n");
|
||||
return DIERR_NOTACQUIRED;
|
||||
}
|
||||
|
|
|
@ -271,12 +271,20 @@ static BOOL CALLBACK EnumJoysticks(
|
|||
ok(hr==DI_OK,"IDirectInputDevice_GetDeviceInfo() failed: %s\n",
|
||||
DXGetErrorString8(hr));
|
||||
|
||||
hr = IDirectInputDevice_Unacquire(pJoystick);
|
||||
ok(hr == S_FALSE, "IDirectInputDevice_Unacquire() should have returned S_FALSE, got: %s\n",
|
||||
DXGetErrorString8(hr));
|
||||
|
||||
hr = IDirectInputDevice_Acquire(pJoystick);
|
||||
ok(hr==DI_OK,"IDirectInputDevice_Acquire() failed: %s\n",
|
||||
DXGetErrorString8(hr));
|
||||
if (hr != DI_OK)
|
||||
goto RELEASE;
|
||||
|
||||
hr = IDirectInputDevice_Acquire(pJoystick);
|
||||
ok(hr == S_FALSE, "IDirectInputDevice_Acquire() should have returned S_FALSE, got: %s\n",
|
||||
DXGetErrorString8(hr));
|
||||
|
||||
if (winetest_interactive) {
|
||||
trace("You have 30 seconds to test all axes, sliders, POVs and buttons\n");
|
||||
count = 300;
|
||||
|
|
|
@ -84,8 +84,12 @@ static void acquire_tests(LPDIRECTINPUT pDI, HWND hwnd)
|
|||
ok(hr == DIERR_NOTACQUIRED, "IDirectInputDevice_GetDeviceState(10,) should have failed: %s\n", DXGetErrorString8(hr));
|
||||
hr = IDirectInputDevice_GetDeviceState(pKeyboard, sizeof(kbd_state), kbd_state);
|
||||
ok(hr == DIERR_NOTACQUIRED, "IDirectInputDevice_GetDeviceState() should have failed: %s\n", DXGetErrorString8(hr));
|
||||
hr = IDirectInputDevice_Unacquire(pKeyboard);
|
||||
ok(hr == S_FALSE, "IDirectInputDevice_Unacquire() should have failed: %s\n", DXGetErrorString8(hr));
|
||||
hr = IDirectInputDevice_Acquire(pKeyboard);
|
||||
ok(SUCCEEDED(hr), "IDirectInputDevice_Acquire() failed: %s\n", DXGetErrorString8(hr));
|
||||
hr = IDirectInputDevice_Acquire(pKeyboard);
|
||||
ok(hr == S_FALSE, "IDirectInputDevice_Acquire() should have failed: %s\n", DXGetErrorString8(hr));
|
||||
hr = IDirectInputDevice_GetDeviceState(pKeyboard, 10, kbd_state);
|
||||
ok(hr == DIERR_INVALIDPARAM, "IDirectInputDevice_GetDeviceState(10,) should have failed: %s\n", DXGetErrorString8(hr));
|
||||
hr = IDirectInputDevice_GetDeviceState(pKeyboard, sizeof(kbd_state), kbd_state);
|
||||
|
|
|
@ -68,6 +68,27 @@ static void test_set_coop(LPDIRECTINPUT pDI, HWND hwnd)
|
|||
if (pMouse) IUnknown_Release(pMouse);
|
||||
}
|
||||
|
||||
static void test_acquire(LPDIRECTINPUT pDI, HWND hwnd)
|
||||
{
|
||||
HRESULT hr;
|
||||
LPDIRECTINPUTDEVICE pMouse = NULL;
|
||||
|
||||
hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL);
|
||||
ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %s\n", DXGetErrorString8(hr));
|
||||
if (FAILED(hr)) return;
|
||||
|
||||
hr = IDirectInputDevice_SetDataFormat(pMouse, &c_dfDIMouse);
|
||||
ok(SUCCEEDED(hr), "IDirectInputDevice_SetDataFormat() failed: %s\n", DXGetErrorString8(hr));
|
||||
hr = IDirectInputDevice_Unacquire(pMouse);
|
||||
ok(hr == S_FALSE, "IDirectInputDevice_Unacquire() should have failed: %s\n", DXGetErrorString8(hr));
|
||||
hr = IDirectInputDevice_Acquire(pMouse);
|
||||
ok(SUCCEEDED(hr), "IDirectInputDevice_Acquire() failed: %s\n", DXGetErrorString8(hr));
|
||||
hr = IDirectInputDevice_Acquire(pMouse);
|
||||
ok(hr == S_FALSE, "IDirectInputDevice_Acquire() should have failed: %s\n", DXGetErrorString8(hr));
|
||||
|
||||
if (pMouse) IUnknown_Release(pMouse);
|
||||
}
|
||||
|
||||
static void mouse_tests(void)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
@ -82,13 +103,15 @@ static void mouse_tests(void)
|
|||
hwnd = CreateWindow("static", "Title", WS_OVERLAPPEDWINDOW,
|
||||
10, 10, 200, 200, NULL, NULL, NULL, NULL);
|
||||
ok(hwnd != NULL, "err: %d\n", GetLastError());
|
||||
if (!hwnd) return;
|
||||
if (hwnd)
|
||||
{
|
||||
ShowWindow(hwnd, SW_SHOW);
|
||||
|
||||
ShowWindow(hwnd, SW_SHOW);
|
||||
test_set_coop(pDI, hwnd);
|
||||
test_acquire(pDI, hwnd);
|
||||
|
||||
test_set_coop(pDI, hwnd);
|
||||
|
||||
DestroyWindow(hwnd);
|
||||
DestroyWindow(hwnd);
|
||||
}
|
||||
if (pDI) IUnknown_Release(pDI);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue