Rémi Bernon : dinput: Implement SetProperty DIPROP_APPDATA using enum_objects.
Alexandre Julliard
julliard at winehq.org
Thu Oct 28 16:07:44 CDT 2021
Module: wine
Branch: master
Commit: 998b9d86661450e2fe4db03b68e930297e18964c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=998b9d86661450e2fe4db03b68e930297e18964c
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Thu Oct 28 10:12:33 2021 +0200
dinput: Implement SetProperty DIPROP_APPDATA using enum_objects.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dinput/device.c | 36 +++++++++---------------------------
dlls/dinput8/tests/hid.c | 1 -
2 files changed, 9 insertions(+), 28 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 52a6e14ab8d..5e3e54e5754 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -580,22 +580,6 @@ failed:
return DIERR_OUTOFMEMORY;
}
-static int verify_offset(const DataFormat *df, int offset)
-{
- int i;
-
- if (!df->offsets)
- return -1;
-
- for (i = df->wine_df->dwNumObjs - 1; i >= 0; i--)
- {
- if (df->offsets[i] == offset)
- return offset;
- }
-
- return -1;
-}
-
static int id_to_object( LPCDIDATAFORMAT df, int id )
{
int i;
@@ -1320,6 +1304,8 @@ static HRESULT WINAPI dinput_device_SetProperty( IDirectInputDevice8W *iface, co
{
struct set_object_property_params params = {.iface = iface, .header = header, .property = LOWORD( guid )};
struct dinput_device *impl = impl_from_IDirectInputDevice8W( iface );
+ DWORD object_mask = DIDFT_AXIS | DIDFT_BUTTON | DIDFT_POV;
+ DIDEVICEOBJECTINSTANCEW instance;
DIPROPHEADER filter;
HRESULT hr;
@@ -1421,18 +1407,14 @@ static HRESULT WINAPI dinput_device_SetProperty( IDirectInputDevice8W *iface, co
case (DWORD_PTR)DIPROP_APPDATA:
{
const DIPROPPOINTER *value = (const DIPROPPOINTER *)header;
- int offset = -1;
+ int user_offset;
if (header->dwSize != sizeof(DIPROPPOINTER)) return DIERR_INVALIDPARAM;
-
- if (header->dwHow == DIPH_BYID)
- offset = id_to_offset( &impl->data_format, header->dwObj );
- else if (header->dwHow == DIPH_BYOFFSET)
- offset = verify_offset( &impl->data_format, header->dwObj );
- else
- return DIERR_UNSUPPORTED;
-
- if (offset == -1) return DIERR_OBJECTNOTFOUND;
- if (!set_app_data( impl, offset, value->uData )) return DIERR_OUTOFMEMORY;
+ if (header->dwHow == DIPH_DEVICE) return DIERR_UNSUPPORTED;
+ hr = impl->vtbl->enum_objects( iface, &filter, object_mask, find_object, &instance );
+ if (FAILED(hr)) return hr;
+ if (hr == DIENUM_CONTINUE) return DIERR_OBJECTNOTFOUND;
+ if ((user_offset = id_to_offset( &impl->data_format, instance.dwType )) < 0) return DIERR_OBJECTNOTFOUND;
+ if (!set_app_data( impl, user_offset, value->uData )) return DIERR_OUTOFMEMORY;
return DI_OK;
}
default:
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index 526e191ea41..2f2efbe09e3 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -4794,7 +4794,6 @@ static void test_simple_joystick(void)
prop_pointer.diph.dwObj = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
prop_pointer.uData = 0xfeedcafe;
hr = IDirectInputDevice8_SetProperty( device, DIPROP_APPDATA, &prop_pointer.diph );
- todo_wine
ok( hr == DI_OK, "SetProperty DIPROP_APPDATA returned %#x\n", hr );
prop_dword.dwData = 0xdeadbeef;
More information about the wine-cvs
mailing list