diff --git a/data/devices/logitech-g502-hero-wireless.device b/data/devices/logitech-g502-hero-wireless.device index 96070bab..dad73da2 100644 --- a/data/devices/logitech-g502-hero-wireless.device +++ b/data/devices/logitech-g502-hero-wireless.device @@ -3,3 +3,6 @@ Name=Logitech G502 Hero Wireless DeviceMatch=usb:046d:407f;usb:046d:c08d Driver=hidpp20 DeviceType=mouse + +[Driver/hidpp20] +Quirk=INDEX_OFFSET diff --git a/data/devices/logitech-g502-hero.device b/data/devices/logitech-g502-hero.device index 874e62c0..7c5508a5 100644 --- a/data/devices/logitech-g502-hero.device +++ b/data/devices/logitech-g502-hero.device @@ -3,3 +3,6 @@ Name=Logitech G502 Hero DeviceMatch=usb:046d:c08b Driver=hidpp20 DeviceType=mouse + +[Driver/hidpp20] +Quirk=INDEX_OFFSET diff --git a/data/devices/logitech-g502-proteus-spectrum.device b/data/devices/logitech-g502-proteus-spectrum.device index 816c6c40..ab4c38f3 100644 --- a/data/devices/logitech-g502-proteus-spectrum.device +++ b/data/devices/logitech-g502-proteus-spectrum.device @@ -3,3 +3,6 @@ Name=Logitech G502 Proteus Spectrum DeviceMatch=usb:046d:c332 Driver=hidpp20 DeviceType=mouse + +[Driver/hidpp20] +Quirk=INDEX_OFFSET diff --git a/data/devices/logitech-g604.device b/data/devices/logitech-g604.device index 9c8dbbfb..73f58145 100644 --- a/data/devices/logitech-g604.device +++ b/data/devices/logitech-g604.device @@ -3,3 +3,6 @@ Name=Logitech G604 DeviceMatch=usb:046d:4085;bluetooth:046d:b024 Driver=hidpp20 DeviceType=mouse + +[Driver/hidpp20] +Quirk=INDEX_OFFSET diff --git a/src/hidpp20.c b/src/hidpp20.c index 4bfe1ff9..a026f77f 100644 --- a/src/hidpp20.c +++ b/src/hidpp20.c @@ -111,6 +111,7 @@ hidpp20_get_quirk_string(enum hidpp20_quirk quirk) CASE_RETURN_STRING(HIDPP20_QUIRK_G305); CASE_RETURN_STRING(HIDPP20_QUIRK_G602); CASE_RETURN_STRING(HIDPP20_QUIRK_G502X_PLUS); + CASE_RETURN_STRING(HIDPP20_QUIRK_INDEX_OFFSET); } abort(); @@ -2277,6 +2278,10 @@ hidpp20_onboard_profiles_allocate(struct hidpp20_device *device, active_profile_index = rc; + /* Apply quirk for devices that return 1-indexed profile */ + if (device->quirk == HIDPP20_QUIRK_INDEX_OFFSET && active_profile_index > 0) + active_profile_index--; + profiles = zalloc(sizeof(struct hidpp20_profiles)); profiles->profiles = zalloc(info.profile_count * sizeof(struct hidpp20_profile)); profiles->sector_size = info.sector_size; diff --git a/src/hidpp20.h b/src/hidpp20.h index 7e14f359..ac8d8097 100644 --- a/src/hidpp20.h +++ b/src/hidpp20.h @@ -56,6 +56,7 @@ enum hidpp20_quirk { HIDPP20_QUIRK_G305, HIDPP20_QUIRK_G602, HIDPP20_QUIRK_G502X_PLUS, // G502X+ uses 2nd LED slot instead of 1st. + HIDPP20_QUIRK_INDEX_OFFSET, // Device returns 1-indexed profile, decrement by 1. }; struct hidpp20_device { diff --git a/src/libratbag-data.c b/src/libratbag-data.c index cd0f53ed..2387155d 100644 --- a/src/libratbag-data.c +++ b/src/libratbag-data.c @@ -227,6 +227,8 @@ init_data_hidpp20(struct ratbag *ratbag, data->hidpp20.quirk = HIDPP20_QUIRK_G602; else if(streq(str, "G502X_PLUS")) data->hidpp20.quirk = HIDPP20_QUIRK_G502X_PLUS; + else if(streq(str, "INDEX_OFFSET")) + data->hidpp20.quirk = HIDPP20_QUIRK_INDEX_OFFSET; } }