From: Zhiyi Zhang <zzhang(a)codeweavers.com> --- dlls/windows.ui/tests/uisettings.c | 7 +++++ dlls/windows.ui/uisettings.c | 46 ++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/dlls/windows.ui/tests/uisettings.c b/dlls/windows.ui/tests/uisettings.c index 5fc60f7cedc..69b307d8877 100644 --- a/dlls/windows.ui/tests/uisettings.c +++ b/dlls/windows.ui/tests/uisettings.c @@ -22,6 +22,7 @@ #include "windef.h" #include "winbase.h" #include "winstring.h" +#include "weakreference.h" #include "roapi.h" @@ -213,7 +214,13 @@ static void test_UISettings(void) goto skip_uisettings3; } + check_interface( inspectable, &IID_IInspectable, TRUE ); check_interface( inspectable, &IID_IAgileObject, TRUE ); + check_interface( inspectable, &IID_IUISettings, TRUE ); + check_interface( inspectable, &IID_IUISettings2, TRUE ); + check_interface( inspectable, &IID_IUISettings3, TRUE ); + check_interface( inspectable, &IID_IWeakReferenceSource, TRUE ); + check_interface( inspectable, &IID_IWeakReference, FALSE ); test_AccentColor( uisettings3 ); diff --git a/dlls/windows.ui/uisettings.c b/dlls/windows.ui/uisettings.c index 2b889e16cb7..7497f3fe81d 100644 --- a/dlls/windows.ui/uisettings.c +++ b/dlls/windows.ui/uisettings.c @@ -18,6 +18,8 @@ */ #include "private.h" +#include "initguid.h" +#include "weakreference.h" #include "wine/debug.h" @@ -32,6 +34,7 @@ struct uisettings IUISettings3 IUISettings3_iface; IUISettings4 IUISettings4_iface; IUISettings5 IUISettings5_iface; + IWeakReferenceSource IWeakReferenceSource_iface; LONG ref; }; @@ -71,6 +74,10 @@ static HRESULT WINAPI uisettings_QueryInterface( IUISettings *iface, REFIID iid, { *out = &impl->IUISettings5_iface; } + else if (IsEqualGUID( iid, &IID_IWeakReferenceSource )) + { + *out = &impl->IWeakReferenceSource_iface; + } if (!*out) { @@ -469,6 +476,44 @@ static const struct IUISettings5Vtbl uisettings5_vtbl = uisettings5_remove_AutoHideScrollBarsChanged, }; +static inline struct uisettings *impl_from_IWeakReferenceSource( IWeakReferenceSource *iface ) +{ + return CONTAINING_RECORD( iface, struct uisettings, IWeakReferenceSource_iface ); +} + +static HRESULT WINAPI weak_reference_source_QueryInterface( IWeakReferenceSource *iface, REFIID iid, void **out ) +{ + struct uisettings *impl = impl_from_IWeakReferenceSource( iface ); + return uisettings_QueryInterface( &impl->IUISettings_iface, iid, out ); +} + +static ULONG WINAPI weak_reference_source_AddRef( IWeakReferenceSource *iface ) +{ + struct uisettings *impl = impl_from_IWeakReferenceSource( iface ); + return uisettings_AddRef( &impl->IUISettings_iface ); +} + +static ULONG WINAPI weak_reference_source_Release( IWeakReferenceSource *iface ) +{ + struct uisettings *impl = impl_from_IWeakReferenceSource( iface ); + return uisettings_Release( &impl->IUISettings_iface ); +} + +static HRESULT WINAPI weak_reference_source_GetWeakReference( IWeakReferenceSource *iface, IWeakReference **ref ) +{ + FIXME( "iface %p, ref %p stub.\n", iface, ref ); + return E_NOTIMPL; +} + +static const struct IWeakReferenceSourceVtbl weak_reference_source_vtbl = +{ + weak_reference_source_QueryInterface, + weak_reference_source_AddRef, + weak_reference_source_Release, + /* IWeakReferenceSource methods */ + weak_reference_source_GetWeakReference, +}; + struct uisettings_statics { IActivationFactory IActivationFactory_iface; @@ -551,6 +596,7 @@ static HRESULT WINAPI factory_ActivateInstance( IActivationFactory *iface, IInsp impl->IUISettings3_iface.lpVtbl = &uisettings3_vtbl; impl->IUISettings4_iface.lpVtbl = &uisettings4_vtbl; impl->IUISettings5_iface.lpVtbl = &uisettings5_vtbl; + impl->IWeakReferenceSource_iface.lpVtbl = &weak_reference_source_vtbl; impl->ref = 1; *instance = (IInspectable *)&impl->IUISettings3_iface; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8053