winebus.sys: Use SDL_JoystickGetType to set physical HID usage.
And pass through driving wheel and flight stick information to DInput. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
f8f843a85a
commit
6efb40718b
|
@ -117,6 +117,7 @@ static int (*pSDL_JoystickRumble)(SDL_Joystick *joystick, Uint16 low_frequency_r
|
|||
static Uint16 (*pSDL_JoystickGetProduct)(SDL_Joystick * joystick);
|
||||
static Uint16 (*pSDL_JoystickGetProductVersion)(SDL_Joystick * joystick);
|
||||
static Uint16 (*pSDL_JoystickGetVendor)(SDL_Joystick * joystick);
|
||||
static SDL_JoystickType (*pSDL_JoystickGetType)(SDL_Joystick * joystick);
|
||||
|
||||
/* internal bits for extended rumble support, SDL_Haptic types are 16-bits */
|
||||
#define WINE_SDL_JOYSTICK_RUMBLE 0x40000000 /* using SDL_JoystickRumble API */
|
||||
|
@ -258,6 +259,7 @@ static NTSTATUS build_joystick_report_descriptor(struct unix_device *iface)
|
|||
};
|
||||
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 (axis_count > ARRAY_SIZE(absolute_usages))
|
||||
|
@ -276,10 +278,37 @@ static NTSTATUS build_joystick_report_descriptor(struct unix_device *iface)
|
|||
hat_count = pSDL_JoystickNumHats(impl->sdl_joystick);
|
||||
button_count = pSDL_JoystickNumButtons(impl->sdl_joystick);
|
||||
|
||||
if (!pSDL_JoystickGetType) physical_usage = device_usage;
|
||||
else switch (pSDL_JoystickGetType(impl->sdl_joystick))
|
||||
{
|
||||
case SDL_JOYSTICK_TYPE_ARCADE_PAD:
|
||||
case SDL_JOYSTICK_TYPE_ARCADE_STICK:
|
||||
case SDL_JOYSTICK_TYPE_DANCE_PAD:
|
||||
case SDL_JOYSTICK_TYPE_DRUM_KIT:
|
||||
case SDL_JOYSTICK_TYPE_GUITAR:
|
||||
case SDL_JOYSTICK_TYPE_UNKNOWN:
|
||||
physical_usage.UsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
physical_usage.Usage = HID_USAGE_GENERIC_JOYSTICK;
|
||||
break;
|
||||
case SDL_JOYSTICK_TYPE_GAMECONTROLLER:
|
||||
physical_usage.UsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
physical_usage.Usage = HID_USAGE_GENERIC_GAMEPAD;
|
||||
break;
|
||||
case SDL_JOYSTICK_TYPE_WHEEL:
|
||||
physical_usage.UsagePage = HID_USAGE_PAGE_SIMULATION;
|
||||
physical_usage.Usage = HID_USAGE_SIMULATION_AUTOMOBILE_SIMULATION_DEVICE;
|
||||
break;
|
||||
case SDL_JOYSTICK_TYPE_FLIGHT_STICK:
|
||||
case SDL_JOYSTICK_TYPE_THROTTLE:
|
||||
physical_usage.UsagePage = HID_USAGE_PAGE_SIMULATION;
|
||||
physical_usage.Usage = HID_USAGE_SIMULATION_FLIGHT_SIMULATION_DEVICE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!hid_device_begin_report_descriptor(iface, &device_usage))
|
||||
return STATUS_NO_MEMORY;
|
||||
|
||||
if (!hid_device_begin_input_report(iface, &device_usage))
|
||||
if (!hid_device_begin_input_report(iface, &physical_usage))
|
||||
return STATUS_NO_MEMORY;
|
||||
|
||||
for (i = 0; i < axis_count; i++)
|
||||
|
@ -1026,6 +1055,7 @@ NTSTATUS sdl_bus_init(void *args)
|
|||
pSDL_JoystickGetProduct = dlsym(sdl_handle, "SDL_JoystickGetProduct");
|
||||
pSDL_JoystickGetProductVersion = dlsym(sdl_handle, "SDL_JoystickGetProductVersion");
|
||||
pSDL_JoystickGetVendor = dlsym(sdl_handle, "SDL_JoystickGetVendor");
|
||||
pSDL_JoystickGetType = dlsym(sdl_handle, "SDL_JoystickGetType");
|
||||
|
||||
if (pSDL_Init(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC) < 0)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue