Rémi Bernon : windows.gaming.input: Implement and instantiate ConstantForceEffect runtimeclass stubs.

Alexandre Julliard julliard at winehq.org
Mon May 16 15:37:56 CDT 2022


Module: wine
Branch: master
Commit: aa37aad2c894972ba1f1e6cfb932ceb63ed52450
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=aa37aad2c894972ba1f1e6cfb932ceb63ed52450

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Wed Apr 27 12:15:58 2022 +0200

windows.gaming.input: Implement and instantiate ConstantForceEffect runtimeclass stubs.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dinput/tests/force_feedback.c          |   3 +-
 dlls/windows.gaming.input/constant_effect.c | 117 +++++++++++++++++++++++++++-
 dlls/windows.gaming.input/private.h         |   8 ++
 3 files changed, 122 insertions(+), 6 deletions(-)

diff --git a/dlls/dinput/tests/force_feedback.c b/dlls/dinput/tests/force_feedback.c
index 806212d966d..e688f575704 100644
--- a/dlls/dinput/tests/force_feedback.c
+++ b/dlls/dinput/tests/force_feedback.c
@@ -5624,15 +5624,14 @@ static void test_windows_gaming_input(void)
     pWindowsDeleteString( str );
 
     hr = IActivationFactory_ActivateInstance( activation_factory, &tmp_inspectable );
-    todo_wine
     ok( hr == S_OK, "QueryInterface returned %#lx\n", hr );
     IActivationFactory_Release( activation_factory );
-    if (hr != S_OK) goto skip_tests;
 
     hr = IInspectable_QueryInterface( tmp_inspectable, &IID_IForceFeedbackEffect, (void **)&effect );
     todo_wine
     ok( hr == S_OK, "QueryInterface returned %#lx\n", hr );
     IInspectable_Release( tmp_inspectable );
+    if (hr != S_OK) goto skip_tests;
 
     hr = IForceFeedbackEffect_QueryInterface( effect, &IID_IConstantForceEffect, (void **)&constant_effect );
     ok( hr == S_OK, "QueryInterface returned %#lx\n", hr );
diff --git a/dlls/windows.gaming.input/constant_effect.c b/dlls/windows.gaming.input/constant_effect.c
index a27258dd9bf..a491d49c18c 100644
--- a/dlls/windows.gaming.input/constant_effect.c
+++ b/dlls/windows.gaming.input/constant_effect.c
@@ -20,10 +20,110 @@
 #include "private.h"
 #include "provider.h"
 
-#include "wine/debug.h"
-
 WINE_DEFAULT_DEBUG_CHANNEL(input);
 
+struct constant_effect
+{
+    IConstantForceEffect IConstantForceEffect_iface;
+    LONG ref;
+};
+
+static inline struct constant_effect *impl_from_IConstantForceEffect( IConstantForceEffect *iface )
+{
+    return CONTAINING_RECORD( iface, struct constant_effect, IConstantForceEffect_iface );
+}
+
+static HRESULT WINAPI effect_QueryInterface( IConstantForceEffect *iface, REFIID iid, void **out )
+{
+    struct constant_effect *impl = impl_from_IConstantForceEffect( iface );
+
+    TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out );
+
+    if (IsEqualGUID( iid, &IID_IUnknown ) ||
+        IsEqualGUID( iid, &IID_IInspectable ) ||
+        IsEqualGUID( iid, &IID_IAgileObject ) ||
+        IsEqualGUID( iid, &IID_IConstantForceEffect ))
+    {
+        IInspectable_AddRef( (*out = &impl->IConstantForceEffect_iface) );
+        return S_OK;
+    }
+
+    FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) );
+    *out = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI effect_AddRef( IConstantForceEffect *iface )
+{
+    struct constant_effect *impl = impl_from_IConstantForceEffect( iface );
+    ULONG ref = InterlockedIncrement( &impl->ref );
+    TRACE( "iface %p increasing refcount to %lu.\n", iface, ref );
+    return ref;
+}
+
+static ULONG WINAPI effect_Release( IConstantForceEffect *iface )
+{
+    struct constant_effect *impl = impl_from_IConstantForceEffect( iface );
+    ULONG ref = InterlockedDecrement( &impl->ref );
+
+    TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref );
+
+    if (!ref) free( impl );
+
+    return ref;
+}
+
+static HRESULT WINAPI effect_GetIids( IConstantForceEffect *iface, ULONG *iid_count, IID **iids )
+{
+    FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI effect_GetRuntimeClassName( IConstantForceEffect *iface, HSTRING *class_name )
+{
+    return WindowsCreateString( RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect,
+                                ARRAY_SIZE(RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect),
+                                class_name );
+}
+
+static HRESULT WINAPI effect_GetTrustLevel( IConstantForceEffect *iface, TrustLevel *trust_level )
+{
+    FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI effect_SetParameters( IConstantForceEffect *iface, Vector3 direction, TimeSpan duration )
+{
+    FIXME( "iface %p, direction %s, duration %I64u stub!\n", iface, debugstr_vector3( &direction ), duration.Duration );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI effect_SetParametersWithEnvelope( IConstantForceEffect *iface, Vector3 direction, FLOAT attack_gain,
+                                                        FLOAT sustain_gain, FLOAT release_gain, TimeSpan start_delay,
+                                                        TimeSpan attack_duration, TimeSpan sustain_duration,
+                                                        TimeSpan release_duration, UINT32 repeat_count )
+{
+    FIXME( "iface %p, direction %s, attack_gain %f, sustain_gain %f, release_gain %f, start_delay %I64u, attack_duration %I64u, "
+           "sustain_duration %I64u, release_duration %I64u, repeat_count %u stub!\n", iface, debugstr_vector3( &direction ),
+           attack_gain, sustain_gain, release_gain, start_delay.Duration, attack_duration.Duration, sustain_duration.Duration,
+           release_duration.Duration, repeat_count );
+    return E_NOTIMPL;
+}
+
+static const struct IConstantForceEffectVtbl effect_vtbl =
+{
+    effect_QueryInterface,
+    effect_AddRef,
+    effect_Release,
+    /* IInspectable methods */
+    effect_GetIids,
+    effect_GetRuntimeClassName,
+    effect_GetTrustLevel,
+    /* IConstantForceEffect methods */
+    effect_SetParameters,
+    effect_SetParametersWithEnvelope,
+};
+
 struct constant_factory
 {
     IActivationFactory IActivationFactory_iface;
@@ -91,8 +191,17 @@ static HRESULT WINAPI activation_GetTrustLevel( IActivationFactory *iface, Trust
 
 static HRESULT WINAPI activation_ActivateInstance( IActivationFactory *iface, IInspectable **instance )
 {
-    FIXME( "iface %p, instance %p stub!\n", iface, instance );
-    return E_NOTIMPL;
+    struct constant_effect *impl;
+
+    TRACE( "iface %p, instance %p.\n", iface, instance );
+
+    if (!(impl = calloc( 1, sizeof(struct constant_effect) ))) return E_OUTOFMEMORY;
+    impl->IConstantForceEffect_iface.lpVtbl = &effect_vtbl;
+    impl->ref = 1;
+
+    *instance = (IInspectable *)&impl->IConstantForceEffect_iface;
+    TRACE( "created ConstantForceEffect %p\n", *instance );
+    return S_OK;
 }
 
 static const struct IActivationFactoryVtbl activation_vtbl =
diff --git a/dlls/windows.gaming.input/private.h b/dlls/windows.gaming.input/private.h
index 2e97f182e78..9bbaae5554b 100644
--- a/dlls/windows.gaming.input/private.h
+++ b/dlls/windows.gaming.input/private.h
@@ -31,6 +31,7 @@
 
 #define WIDL_using_Windows_Foundation
 #define WIDL_using_Windows_Foundation_Collections
+#define WIDL_using_Windows_Foundation_Numerics
 #include "windows.foundation.h"
 #define WIDL_using_Windows_Devices_Power
 #define WIDL_using_Windows_Gaming_Input
@@ -38,6 +39,7 @@
 #define WIDL_using_Windows_Gaming_Input_ForceFeedback
 #include "windows.gaming.input.custom.h"
 
+#include "wine/debug.h"
 #include "wine/list.h"
 
 extern HINSTANCE windows_gaming_input;
@@ -111,3 +113,9 @@ extern HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *para
     DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, &impl->base_iface )
 #define DEFINE_IINSPECTABLE_OUTER( pfx, iface_type, impl_type, outer_iface )                       \
     DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, impl->outer_iface )
+
+static inline const char *debugstr_vector3( const Vector3 *vector )
+{
+    if (!vector) return "(null)";
+    return wine_dbg_sprintf( "[%f, %f, %f]", vector->X, vector->Y, vector->Z );
+}




More information about the wine-cvs mailing list