From 3f83d5057d634a258bdd35507b7d0a3d7a1f3b56 Mon Sep 17 00:00:00 2001 From: Ilya Guterman Date: Wed, 1 Feb 2017 01:14:31 +0200 Subject: [PATCH] libratbag api support LEDs --- src/driver-etekcity.c | 4 +++- src/driver-gskill.c | 3 ++- src/driver-hidpp10.c | 5 +++-- src/driver-hidpp20.c | 7 ++++++- src/driver-logitech-g300.c | 4 +++- src/driver-roccat.c | 4 +++- src/driver-test.c | 3 ++- src/hidpp10.h | 1 + src/libratbag-private.h | 4 +++- src/libratbag-test.h | 2 ++ src/libratbag.c | 26 +++++++++++++++++++++++--- src/libratbag.h | 16 ++++++++++++++++ src/libratbag.sym | 1 + test/test-device.c | 5 ++++- 14 files changed, 72 insertions(+), 13 deletions(-) diff --git a/src/driver-etekcity.c b/src/driver-etekcity.c index e5d335bd..474388fe 100644 --- a/src/driver-etekcity.c +++ b/src/driver-etekcity.c @@ -36,6 +36,7 @@ #define ETEKCITY_PROFILE_MAX 4 #define ETEKCITY_BUTTON_MAX 10 #define ETEKCITY_NUM_DPI 6 +#define ETEKCITY_LED 0 #define ETEKCITY_REPORT_ID_CONFIGURE_PROFILE 4 #define ETEKCITY_REPORT_ID_PROFILE 5 @@ -657,7 +658,8 @@ etekcity_probe(struct ratbag_device *device) ratbag_device_init_profiles(device, ETEKCITY_PROFILE_MAX + 1, ETEKCITY_NUM_DPI, - ETEKCITY_BUTTON_MAX + 1); + ETEKCITY_BUTTON_MAX + 1, + ETEKCITY_LED); ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS); diff --git a/src/driver-gskill.c b/src/driver-gskill.c index d45c53b7..62d0d08a 100644 --- a/src/driver-gskill.c +++ b/src/driver-gskill.c @@ -31,6 +31,7 @@ #define GSKILL_PROFILE_MAX 5 #define GSKILL_NUM_DPI 5 #define GSKILL_BUTTON_MAX 10 +#define GSKILL_NUM_LED 0 #define GSKILL_MAX_POLLING_RATE 1000 @@ -994,7 +995,7 @@ gskill_probe(struct ratbag_device *device) drv_data->profile_count = ret; ratbag_device_init_profiles(device, GSKILL_PROFILE_MAX, GSKILL_NUM_DPI, - GSKILL_BUTTON_MAX); + GSKILL_BUTTON_MAX, GSKILL_NUM_LED); ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_QUERY_CONFIGURATION); ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY); diff --git a/src/driver-hidpp10.c b/src/driver-hidpp10.c index 73202eef..e30784d7 100644 --- a/src/driver-hidpp10.c +++ b/src/driver-hidpp10.c @@ -465,7 +465,8 @@ hidpp10drv_fill_from_profile(struct ratbag_device *device, struct hidpp10_device ratbag_device_init_profiles(device, count, profile.num_dpi_modes, - profile.num_buttons); + profile.num_buttons, + profile.num_leds); if (dev->profile_type != HIDPP10_PROFILE_UNKNOWN) { ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_PROFILE); @@ -584,7 +585,7 @@ hidpp10drv_probe(struct ratbag_device *device) /* Fall back to something that every mouse has */ struct ratbag_profile *profile; - ratbag_device_init_profiles(device, 1, 1, 3); + ratbag_device_init_profiles(device, 1, 1, 3, 0); profile = ratbag_device_get_profile(device, 0); profile->is_active = true; ratbag_profile_unref(profile); diff --git a/src/driver-hidpp20.c b/src/driver-hidpp20.c index 526c0be1..07036e13 100644 --- a/src/driver-hidpp20.c +++ b/src/driver-hidpp20.c @@ -65,6 +65,7 @@ struct hidpp20drv_data { unsigned int num_profiles; unsigned int num_resolutions; unsigned int num_buttons; + unsigned int num_leds; }; static void @@ -718,6 +719,7 @@ hidpp20drv_init_feature(struct ratbag_device *device, uint16_t feature) } case HIDPP_PAGE_COLOR_LED_EFFECTS: { log_debug(ratbag, "device has color effects\n"); + device->num_leds = drv_data->num_leds; break; } case HIDPP_PAGE_ONBOARD_PROFILES: { @@ -731,6 +733,7 @@ hidpp20drv_init_feature(struct ratbag_device *device, uint16_t feature) drv_data->num_profiles = drv_data->profiles->num_profiles; drv_data->num_resolutions = drv_data->profiles->num_modes; drv_data->num_buttons = drv_data->profiles->num_buttons; + drv_data->num_leds = drv_data->profiles->num_leds; break; } @@ -859,6 +862,7 @@ hidpp20drv_probe(struct ratbag_device *device) drv_data->num_profiles = 1; drv_data->num_resolutions = 1; drv_data->num_buttons = 8; + drv_data->num_leds = 2; rc = hidpp20drv_20_probe(device); if (rc) @@ -867,7 +871,8 @@ hidpp20drv_probe(struct ratbag_device *device) ratbag_device_init_profiles(device, drv_data->num_profiles, drv_data->num_resolutions, - drv_data->num_buttons); + drv_data->num_buttons, + drv_data->num_leds); return rc; err: diff --git a/src/driver-logitech-g300.c b/src/driver-logitech-g300.c index 6f921dbf..e3f5cfa9 100644 --- a/src/driver-logitech-g300.c +++ b/src/driver-logitech-g300.c @@ -36,6 +36,7 @@ #define LOGITECH_G300_PROFILE_MAX 2 #define LOGITECH_G300_BUTTON_MAX 8 #define LOGITECH_G300_NUM_DPI 4 +#define LOGITECH_G300_NUM_LED 0 #define LOGITECH_G300_REPORT_ID_SET_ACTIVE_PROFILE 0xF0 #define LOGITECH_G300_REPORT_ID_GET_ACTIVE_PROFILE 0xF1 @@ -361,7 +362,8 @@ logitech_g300_probe(struct ratbag_device *device) ratbag_device_init_profiles(device, LOGITECH_G300_PROFILE_MAX + 1, LOGITECH_G300_NUM_DPI, - LOGITECH_G300_BUTTON_MAX + 1); + LOGITECH_G300_BUTTON_MAX + 1, + LOGITECH_G300_NUM_LED); ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION); ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_PROFILE); diff --git a/src/driver-roccat.c b/src/driver-roccat.c index 4a9b6ca2..49aac15c 100644 --- a/src/driver-roccat.c +++ b/src/driver-roccat.c @@ -36,6 +36,7 @@ #define ROCCAT_PROFILE_MAX 4 #define ROCCAT_BUTTON_MAX 23 #define ROCCAT_NUM_DPI 5 +#define ROCCAT_LED_MAX 0 #define ROCCAT_MAX_RETRY_READY 10 @@ -795,7 +796,8 @@ roccat_probe(struct ratbag_device *device) ratbag_device_init_profiles(device, ROCCAT_PROFILE_MAX + 1, ROCCAT_NUM_DPI, - ROCCAT_BUTTON_MAX + 1); + ROCCAT_BUTTON_MAX + 1, + ROCCAT_LED_MAX); ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS); diff --git a/src/driver-test.c b/src/driver-test.c index b3447c04..4c6af5c2 100644 --- a/src/driver-test.c +++ b/src/driver-test.c @@ -146,7 +146,8 @@ test_probe(struct ratbag_device *device, void *data) ratbag_device_init_profiles(device, test_device->num_profiles, test_device->num_resolutions, - test_device->num_buttons); + test_device->num_buttons, + test_device->num_leds); if (test_device->num_profiles > 1) ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS); diff --git a/src/hidpp10.h b/src/hidpp10.h index a9801849..9eceaf89 100644 --- a/src/hidpp10.h +++ b/src/hidpp10.h @@ -494,6 +494,7 @@ struct hidpp10_profile { } buttons[PROFILE_NUM_BUTTONS]; union hidpp10_macro_data *macros[PROFILE_NUM_BUTTONS]; size_t num_buttons; + size_t num_leds; unsigned int initialized; }; diff --git a/src/libratbag-private.h b/src/libratbag-private.h index 1d1a60f0..ab0d8624 100644 --- a/src/libratbag-private.h +++ b/src/libratbag-private.h @@ -95,6 +95,7 @@ struct ratbag_device { struct list profiles; unsigned num_buttons; + unsigned num_leds; void *drv_data; @@ -334,7 +335,8 @@ int ratbag_device_init_profiles(struct ratbag_device *device, unsigned int num_profiles, unsigned int num_resolutions, - unsigned int num_buttons); + unsigned int num_buttons, + unsigned int num_leds); void ratbag_device_set_capability(struct ratbag_device *device, diff --git a/src/libratbag-test.h b/src/libratbag-test.h index c7d7786d..67ca3d1a 100644 --- a/src/libratbag-test.h +++ b/src/libratbag-test.h @@ -30,6 +30,7 @@ #define RATBAG_TEST_MAX_PROFILES 12 #define RATBAG_TEST_MAX_BUTTONS 25 #define RATBAG_TEST_MAX_RESOLUTIONS 8 +#define RATBAG_TEST_MAX_LEDS 8 struct ratbag_test_button { enum ratbag_button_action_type type; @@ -59,6 +60,7 @@ struct ratbag_test_device { unsigned int num_profiles; unsigned int num_resolutions; unsigned int num_buttons; + unsigned int num_leds; struct ratbag_test_profile profiles[RATBAG_TEST_MAX_PROFILES]; void (*destroyed)(struct ratbag_device *device, void *data); void *destroyed_data; diff --git a/src/libratbag.c b/src/libratbag.c index dcf280e3..b22310a2 100644 --- a/src/libratbag.c +++ b/src/libratbag.c @@ -595,11 +595,20 @@ ratbag_profile_init_buttons(struct ratbag_profile *profile, unsigned int count) return 0; } +static int +ratbag_profile_init_leds(struct ratbag_profile *profile, unsigned int count) +{ + profile->device->num_leds = count; + + return 0; +} + static struct ratbag_profile * ratbag_create_profile(struct ratbag_device *device, unsigned int index, unsigned int num_resolutions, - unsigned int num_buttons) + unsigned int num_buttons, + unsigned int num_leds) { struct ratbag_profile *profile; unsigned i; @@ -623,6 +632,7 @@ ratbag_create_profile(struct ratbag_device *device, device->driver->read_profile(profile, index); ratbag_profile_init_buttons(profile, num_buttons); + ratbag_profile_init_leds(profile, num_leds); return profile; } @@ -631,12 +641,13 @@ int ratbag_device_init_profiles(struct ratbag_device *device, unsigned int num_profiles, unsigned int num_resolutions, - unsigned int num_buttons) + unsigned int num_buttons, + unsigned int num_leds) { unsigned int i; for (i = 0; i < num_profiles; i++) { - ratbag_create_profile(device, i, num_resolutions, num_buttons); + ratbag_create_profile(device, i, num_resolutions, num_buttons, num_leds); } device->num_profiles = num_profiles; @@ -652,6 +663,9 @@ ratbag_device_init_profiles(struct ratbag_device *device, if (num_resolutions > 1) ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION); + if (num_leds > 1) + ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_LED); + return 0; } @@ -753,6 +767,12 @@ ratbag_device_get_num_buttons(struct ratbag_device *device) return device->num_buttons; } +LIBRATBAG_EXPORT unsigned int +ratbag_device_get_num_leds(struct ratbag_device *device) +{ + return device->num_leds; +} + void ratbag_device_set_capability(struct ratbag_device *device, enum ratbag_device_capability cap) diff --git a/src/libratbag.h b/src/libratbag.h index c1939d34..ba34e72a 100644 --- a/src/libratbag.h +++ b/src/libratbag.h @@ -491,6 +491,11 @@ enum ratbag_device_capability { */ RATBAG_DEVICE_CAP_BUTTON_KEY, + /** + * The device supports assigning LED colors and effects + */ + RATBAG_DEVICE_CAP_LED, + /** * The device supports user-defined key or button sequences. */ @@ -588,6 +593,17 @@ ratbag_device_get_num_profiles(struct ratbag_device *device); unsigned int ratbag_device_get_num_buttons(struct ratbag_device *device); +/** + * @ingroup device + * + * Return the number of LEDs available on this device. + * + * @param device A previously initialized ratbag device + * @return The number of LEDs available on this device. + */ +unsigned int +ratbag_device_get_num_leds(struct ratbag_device *device); + /** * @ingroup profile * diff --git a/src/libratbag.sym b/src/libratbag.sym index 64307ef6..3d8f38ee 100644 --- a/src/libratbag.sym +++ b/src/libratbag.sym @@ -45,6 +45,7 @@ global: ratbag_log_get_priority; ratbag_log_set_handler; ratbag_log_set_priority; + ratbag_device_get_num_leds; ratbag_profile_get_button; ratbag_profile_get_num_resolutions; ratbag_profile_get_resolution; diff --git a/test/test-device.c b/test/test-device.c index 27dc6a65..4c425f20 100644 --- a/test/test-device.c +++ b/test/test-device.c @@ -53,6 +53,7 @@ const struct ratbag_test_device sane_device = { .num_profiles = 3, .num_resolutions = 3, .num_buttons = 1, + .num_leds = 2, .profiles = { { .resolutions = { @@ -110,7 +111,7 @@ START_TEST(device_init) { struct ratbag *r; struct ratbag_device *d; - int nprofiles, nbuttons; + int nprofiles, nbuttons, nleds; struct ratbag_test_device td = sane_device; int device_freed_count = 0; @@ -124,6 +125,8 @@ START_TEST(device_init) ck_assert_int_eq(nprofiles, 3); nbuttons = ratbag_device_get_num_buttons(d); ck_assert_int_eq(nbuttons, 1); + nleds = ratbag_device_get_num_leds(d); + ck_assert_int_eq(nleds, 2); ratbag_device_unref(d); ratbag_unref(r);