On Windows dinput sometimes ignores injected input events. We already do similar check in test_device_input().
Signed-off-by: Arkadiusz Hiler ahiler@codeweavers.com --- dlls/dinput8/tests/device.c | 68 ++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 16 deletions(-)
diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c index 4a6fc21ecec..fd6da6e0495 100644 --- a/dlls/dinput8/tests/device.c +++ b/dlls/dinput8/tests/device.c @@ -1058,6 +1058,8 @@ void test_overlapped_format(void) IDirectInput8A *di = NULL; IDirectInputDevice8A *di_keyboard; struct overlapped_state state; + DIPROPDWORD dp; + DWORD data_size;
hr = CoCreateInstance(&CLSID_DirectInput8, 0, CLSCTX_INPROC_SERVER, &IID_IDirectInput8A, (LPVOID*)&di); if (hr == DIERR_OLDDIRECTINPUTVERSION || @@ -1083,6 +1085,14 @@ void test_overlapped_format(void) hr = IDirectInput8_CreateDevice(di, &GUID_SysKeyboard, &di_keyboard, NULL); ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr);
+ dp.diph.dwSize = sizeof(DIPROPDWORD); + dp.diph.dwHeaderSize = sizeof(DIPROPHEADER); + dp.diph.dwObj = 0; + dp.diph.dwHow = DIPH_DEVICE; + dp.dwData = 10; + hr = IDirectInputDevice8_SetProperty(di_keyboard, DIPROP_BUFFERSIZE, &(dp.diph)); + ok(SUCCEEDED(hr), "IDirectInputDevice8_SetProperty() failed: %08x\n", hr); + /* test overlapped slider - default value 0 */ hr = IDirectInputDevice8_SetDataFormat(di_keyboard, &overlapped_slider_format); ok(SUCCEEDED(hr), "IDirectInputDevice8_SetDataFormat() failed: %08x\n", hr); @@ -1091,20 +1101,33 @@ void test_overlapped_format(void)
SetFocus(hwnd); flush_events(); + data_size = INFINITE; + hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), NULL, &data_size, 0); + ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceData() failed: %08x\n", hr);
/* press D */ keybd_event(0, DIK_D, KEYEVENTF_SCANCODE, 0); flush_events();
- memset(&state, 0xFF, sizeof(state)); - hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(state), &state); - ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceState() failed: %08x\n", hr); + data_size = 10; + hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), NULL, &data_size, 0); + ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceData() failed: %08x\n", hr); + if (data_size != 1) + { + win_skip("We're not able to inject input into Windows dinput8 with events\n"); + } + else + { + memset(&state, 0xFF, sizeof(state)); + hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(state), &state); + ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceState() failed: %08x\n", hr);
- ok(state.keys[0] == 0x00, "key A should be still up\n"); - ok(state.keys[1] == 0x00, "key S should be still up\n"); - ok(state.keys[2] == 0x80, "keydown for D did not register\n"); - ok(state.keys[3] == 0x00, "key F should be still up\n"); - ok(state.extra_element == 0, "State struct was not memset to zero\n"); + ok(state.keys[0] == 0x00, "key A should be still up\n"); + ok(state.keys[1] == 0x00, "key S should be still up\n"); + ok(state.keys[2] == 0x80, "keydown for D did not register\n"); + ok(state.keys[3] == 0x00, "key F should be still up\n"); + ok(state.extra_element == 0, "State struct was not memset to zero\n"); + }
/* release D */ keybd_event(0, DIK_D, KEYEVENTF_SCANCODE|KEYEVENTF_KEYUP, 0); @@ -1121,20 +1144,33 @@ void test_overlapped_format(void)
SetFocus(hwnd); flush_events(); + data_size = INFINITE; + hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), NULL, &data_size, 0); + ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceData() failed: %08x\n", hr);
/* press D */ keybd_event(0, DIK_D, KEYEVENTF_SCANCODE, 0); flush_events();
- memset(&state, 0xFF, sizeof(state)); - hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(state), &state); - ok(SUCCEEDED(hr), "IDirectInputDevice_8GetDeviceState() failed: %08x\n", hr); + data_size = 10; + hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), NULL, &data_size, 0); + ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceData() failed: %08x\n", hr); + if (data_size != 1) + { + win_skip("We're not able to inject input into Windows dinput8 with events\n"); + } + else + { + memset(&state, 0xFF, sizeof(state)); + hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(state), &state); + ok(SUCCEEDED(hr), "IDirectInputDevice_8GetDeviceState() failed: %08x\n", hr);
- ok(state.keys[0] == 0xFF, "key state should have been overwritten by the overlapped POV\n"); - ok(state.keys[1] == 0xFF, "key state should have been overwritten by the overlapped POV\n"); - ok(state.keys[2] == 0xFF, "key state should have been overwritten by the overlapped POV\n"); - ok(state.keys[3] == 0xFF, "key state should have been overwritten by the overlapped POV\n"); - ok(state.extra_element == 0, "State struct was not memset to zero\n"); + ok(state.keys[0] == 0xFF, "key state should have been overwritten by the overlapped POV\n"); + ok(state.keys[1] == 0xFF, "key state should have been overwritten by the overlapped POV\n"); + ok(state.keys[2] == 0xFF, "key state should have been overwritten by the overlapped POV\n"); + ok(state.keys[3] == 0xFF, "key state should have been overwritten by the overlapped POV\n"); + ok(state.extra_element == 0, "State struct was not memset to zero\n"); + }
/* release D */ keybd_event(0, DIK_D, KEYEVENTF_SCANCODE|KEYEVENTF_KEYUP, 0);