[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