sinowealth: implement disabled resolutions

This commit is contained in:
Yaroslav Chvanov
2022-01-31 04:26:46 +03:00
parent a624c681a3
commit fdb4d65aa4

View File

@@ -1127,11 +1127,10 @@ sinowealth_update_profile_from_config(struct ratbag_profile *profile)
resolution->dpi_x = sinowealth_raw_to_dpi(device, config->dpis.dpis[resolution->index]);
resolution->dpi_y = resolution->dpi_x;
}
if (config->disabled_dpi_slots & (1 << resolution->index)) {
/* DPI step is disabled, fake it by setting DPI to 0 */
resolution->dpi_x = 0;
resolution->dpi_y = 0;
} else {
resolution->is_disabled = config->disabled_dpi_slots & (1 << resolution->index);
if (!resolution->is_disabled) {
/* NOTE: we mark this `1` unsigned explicitly as otherwise
* the right-hand side will become a signed integer and the
* comparison will be between expressions of different
@@ -1553,18 +1552,15 @@ sinowealth_init_profile(struct ratbag_device *device)
* We don't support them yet, so it's not a priority now.
*/
/* Number of DPIs = all DPIs from min to max (inclusive) and "0 DPI" as a special value
* to signal a disabled DPI step.
*/
unsigned int num_dpis = (sinowealth_get_max_dpi_for_sensor(config->sensor_type) - SINOWEALTH_DPI_MIN) / SINOWEALTH_DPI_STEP + 2;
/* Number of DPIs = all DPIs from min to max (inclusive). */
const unsigned int num_dpis = (sinowealth_get_max_dpi_for_sensor(config->sensor_type) - SINOWEALTH_DPI_MIN) / SINOWEALTH_DPI_STEP + 1;
ratbag_device_init_profiles(device, SINOWEALTH_NUM_PROFILES, SINOWEALTH_NUM_DPIS, drv_data->button_count, drv_data->led_count);
/* Generate DPI list */
unsigned int dpis[num_dpis];
dpis[0] = 0; /* 0 DPI = disabled */
for (unsigned int i = 1; i < num_dpis; i++) {
dpis[i] = SINOWEALTH_DPI_MIN + (i - 1) * SINOWEALTH_DPI_STEP;
for (unsigned int i = 0; i < num_dpis; i++) {
dpis[i] = SINOWEALTH_DPI_MIN + i * SINOWEALTH_DPI_STEP;
}
ratbag_device_for_each_profile(device, profile) {
@@ -1579,6 +1575,7 @@ sinowealth_init_profile(struct ratbag_device *device)
ratbag_profile_for_each_resolution(profile, resolution) {
ratbag_resolution_set_dpi_list(resolution, dpis, num_dpis);
ratbag_resolution_set_cap(resolution, RATBAG_RESOLUTION_CAP_SEPARATE_XY_RESOLUTION);
ratbag_resolution_set_cap(resolution, RATBAG_RESOLUTION_CAP_DISABLE);
}
/* Set up available report rates. */
@@ -1810,7 +1807,7 @@ sinowealth_update_config_from_profile(struct ratbag_profile *profile)
config->dpi_count = 0;
ratbag_profile_for_each_resolution(profile, resolution) {
if (!resolution->dpi_x || !resolution->dpi_y)
if (resolution->is_disabled)
continue;
/* Limit the resolution if it somehow got higher than allowed. */