Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 63 additions & 25 deletions dlls/dinput/joystick_hid.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@

#define VID_LOGITECH 0x046D
#define PID_LOGITECH_G920 0xC262
#define PID_LOGITECH_G29 0xC24F

WINE_DEFAULT_DEBUG_CHANNEL(dinput);

Expand Down Expand Up @@ -624,33 +625,70 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
case MAKELONG(HID_USAGE_GENERIC_RX, HID_USAGE_PAGE_GENERIC):
case MAKELONG(HID_USAGE_GENERIC_RY, HID_USAGE_PAGE_GENERIC):
case MAKELONG(HID_USAGE_GENERIC_RZ, HID_USAGE_PAGE_GENERIC):
if (!impl->wgi_device && impl->attrs.VendorID == VID_LOGITECH && impl->attrs.ProductID == PID_LOGITECH_G920)
if (!impl->wgi_device && impl->attrs.VendorID == VID_LOGITECH && (impl->attrs.ProductID == PID_LOGITECH_G920 || impl->attrs.ProductID == PID_LOGITECH_G29))
{
if (j == HID_USAGE_GENERIC_X)
switch (impl->attrs.ProductID)
{
set_axis_type( &instance, seen_axis, 0, &axis );
hack_guid = &GUID_XAxis;
hack_name = L"Wheel axis";
case PID_LOGITECH_G920:
if (j == HID_USAGE_GENERIC_X)
{
set_axis_type( &instance, seen_axis, 0, &axis );
hack_guid = &GUID_XAxis;
hack_name = L"Wheel axis";
}
else if (j == HID_USAGE_GENERIC_Y)
{
set_axis_type( &instance, seen_axis, 2, &axis );
hack_guid = &GUID_YAxis;
hack_name = L"Accelerator";
}
else if (j == HID_USAGE_GENERIC_Z)
{
set_axis_type( &instance, seen_axis, 5, &axis );
hack_guid = &GUID_RzAxis;
hack_name = L"Brake";
}
else if (j == HID_USAGE_GENERIC_RZ)
{
instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 6 + axis++ );
hack_guid = &GUID_Slider;
hack_name = L"Clutch";
}
else WARN("unknown axis usage page %x usage %lx for Logitech G920\n", caps->usage_page, j);
break;
case PID_LOGITECH_G29:
if (j == HID_USAGE_GENERIC_X)
{
set_axis_type( &instance, seen_axis, 0, &axis );
hack_guid = &GUID_XAxis;
hack_name = L"Wheel axis";
}
else if (j == HID_USAGE_GENERIC_Y)
{
set_axis_type( &instance, seen_axis, 2, &axis );
hack_guid = &GUID_Slider;
hack_name = L"Clutch";

}
else if (j == HID_USAGE_GENERIC_Z)
{
set_axis_type( &instance, seen_axis, 5, &axis );
hack_guid = &GUID_YAxis;
hack_name = L"Accelerator";
}
else if (j == HID_USAGE_GENERIC_RX)
{
instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 6 + axis++ );
hack_guid = &GUID_RzAxis;
hack_name = L"Brake";
}
else WARN("unknown axis usage page %x usage %lx for Logitech G29\n", caps->usage_page, j);
break;
default:
set_axis_type( &instance, seen_axis, j - HID_USAGE_GENERIC_X, &axis );
break;
}
else if (j == HID_USAGE_GENERIC_Y)
{
set_axis_type( &instance, seen_axis, 2, &axis );
hack_guid = &GUID_YAxis;
hack_name = L"Accelerator";
}
else if (j == HID_USAGE_GENERIC_Z)
{
set_axis_type( &instance, seen_axis, 5, &axis );
hack_guid = &GUID_RzAxis;
hack_name = L"Brake";
}
else if (j == HID_USAGE_GENERIC_RZ)
{
instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 6 + axis++ );
hack_guid = &GUID_Slider;
hack_name = L"Clutch";
}
else WARN("unknown axis usage page %x usage %lx for Logitech G920\n", caps->usage_page, j);

}
else
{
Expand Down Expand Up @@ -1676,7 +1714,7 @@ static HRESULT hid_joystick_device_try_open( const WCHAR *path, HANDLE *device,
break;
}

if (attrs->VendorID == VID_LOGITECH && attrs->ProductID == PID_LOGITECH_G920)
if (attrs->VendorID == VID_LOGITECH && (attrs->ProductID == PID_LOGITECH_G920 || attrs->ProductID == PID_LOGITECH_G29))
type = DI8DEVTYPE_DRIVING | (DI8DEVTYPEDRIVING_DUALPEDALS << 8);

instance->dwDevType = device_type_for_version( type, version ) | DIDEVTYPE_HID;
Expand Down