From 4251042a0dd146aadbbf7c8a398245362132bb1a Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Thu, 27 Aug 2015 15:15:36 -0400 Subject: [PATCH] etekcity: implement switch-dpi functionality the current driver API is not good enough. We should be able to say which DPI setting we want to change. Thus, the external API is not correct either. Signed-off-by: Benjamin Tissoires --- src/driver-etekcity.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/driver-etekcity.c b/src/driver-etekcity.c index aa1af19b..82632041 100644 --- a/src/driver-etekcity.c +++ b/src/driver-etekcity.c @@ -455,7 +455,37 @@ etekcity_write_button(struct ratbag_button *button, static int etekcity_write_resolution_dpi(struct ratbag_profile *profile, int dpi) { - return -ENOTSUP; + struct ratbag_device *device = profile->device; + struct etekcity_data *drv_data = ratbag_get_drv_data(device); + struct etekcity_settings_report *settings_report; + uint8_t *buf; + int rc; + + if (dpi < 50 || dpi > 8200 || dpi % 50) + return -EINVAL; + + settings_report = &drv_data->settings[profile->index]; + + /* FIXME: we should be able to say which dpi setting we change */ + /* FIXME: allow both x and y dpi to be set */ + settings_report->x_sensitivity = 0x0a; + settings_report->y_sensitivity = 0x0a; + settings_report->xres[settings_report->current_dpi] = dpi / 50; + settings_report->yres[settings_report->current_dpi] = dpi / 50; + + buf = (uint8_t*)settings_report; + etekcity_set_config_profile(device, profile->index, ETEKCITY_CONFIG_SETTINGS); + rc = ratbag_hidraw_raw_request(device, ETEKCITY_REPORT_ID_SETTINGS, + buf, ETEKCITY_REPORT_SIZE_SETTINGS, + HID_FEATURE_REPORT, HID_REQ_SET_REPORT); + + if (rc < 0) + return rc; + + if (rc != ETEKCITY_REPORT_SIZE_SETTINGS) + return -EIO; + + return 0; } static int