[PATCH 3/7] dinput: Implement HID joystick IDirectInputDevice8_EnumCreatedEffectObjects.
Rémi Bernon
rbernon at codeweavers.com
Mon Oct 4 02:51:30 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/dinput/joystick_hid.c | 19 ++++++++++++++++++-
dlls/dinput8/tests/hid.c | 5 -----
2 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index b71f9f5f56b..a4f16168dfb 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -112,6 +112,7 @@ struct hid_joystick
BYTE device_state_report_id;
BYTE device_state[DEVICE_STATE_MAX_SIZE];
+ struct list effect_list;
struct pid_control_report pid_device_control;
};
@@ -126,6 +127,7 @@ struct hid_joystick_effect
IDirectInputEffect IDirectInputEffect_iface;
LONG ref;
+ struct list entry;
struct hid_joystick *joystick;
};
@@ -1014,11 +1016,18 @@ static HRESULT WINAPI hid_joystick_EnumCreatedEffectObjects( IDirectInputDevice8
LPDIENUMCREATEDEFFECTOBJECTSCALLBACK callback,
void *context, DWORD flags )
{
+ struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface );
+ struct hid_joystick_effect *effect, *next;
+
FIXME( "iface %p, callback %p, context %p, flags %#x stub!\n", iface, callback, context, flags );
if (!callback) return DIERR_INVALIDPARAM;
+ if (flags) return DIERR_INVALIDPARAM;
- return DIERR_UNSUPPORTED;
+ LIST_FOR_EACH_ENTRY_SAFE(effect, next, &impl->effect_list, struct hid_joystick_effect, entry)
+ if (callback( &effect->IDirectInputEffect_iface, context ) != DIENUM_CONTINUE) break;
+
+ return DI_OK;
}
static HRESULT WINAPI hid_joystick_Poll( IDirectInputDevice8W *iface )
@@ -1707,6 +1716,7 @@ static HRESULT hid_joystick_create_device( IDirectInputImpl *dinput, const GUID
impl->dev_caps.dwSize = sizeof(impl->dev_caps);
impl->dev_caps.dwFlags = DIDC_ATTACHED | DIDC_EMULATED;
impl->dev_caps.dwDevType = instance.dwDevType;
+ list_init( &impl->effect_list );
preparsed = (struct hid_preparsed_data *)impl->preparsed;
@@ -1813,6 +1823,9 @@ static ULONG WINAPI hid_joystick_effect_Release( IDirectInputEffect *iface )
TRACE( "iface %p, ref %u.\n", iface, ref );
if (!ref)
{
+ EnterCriticalSection( &impl->joystick->base.crit );
+ list_remove( &impl->entry );
+ LeaveCriticalSection( &impl->joystick->base.crit );
hid_joystick_private_decref( impl->joystick );
HeapFree( GetProcessHeap(), 0, impl );
}
@@ -1914,6 +1927,10 @@ static HRESULT hid_joystick_effect_create( struct hid_joystick *joystick, IDirec
impl->joystick = joystick;
hid_joystick_private_incref( joystick );
+ EnterCriticalSection( &joystick->base.crit );
+ list_add_tail( &joystick->effect_list, &impl->entry );
+ LeaveCriticalSection( &joystick->base.crit );
+
*out = &impl->IDirectInputEffect_iface;
return DI_OK;
}
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index cc2f3268e6f..90e30cf0534 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -4750,10 +4750,8 @@ static void test_simple_joystick(void)
hr = IDirectInputDevice8_EnumCreatedEffectObjects( device, NULL, effect, 0 );
ok( hr == DIERR_INVALIDPARAM, "IDirectInputDevice8_EnumCreatedEffectObjects returned %#x\n", hr );
hr = IDirectInputDevice8_EnumCreatedEffectObjects( device, check_no_created_effect_objects, effect, 0xdeadbeef );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "IDirectInputDevice8_EnumCreatedEffectObjects returned %#x\n", hr );
hr = IDirectInputDevice8_EnumCreatedEffectObjects( device, check_no_created_effect_objects, (void *)0xdeadbeef, 0 );
- todo_wine
ok( hr == DI_OK, "IDirectInputDevice8_EnumCreatedEffectObjects returned %#x\n", hr );
hr = IDirectInputDevice8_Escape( device, NULL );
@@ -5154,13 +5152,10 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
if (hr != DI_OK) return;
hr = IDirectInputDevice8_EnumCreatedEffectObjects( device, check_no_created_effect_objects, effect, 0xdeadbeef );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "IDirectInputDevice8_EnumCreatedEffectObjects returned %#x\n", hr );
check_params.expect_effect = effect;
hr = IDirectInputDevice8_EnumCreatedEffectObjects( device, check_created_effect_objects, &check_params, 0 );
- todo_wine
ok( hr == DI_OK, "IDirectInputDevice8_EnumCreatedEffectObjects returned %#x\n", hr );
- todo_wine
ok( check_params.count == 1, "got count %u, expected 1\n", check_params.count );
ref = IDirectInputEffect_Release( effect );
--
2.33.0
More information about the wine-devel
mailing list