From 2f69a70accb8c133281989ed8a5a2394c0d43469 Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Thu, 27 Aug 2015 14:30:50 -0400 Subject: [PATCH] hidpp20: restore the dpi functionality We need to store the profile in each ratbag_resolution or we will not be able to get back to the driver. Signed-off-by: Benjamin Tissoires --- src/driver-hidpp20.c | 52 +++++++++++++++++++++++------------------ src/libratbag-private.h | 1 + src/libratbag.c | 10 ++++++-- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/driver-hidpp20.c b/src/driver-hidpp20.c index e5903ab8..2ae0c4b1 100644 --- a/src/driver-hidpp20.c +++ b/src/driver-hidpp20.c @@ -159,29 +159,31 @@ hidpp20drv_set_current_profile(struct ratbag_device *device, unsigned int index) } static int -hidpp20drv_read_resolution_dpi(struct ratbag_device *device) +hidpp20drv_read_resolution_dpi(struct ratbag_profile *profile) { + struct ratbag_device *device = profile->device; struct ratbag *ratbag = device->ratbag; struct hidpp20drv_data *drv_data = ratbag_get_drv_data(device); - int rc, dpi; + int rc; + unsigned int i; if (drv_data->capabilities & HIDPP_CAP_RESOLUTION_2200) { uint16_t resolution; uint8_t flags; + profile->resolution.num_modes = 1; rc = hidpp20_mousepointer_get_mousepointer_info(device, &resolution, &flags); if (rc) { log_error(ratbag, "Error while requesting resolution: %s (%d)\n", strerror(-rc), rc); - return 0; + return rc; } - return resolution; + return 0; } if (drv_data->capabilities & HIDPP_CAP_SWITCHABLE_RESOLUTION_2201) { - dpi = 0; free(drv_data->sensors); drv_data->sensors = NULL; drv_data->num_sensors = 0; @@ -190,18 +192,30 @@ hidpp20drv_read_resolution_dpi(struct ratbag_device *device) log_error(ratbag, "Error while requesting resolution: %s (%d)\n", strerror(-rc), rc); + return rc; } else if (rc == 0) { log_error(ratbag, "Error, no compatible sensors found.\n"); - } else { - log_info(ratbag, - "device is at %d dpi (variable between %d and %d).\n", - drv_data->sensors[0].dpi, - drv_data->sensors[0].dpi_min, - drv_data->sensors[0].dpi_max); - dpi = drv_data->sensors[0].dpi; - drv_data->num_sensors = rc; + return -ENODEV; } - return dpi; + log_info(ratbag, + "device is at %d dpi (variable between %d and %d).\n", + drv_data->sensors[0].dpi, + drv_data->sensors[0].dpi_min, + drv_data->sensors[0].dpi_max); + drv_data->num_sensors = rc; + if (drv_data->num_sensors > MAX_RESOLUTIONS) + drv_data->num_sensors = MAX_RESOLUTIONS; + profile->resolution.num_modes = drv_data->num_sensors; + for (i = 0; i < profile->resolution.num_modes; i++) { + profile->resolution.modes[i].dpi = drv_data->sensors[i].dpi; + /* FIXME: retrieve the refresh rate */ + profile->resolution.modes[i].hz = 0; + /* FIXME: we mark all resolutions as active because + * they are from different sensors */ + profile->resolution.modes[i].is_active = true; + } + + return 0; } return 0; @@ -295,16 +309,8 @@ static void hidpp20drv_read_profile(struct ratbag_profile *profile, unsigned int index) { struct ratbag_device *device = profile->device; - int dpi; - - - /* FIXME */ -#if 0 - dpi = hidpp20drv_read_resolution_dpi(device); - if (dpi > 0) - profile->current_dpi = dpi; -#endif + hidpp20drv_read_resolution_dpi(profile); hidpp20drv_read_special_key_mouse(device); } diff --git a/src/libratbag-private.h b/src/libratbag-private.h index 729822a1..28dd47ff 100644 --- a/src/libratbag-private.h +++ b/src/libratbag-private.h @@ -181,6 +181,7 @@ struct ratbag_driver { #define MAX_RESOLUTIONS 10 struct ratbag_resolution{ + struct ratbag_profile *profile; int refcount; void *userdata; unsigned int dpi; /**< resolution on dpi */ diff --git a/src/libratbag.c b/src/libratbag.c index 5acdca1c..8f21cac0 100644 --- a/src/libratbag.c +++ b/src/libratbag.c @@ -554,6 +554,7 @@ ratbag_create_profile(struct ratbag_device *device, unsigned int num_buttons) { struct ratbag_profile *profile; + unsigned i; profile = zalloc(sizeof(*profile)); if (!profile) @@ -566,6 +567,9 @@ ratbag_create_profile(struct ratbag_device *device, list_insert(&device->profiles, &profile->link); list_init(&profile->buttons); + for (i = 0; i < MAX_RESOLUTIONS; i++) + profile->resolution.modes[i].profile = profile; + assert(device->driver->read_profile); device->driver->read_profile(profile, index); @@ -743,9 +747,11 @@ LIBRATBAG_EXPORT int ratbag_resolution_set_dpi(struct ratbag_resolution *resolution, unsigned int dpi) { + struct ratbag_profile *profile = resolution->profile; resolution->dpi = dpi; - /* FIXME: call into the driver */ - return 0; + + assert(profile->device->driver->write_resolution_dpi); + return profile->device->driver->write_resolution_dpi(profile, dpi); } LIBRATBAG_EXPORT int