Module: wine Branch: master Commit: 7d74938b0c9253fc8bf05f5ef943f99f6bf7e1ae URL: https://gitlab.winehq.org/wine/wine/-/commit/7d74938b0c9253fc8bf05f5ef943f99...
Author: Rémi Bernon rbernon@codeweavers.com Date: Sat Nov 11 15:39:28 2023 +0100
winebus.sys: Ignore events on unsupported axes.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55660
---
dlls/winebus.sys/bus_sdl.c | 69 ++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 33 deletions(-)
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c index cd6166a91a8..9b0e7226fa5 100644 --- a/dlls/winebus.sys/bus_sdl.c +++ b/dlls/winebus.sys/bus_sdl.c @@ -246,49 +246,50 @@ static BOOL descriptor_add_haptic(struct sdl_device *impl) return TRUE; }
+static const USAGE_AND_PAGE absolute_axis_usages[] = +{ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_X}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Y}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Z}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RX}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RY}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RZ}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_SLIDER}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_DIAL}, +}; +static const USAGE_AND_PAGE relative_axis_usages[] = +{ + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_X}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Y}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RX}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RY}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Z}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RZ}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_SLIDER}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_DIAL}, + {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_WHEEL}, +}; + static NTSTATUS build_joystick_report_descriptor(struct unix_device *iface) { const USAGE_AND_PAGE device_usage = {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_JOYSTICK}; - static const USAGE_AND_PAGE absolute_usages[] = - { - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_X}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Y}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Z}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RX}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RY}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RZ}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_SLIDER}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_DIAL}, - }; - static const USAGE_AND_PAGE relative_usages[] = - { - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_X}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Y}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RX}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RY}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_Z}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_RZ}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_SLIDER}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_DIAL}, - {.UsagePage = HID_USAGE_PAGE_GENERIC, .Usage = HID_USAGE_GENERIC_WHEEL}, - }; struct sdl_device *impl = impl_from_unix_device(iface); int i, button_count, axis_count, ball_count, hat_count; USAGE_AND_PAGE physical_usage;
axis_count = pSDL_JoystickNumAxes(impl->sdl_joystick); if (options.split_controllers) axis_count = min(6, axis_count - impl->axis_offset); - if (axis_count > ARRAY_SIZE(absolute_usages)) + if (axis_count > ARRAY_SIZE(absolute_axis_usages)) { - FIXME("More than %zu absolute axes found, ignoring.\n", ARRAY_SIZE(absolute_usages)); - axis_count = ARRAY_SIZE(absolute_usages); + FIXME("More than %zu absolute axes found, ignoring.\n", ARRAY_SIZE(absolute_axis_usages)); + axis_count = ARRAY_SIZE(absolute_axis_usages); }
ball_count = pSDL_JoystickNumBalls(impl->sdl_joystick); - if (ball_count > ARRAY_SIZE(relative_usages) / 2) + if (ball_count > ARRAY_SIZE(relative_axis_usages) / 2) { - FIXME("More than %zu relative axes found, ignoring.\n", ARRAY_SIZE(relative_usages)); - ball_count = ARRAY_SIZE(relative_usages) / 2; + FIXME("More than %zu relative axes found, ignoring.\n", ARRAY_SIZE(relative_axis_usages)); + ball_count = ARRAY_SIZE(relative_axis_usages) / 2; }
if (impl->axis_offset == 0) @@ -337,15 +338,15 @@ static NTSTATUS build_joystick_report_descriptor(struct unix_device *iface)
for (i = 0; i < axis_count; i++) { - if (!hid_device_add_axes(iface, 1, absolute_usages[i].UsagePage, - &absolute_usages[i].Usage, FALSE, -32768, 32767)) + if (!hid_device_add_axes(iface, 1, absolute_axis_usages[i].UsagePage, + &absolute_axis_usages[i].Usage, FALSE, -32768, 32767)) return STATUS_NO_MEMORY; }
for (i = 0; i < ball_count; i++) { - if (!hid_device_add_axes(iface, 2, relative_usages[2 * i].UsagePage, - &relative_usages[2 * i].Usage, TRUE, INT32_MIN, INT32_MAX)) + if (!hid_device_add_axes(iface, 2, relative_axis_usages[2 * i].UsagePage, + &relative_axis_usages[2 * i].Usage, TRUE, INT32_MIN, INT32_MAX)) return STATUS_NO_MEMORY; }
@@ -840,6 +841,7 @@ static BOOL set_report_from_joystick_event(struct sdl_device *impl, SDL_Event *e { SDL_JoyAxisEvent *ie = &event->jaxis;
+ if (ie->axis >= ARRAY_SIZE(absolute_axis_usages)) break; hid_device_set_abs_axis(iface, ie->axis, ie->value); bus_event_queue_input_report(&event_queue, iface, state->report_buf, state->report_len); break; @@ -848,6 +850,7 @@ static BOOL set_report_from_joystick_event(struct sdl_device *impl, SDL_Event *e { SDL_JoyBallEvent *ie = &event->jball;
+ if (ie->ball >= ARRAY_SIZE(relative_axis_usages) / 2) break; hid_device_set_rel_axis(iface, 2 * ie->ball, ie->xrel); hid_device_set_rel_axis(iface, 2 * ie->ball + 1, ie->yrel); bus_event_queue_input_report(&event_queue, iface, state->report_buf, state->report_len);