From 7b17fbd1ccb3ae8b577f54704d7e52c9595cb95d Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Sat, 15 Aug 2015 12:16:18 -0400 Subject: [PATCH] add implemention of ratbag_set_active_profile It's a 2 callback combo in the driver. Signed-off-by: Benjamin Tissoires --- src/etekcity.c | 25 +++++++++++++++++++++++++ src/libratbag-private.h | 2 ++ src/libratbag.c | 15 +++++++++++++++ src/libratbag.sym | 1 + tools/ratbag-command.c | 6 +++++- 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/etekcity.c b/src/etekcity.c index bbcaacf7..59dc8d65 100644 --- a/src/etekcity.c +++ b/src/etekcity.c @@ -126,6 +126,23 @@ etekcity_current_profile(struct ratbag *ratbag) return buf[2]; } +static int +etekcity_set_current_profile(struct ratbag *ratbag, unsigned int index) +{ + __u8 buf[] = {ETEKCITY_REPORT_ID_PROFILE, 0x03, index}; + int ret; + + if (index > ETEKCITY_PROFILE_MAX) + return -EINVAL; + + ret = ratbag_hidraw_raw_request(ratbag, buf[0], buf, sizeof(buf), + HID_FEATURE_REPORT, HID_REQ_SET_REPORT); + + msleep(100); + + return ret == sizeof(buf) ? 0 : ret; +} + static int etekcity_set_config_profile(struct ratbag *ratbag, __u8 profile, __u8 type) { @@ -182,6 +199,12 @@ etekcity_read_profile(struct ratbag_profile *profile, unsigned int index) } } +static int +etekcity_write_profile(struct ratbag_profile *profile) +{ + return 0; +} + static int etekcity_probe(struct ratbag *ratbag, const struct ratbag_id id) { @@ -238,6 +261,8 @@ struct ratbag_driver etekcity_driver = { .table_ids = etekcity_table, .probe = etekcity_probe, .read_profile = etekcity_read_profile, + .write_profile = etekcity_write_profile, .get_active_profile = etekcity_current_profile, + .set_active_profile = etekcity_set_current_profile, .has_capability = etekcity_has_capability, }; diff --git a/src/libratbag-private.h b/src/libratbag-private.h index f1de5ade..348b33bd 100644 --- a/src/libratbag-private.h +++ b/src/libratbag-private.h @@ -67,7 +67,9 @@ struct ratbag_driver { int (*probe)(struct ratbag *ratbag, const struct ratbag_id id); void (*read_profile)(struct ratbag_profile *profile, unsigned int index); + int (*write_profile)(struct ratbag_profile *profile); int (*get_active_profile)(struct ratbag *ratbag); + int (*set_active_profile)(struct ratbag *ratbag, unsigned int index); int (*has_capability)(const struct ratbag *ratbag, enum ratbag_capability cap); /* private */ diff --git a/src/libratbag.c b/src/libratbag.c index 67dea27a..ec4c1bca 100644 --- a/src/libratbag.c +++ b/src/libratbag.c @@ -481,3 +481,18 @@ ratbag_has_capability(const struct ratbag *ratbag, enum ratbag_capability cap) assert(ratbag->driver->has_capability); return ratbag->driver->has_capability(ratbag, cap); } + +LIBRATBAG_EXPORT int +ratbag_set_active_profile(struct ratbag *ratbag, + struct ratbag_profile *profile) +{ + int rc; + + assert(ratbag->driver->write_profile); + rc = ratbag->driver->write_profile(profile); + if (rc) + return rc; + + assert(ratbag->driver->set_active_profile); + return ratbag->driver->set_active_profile(ratbag, profile->index); +} diff --git a/src/libratbag.sym b/src/libratbag.sym index 19682a9f..f77b7908 100644 --- a/src/libratbag.sym +++ b/src/libratbag.sym @@ -12,6 +12,7 @@ global: ratbag_get_profile_by_index; ratbag_has_capability; ratbag_new_from_fd; + ratbag_set_active_profile; ratbag_profile_ref; ratbag_profile_unref; ratbag_unref; diff --git a/tools/ratbag-command.c b/tools/ratbag-command.c index 17b53953..f9af9542 100644 --- a/tools/ratbag-command.c +++ b/tools/ratbag-command.c @@ -82,10 +82,14 @@ main(int argc, char **argv) fprintf(stderr, "Opened '%s' (%s).\n", ratbag_get_name(rb), path); + profile = ratbag_get_profile_by_index(rb, 0); + ratbag_set_active_profile(rb, profile); + profile = ratbag_profile_unref(profile); + profile = ratbag_get_active_profile(rb); + profile = ratbag_profile_unref(profile); out: - profile = ratbag_profile_unref(profile); rb = ratbag_unref(rb); libratbag_unref(libratbag); close(fd);