From 868d71a08b81f9470db55de88d38633b33a523f6 Mon Sep 17 00:00:00 2001 From: Thomas Hindoe Paaboel Andersen Date: Mon, 20 Nov 2017 23:13:34 +0100 Subject: [PATCH] data: add section for SteelSeries mice Add a section in the .device files for SteelSeries mice. The mice cannot be queried and we need to store data for each device of number of buttons, leds, and dpi list/range. Lastly a "device version" is added. The latest models use a slightly different protocol, so we needed something to distinguish them with. --- src/libratbag-data.c | 100 ++++++++++++++++++++++++++++++++++++++++++- src/libratbag-data.h | 27 ++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) diff --git a/src/libratbag-data.c b/src/libratbag-data.c index b1a96c3f..5ba72e7c 100644 --- a/src/libratbag-data.c +++ b/src/libratbag-data.c @@ -64,6 +64,14 @@ struct data_hidpp10 { int led_count; }; +struct data_steelseries { + int device_version; + int button_count; + int led_count; + struct dpi_list *dpi_list; + struct dpi_range *dpi_range; +}; + struct ratbag_device_data { int refcount; char *name; @@ -75,6 +83,7 @@ struct ratbag_device_data { union { struct data_hidpp20 hidpp20; struct data_hidpp10 hidpp10; + struct data_steelseries steelseries; }; enum ratbag_led_type led_types[20]; @@ -149,6 +158,52 @@ init_data_hidpp20(struct ratbag *ratbag, g_error_free(error); } +static void +init_data_steelseries(struct ratbag *ratbag, + GKeyFile *keyfile, + struct ratbag_device_data *data) +{ + const char *group = "Driver/steelseries"; + GError *error = NULL; + _cleanup_(freep) char *str = NULL; + int num; + + data->steelseries.device_version = -1; + data->steelseries.button_count = -1; + data->steelseries.led_count = -1; + data->steelseries.dpi_list = NULL; + data->steelseries.dpi_range = NULL; + + num = g_key_file_get_integer(keyfile, group, "Buttons", &error); + if (num != 0 || !error) + data->steelseries.button_count = num; + if (error) + g_error_free(error); + + error = NULL; + num = g_key_file_get_integer(keyfile, group, "Leds", &error); + if (num > 0 || !error) + data->steelseries.led_count = num; + if (error) + g_error_free(error); + + error = NULL; + num = g_key_file_get_integer(keyfile, group, "DeviceVersion", &error); + if (num > 0 || !error) + data->steelseries.device_version = num; + if (error) + g_error_free(error); + + str = g_key_file_get_string(keyfile, group, "DpiRange", NULL); + if (str) { + data->steelseries.dpi_range = dpi_range_from_string(str); + } else { + str = g_key_file_get_string(keyfile, group, "DpiList", NULL); + if (str) + data->steelseries.dpi_list = dpi_list_from_string(str); + } +} + static const struct driver_map { enum driver map; const char *driver; @@ -162,7 +217,7 @@ static const struct driver_map { { ETEKCITY, "etekcity", NULL}, { GSKILL, "gskill", NULL }, { LOGITECH_G300, "logitech_g300", NULL}, - { STEELSERIES, "steelseries", NULL }, + { STEELSERIES, "steelseries", init_data_steelseries }, }; const char * @@ -483,3 +538,46 @@ ratbag_device_data_hidpp20_get_index(const struct ratbag_device_data *data) return data->hidpp20.index; } + +/* SteelSeries */ + +int +ratbag_device_data_steelseries_get_device_version(const struct ratbag_device_data *data) +{ + assert(data->drivertype == STEELSERIES); + + return data->steelseries.device_version; +} + +int +ratbag_device_data_steelseries_get_button_count(const struct ratbag_device_data *data) +{ + assert(data->drivertype == STEELSERIES); + + return data->steelseries.button_count; +} + +int +ratbag_device_data_steelseries_get_led_count(const struct ratbag_device_data *data) +{ + assert(data->drivertype == STEELSERIES); + + return data->steelseries.led_count; +} + +struct dpi_list * +ratbag_device_data_steelseries_get_dpi_list(const struct ratbag_device_data *data) +{ + assert(data->drivertype == STEELSERIES); + + return data->steelseries.dpi_list; +} + +struct dpi_range * +ratbag_device_data_steelseries_get_dpi_range(const struct ratbag_device_data *data) +{ + assert(data->drivertype == STEELSERIES); + + return data->steelseries.dpi_range; +} + diff --git a/src/libratbag-data.h b/src/libratbag-data.h index 8d0c2241..f4105b34 100644 --- a/src/libratbag-data.h +++ b/src/libratbag-data.h @@ -81,3 +81,30 @@ 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); + +/* SteelSeries */ + +/** + * @return The device version or -1 if not set + */ +int +ratbag_device_data_steelseries_get_device_version(const struct ratbag_device_data *data); + +/** + * @return The button count or -1 if not set + */ +int +ratbag_device_data_steelseries_get_button_count(const struct ratbag_device_data *data); + +/** + * @return The led count or -1 if not set + */ +int +ratbag_device_data_steelseries_get_led_count(const struct ratbag_device_data *data); + +struct dpi_list * +ratbag_device_data_steelseries_get_dpi_list(const struct ratbag_device_data *data); + +struct dpi_range * +ratbag_device_data_steelseries_get_dpi_range(const struct ratbag_device_data *data); +