From 196d53e65fc9c11925407e365ac541c0cb3cfaca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filipe=20La=C3=ADns?= Date: Wed, 31 Jul 2019 08:28:15 +0100 Subject: [PATCH] hidpp20: add quirk system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Filipe LaĆ­ns --- src/driver-hidpp20.c | 5 +++++ src/hidpp20.c | 18 ++++++++++++++++++ src/hidpp20.h | 12 ++++++++++++ src/libratbag-data.c | 14 ++++++++++++++ src/libratbag-data.h | 3 +++ 5 files changed, 52 insertions(+) diff --git a/src/driver-hidpp20.c b/src/driver-hidpp20.c index 4deb7f38..38b47df2 100644 --- a/src/driver-hidpp20.c +++ b/src/driver-hidpp20.c @@ -1560,10 +1560,15 @@ hidpp20drv_probe(struct ratbag_device *device) goto err; } + dev->quirk = ratbag_device_data_hidpp20_get_quirk(device->data); + drv_data->dev = dev; log_debug(device->ratbag, "'%s' is using protocol v%d.%d\n", ratbag_device_get_name(device), dev->proto_major, dev->proto_minor); + if(dev->quirk != HIDPP20_QUIRK_NONE) + log_debug(device->ratbag, "'%s' is quirked (%s)\n", ratbag_device_get_name(device), hidpp20_get_quirk_string(dev->quirk)); + /* add some defaults that will be overwritten by the device */ drv_data->num_profiles = 1; drv_data->num_resolutions = 1; diff --git a/src/hidpp20.c b/src/hidpp20.c index b115a1c8..058f3c06 100644 --- a/src/hidpp20.c +++ b/src/hidpp20.c @@ -99,6 +99,24 @@ hidpp20_sw_led_control_get_mode_string(const enum hidpp20_led_sw_ctrl_led_mode m str = numeric; break; } + + return str; +} + +const char* +hidpp20_get_quirk_string(unsigned quirk) +{ + static char numeric[8]; + const char* str = NULL; + switch (quirk) + { + CASE_RETURN_STRING(HIDPP20_QUIRK_NONE); + CASE_RETURN_STRING(HIDPP20_QUIRK_G305); + default: + sprintf_safe(numeric, "%#4x", quirk); + str = numeric; + break; + } #undef CASE_RETURN_STRING return str; diff --git a/src/hidpp20.h b/src/hidpp20.h index d625c7c8..743145b3 100644 --- a/src/hidpp20.h +++ b/src/hidpp20.h @@ -58,12 +58,15 @@ struct hidpp20_device { unsigned proto_minor; unsigned feature_count; struct hidpp20_feature *feature_list; + unsigned quirk; }; int hidpp20_request_command(struct hidpp20_device *dev, union hidpp20_message *msg); const char *hidpp20_feature_get_name(uint16_t feature); +const char *hidpp20_get_quirk_string(unsigned quirk); + /* -------------------------------------------------------------------------- */ /* generic hidpp20 device operations */ /* -------------------------------------------------------------------------- */ @@ -74,6 +77,15 @@ hidpp20_device_new(const struct hidpp_device *base, unsigned int idx); void hidpp20_device_destroy(struct hidpp20_device *device); +/* -------------------------------------------------------------------------- */ +/* quirks */ +/* -------------------------------------------------------------------------- */ + +enum { + HIDPP20_QUIRK_NONE, +} +#define HIDPP20_QUIRK_G305 1 + /* -------------------------------------------------------------------------- */ /* 0x0000: Root */ /* -------------------------------------------------------------------------- */ diff --git a/src/libratbag-data.c b/src/libratbag-data.c index 78e31872..7bef8ec5 100644 --- a/src/libratbag-data.c +++ b/src/libratbag-data.c @@ -33,6 +33,7 @@ #include "libratbag.h" #include "libratbag-private.h" #include "libratbag-data.h" +#include "hidpp20.h" #define GROUP_DEVICE "Device" @@ -54,6 +55,7 @@ enum driver { struct data_hidpp20 { int index; + unsigned quirk; }; struct data_hidpp10 { @@ -152,6 +154,7 @@ init_data_hidpp20(struct ratbag *ratbag, const char *group = "Driver/hidpp20"; GError *error = NULL; int num; + char *str; data->hidpp20.index = -1; @@ -160,6 +163,9 @@ init_data_hidpp20(struct ratbag *ratbag, data->hidpp20.index = num; if (error) g_error_free(error); + + str = g_key_file_get_string(keyfile, group, "Quirk", NULL); + data->hidpp20.quirk = HIDPP20_QUIRK_NONE; } static void @@ -562,6 +568,14 @@ ratbag_device_data_hidpp20_get_index(const struct ratbag_device_data *data) return data->hidpp20.index; } +int +ratbag_device_data_hidpp20_get_quirk(const struct ratbag_device_data *data) +{ + assert(data->drivertype == HIDPP20); + + return data->hidpp20.quirk; +} + /* SteelSeries */ int diff --git a/src/libratbag-data.h b/src/libratbag-data.h index 7a258780..cf0b1e12 100644 --- a/src/libratbag-data.h +++ b/src/libratbag-data.h @@ -80,6 +80,9 @@ ratbag_device_data_hidpp10_get_led_count(const struct ratbag_device_data *data); int ratbag_device_data_hidpp20_get_index(const struct ratbag_device_data *data); +int +ratbag_device_data_hidpp20_get_quirk(const struct ratbag_device_data *data); + /* SteelSeries */ /**