Module: wine Branch: master Commit: 45d4c253de159618217a09374bdb016150edd6e8 URL: https://source.winehq.org/git/wine.git/?a=commit;h=45d4c253de159618217a09374...
Author: Rémi Bernon rbernon@codeweavers.com Date: Thu Oct 21 09:53:46 2021 +0200
dinput: Move SendForceFeedbackCommand generic code to device.c.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dinput/device.c | 30 ++++++++++++++++++++++++++---- dlls/dinput/device_private.h | 1 + dlls/dinput/joystick_hid.c | 35 ++++++++++++----------------------- dlls/dinput/keyboard.c | 1 + dlls/dinput/mouse.c | 1 + 5 files changed, 41 insertions(+), 27 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index e0aa5141067..b8da627b1ea 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -1770,11 +1770,33 @@ HRESULT WINAPI IDirectInputDevice2WImpl_GetForceFeedbackState( IDirectInputDevic return DIERR_UNSUPPORTED; }
-HRESULT WINAPI IDirectInputDevice2WImpl_SendForceFeedbackCommand(LPDIRECTINPUTDEVICE8W iface, DWORD dwFlags) +HRESULT WINAPI IDirectInputDevice2WImpl_SendForceFeedbackCommand( IDirectInputDevice8W *iface, DWORD command ) { - IDirectInputDeviceImpl *This = impl_from_IDirectInputDevice8W(iface); - TRACE("(%p)->(0x%08x)\n", This, dwFlags); - return DI_NOEFFECT; + IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8W( iface ); + HRESULT hr; + + TRACE( "iface %p, flags %x.\n", iface, command ); + + switch (command) + { + case DISFFC_RESET: break; + case DISFFC_STOPALL: break; + case DISFFC_PAUSE: break; + case DISFFC_CONTINUE: break; + case DISFFC_SETACTUATORSON: break; + case DISFFC_SETACTUATORSOFF: break; + default: return DIERR_INVALIDPARAM; + } + + if (!(impl->caps.dwFlags & DIDC_FORCEFEEDBACK)) return DIERR_UNSUPPORTED; + if (!impl->vtbl->send_force_feedback_command) return DIERR_UNSUPPORTED; + + EnterCriticalSection( &impl->crit ); + if (!impl->acquired || !(impl->dwCoopLevel & DISCL_EXCLUSIVE)) hr = DIERR_NOTEXCLUSIVEACQUIRED; + else hr = impl->vtbl->send_force_feedback_command( iface, command ); + LeaveCriticalSection( &impl->crit ); + + return hr; }
HRESULT WINAPI IDirectInputDevice2WImpl_EnumCreatedEffectObjects(LPDIRECTINPUTDEVICE8W iface, diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h index 66c51f1672a..b90c6bf2dcd 100644 --- a/dlls/dinput/device_private.h +++ b/dlls/dinput/device_private.h @@ -70,6 +70,7 @@ struct dinput_device_vtbl const DIDEVICEOBJECTINSTANCEW *instance ); HRESULT (*get_effect_info)( IDirectInputDevice8W *iface, DIEFFECTINFOW *info, const GUID *guid ); HRESULT (*create_effect)( IDirectInputDevice8W *iface, IDirectInputEffect **out ); + HRESULT (*send_force_feedback_command)( IDirectInputDevice8W *iface, DWORD command ); };
#define DEVICE_STATE_MAX_SIZE 1024 diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c index c7e9700ed7c..e9bbfa081e8 100644 --- a/dlls/dinput/joystick_hid.c +++ b/dlls/dinput/joystick_hid.c @@ -946,7 +946,7 @@ static BOOL CALLBACK unload_effect_object( IDirectInputEffect *effect, void *con return DIENUM_CONTINUE; }
-static HRESULT WINAPI hid_joystick_SendForceFeedbackCommand( IDirectInputDevice8W *iface, DWORD command ) +static HRESULT hid_joystick_internal_send_force_feedback_command( IDirectInputDevice8W *iface, DWORD command ) { struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface ); struct pid_control_report *report = &impl->pid_device_control; @@ -955,7 +955,6 @@ static HRESULT WINAPI hid_joystick_SendForceFeedbackCommand( IDirectInputDevice8 NTSTATUS status; USAGE usage; ULONG count; - HRESULT hr;
TRACE( "iface %p, flags %x.\n", iface, command );
@@ -967,31 +966,20 @@ static HRESULT WINAPI hid_joystick_SendForceFeedbackCommand( IDirectInputDevice8 case DISFFC_CONTINUE: usage = PID_USAGE_DC_DEVICE_CONTINUE; break; case DISFFC_SETACTUATORSON: usage = PID_USAGE_DC_ENABLE_ACTUATORS; break; case DISFFC_SETACTUATORSOFF: usage = PID_USAGE_DC_DISABLE_ACTUATORS; break; - default: return DIERR_INVALIDPARAM; }
- if (!(impl->base.caps.dwFlags & DIDC_FORCEFEEDBACK)) return DIERR_UNSUPPORTED; + if (command == DISFFC_RESET) IDirectInputDevice8_EnumCreatedEffectObjects( iface, unload_effect_object, NULL, 0 );
- EnterCriticalSection( &impl->base.crit ); - if (!impl->base.acquired || !(impl->base.dwCoopLevel & DISCL_EXCLUSIVE)) - hr = DIERR_NOTEXCLUSIVEACQUIRED; - else - { - if (command == DISFFC_RESET) IDirectInputDevice8_EnumCreatedEffectObjects( iface, unload_effect_object, NULL, 0 ); - - count = 1; - status = HidP_InitializeReportForID( HidP_Output, report->id, impl->preparsed, report_buf, report_len ); - if (status != HIDP_STATUS_SUCCESS) hr = status; - else status = HidP_SetUsages( HidP_Output, HID_USAGE_PAGE_PID, report->control_coll, &usage, - &count, impl->preparsed, report_buf, report_len ); + count = 1; + status = HidP_InitializeReportForID( HidP_Output, report->id, impl->preparsed, report_buf, report_len ); + if (status != HIDP_STATUS_SUCCESS) return status;
- if (status != HIDP_STATUS_SUCCESS) hr = status; - else if (WriteFile( impl->device, report_buf, report_len, NULL, NULL )) hr = DI_OK; - else hr = DIERR_GENERIC; - } - LeaveCriticalSection( &impl->base.crit ); + status = HidP_SetUsages( HidP_Output, HID_USAGE_PAGE_PID, report->control_coll, &usage, + &count, impl->preparsed, report_buf, report_len ); + if (status != HIDP_STATUS_SUCCESS) return status;
- return hr; + if (!WriteFile( impl->device, report_buf, report_len, NULL, NULL )) return DIERR_INPUTLOST; + return DI_OK; }
static HRESULT WINAPI hid_joystick_EnumCreatedEffectObjects( IDirectInputDevice8W *iface, @@ -1039,7 +1027,7 @@ static const IDirectInputDevice8WVtbl hid_joystick_vtbl = IDirectInputDevice2WImpl_EnumEffects, IDirectInputDevice2WImpl_GetEffectInfo, IDirectInputDevice2WImpl_GetForceFeedbackState, - hid_joystick_SendForceFeedbackCommand, + IDirectInputDevice2WImpl_SendForceFeedbackCommand, hid_joystick_EnumCreatedEffectObjects, IDirectInputDevice2WImpl_Escape, IDirectInputDevice2WImpl_Poll, @@ -1280,6 +1268,7 @@ static const struct dinput_device_vtbl hid_joystick_internal_vtbl = hid_joystick_internal_set_property, hid_joystick_internal_get_effect_info, hid_joystick_internal_create_effect, + hid_joystick_internal_send_force_feedback_command, };
static DWORD device_type_for_version( DWORD type, DWORD version ) diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index 8e1b752f016..a04b59e9c0c 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -340,6 +340,7 @@ static const struct dinput_device_vtbl keyboard_internal_vtbl = keyboard_internal_set_property, NULL, NULL, + NULL, };
static const IDirectInputDevice8WVtbl SysKeyboardWvt = diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c index ec3282b267f..faf093489cf 100644 --- a/dlls/dinput/mouse.c +++ b/dlls/dinput/mouse.c @@ -653,6 +653,7 @@ static const struct dinput_device_vtbl mouse_internal_vtbl = mouse_internal_set_property, NULL, NULL, + NULL, };
static const IDirectInputDevice8WVtbl SysMouseWvt =