forked from drath/libratbag
Set the parent capabilities before setting any child ones (#223)
Any specific capability like 'switchable resolution' requires the basic 'resolution' capabilty to be set. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
committed by
Jente Hidskes
parent
d1db382607
commit
de16f1a4b1
@@ -664,6 +664,7 @@ etekcity_probe(struct ratbag_device *device)
|
|||||||
ETEKCITY_BUTTON_MAX + 1,
|
ETEKCITY_BUTTON_MAX + 1,
|
||||||
ETEKCITY_LED);
|
ETEKCITY_LED);
|
||||||
|
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS);
|
||||||
|
|
||||||
active_idx = etekcity_current_profile(device);
|
active_idx = etekcity_current_profile(device);
|
||||||
|
|||||||
@@ -1004,6 +1004,7 @@ gskill_probe(struct ratbag_device *device)
|
|||||||
GSKILL_BUTTON_MAX, GSKILL_NUM_LED);
|
GSKILL_BUTTON_MAX, GSKILL_NUM_LED);
|
||||||
|
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_QUERY_CONFIGURATION);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_QUERY_CONFIGURATION);
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_DISABLE_PROFILE);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_DISABLE_PROFILE);
|
||||||
|
|||||||
@@ -377,6 +377,9 @@ hidpp10drv_read_profile(struct ratbag_profile *profile, unsigned int index)
|
|||||||
if (rc)
|
if (rc)
|
||||||
xres = 0xffff;
|
xres = 0xffff;
|
||||||
|
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_RESOLUTION);
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION);
|
||||||
|
|
||||||
for (i = 0; i < profile->resolution.num_modes; i++) {
|
for (i = 0; i < profile->resolution.num_modes; i++) {
|
||||||
unsigned int min, max;
|
unsigned int min, max;
|
||||||
|
|
||||||
@@ -475,7 +478,9 @@ hidpp10drv_fill_from_profile(struct ratbag_device *device, struct hidpp10_device
|
|||||||
profile.num_leds);
|
profile.num_leds);
|
||||||
|
|
||||||
if (dev->profile_type != HIDPP10_PROFILE_UNKNOWN) {
|
if (dev->profile_type != HIDPP10_PROFILE_UNKNOWN) {
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_PROFILE);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_PROFILE);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_PROFILE);
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -785,6 +785,7 @@ hidpp20drv_init_feature(struct ratbag_device *device, uint16_t feature)
|
|||||||
break;
|
break;
|
||||||
case HIDPP_PAGE_MOUSE_POINTER_BASIC: {
|
case HIDPP_PAGE_MOUSE_POINTER_BASIC: {
|
||||||
drv_data->capabilities |= HIDPP_CAP_RESOLUTION_2200;
|
drv_data->capabilities |= HIDPP_CAP_RESOLUTION_2200;
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_RESOLUTION);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case HIDPP_PAGE_ADJUSTABLE_DPI: {
|
case HIDPP_PAGE_ADJUSTABLE_DPI: {
|
||||||
@@ -794,6 +795,7 @@ hidpp20drv_init_feature(struct ratbag_device *device, uint16_t feature)
|
|||||||
rc = hidpp20drv_read_resolution_dpi_2201(device);
|
rc = hidpp20drv_read_resolution_dpi_2201(device);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
return 0; /* this is not a hard failure */
|
return 0; /* this is not a hard failure */
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_RESOLUTION);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION);
|
||||||
drv_data->capabilities |= HIDPP_CAP_SWITCHABLE_RESOLUTION_2201;
|
drv_data->capabilities |= HIDPP_CAP_SWITCHABLE_RESOLUTION_2201;
|
||||||
break;
|
break;
|
||||||
@@ -801,6 +803,7 @@ hidpp20drv_init_feature(struct ratbag_device *device, uint16_t feature)
|
|||||||
case HIDPP_PAGE_SPECIAL_KEYS_BUTTONS: {
|
case HIDPP_PAGE_SPECIAL_KEYS_BUTTONS: {
|
||||||
log_debug(ratbag, "device has programmable keys/buttons\n");
|
log_debug(ratbag, "device has programmable keys/buttons\n");
|
||||||
drv_data->capabilities |= HIDPP_CAP_BUTTON_KEY_1b04;
|
drv_data->capabilities |= HIDPP_CAP_BUTTON_KEY_1b04;
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY);
|
||||||
/* we read the profile once to get the correct number of
|
/* we read the profile once to get the correct number of
|
||||||
* supported buttons. */
|
* supported buttons. */
|
||||||
|
|||||||
@@ -369,8 +369,11 @@ logitech_g300_probe(struct ratbag_device *device)
|
|||||||
LOGITECH_G300_BUTTON_MAX + 1,
|
LOGITECH_G300_BUTTON_MAX + 1,
|
||||||
LOGITECH_G300_NUM_LED);
|
LOGITECH_G300_NUM_LED);
|
||||||
|
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_RESOLUTION);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION);
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_PROFILE);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_PROFILE);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_PROFILE);
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY);
|
||||||
|
|
||||||
active_idx = logitech_g300_current_profile(device);
|
active_idx = logitech_g300_current_profile(device);
|
||||||
|
|||||||
@@ -800,6 +800,7 @@ roccat_probe(struct ratbag_device *device)
|
|||||||
ROCCAT_BUTTON_MAX + 1,
|
ROCCAT_BUTTON_MAX + 1,
|
||||||
ROCCAT_LED_MAX);
|
ROCCAT_LED_MAX);
|
||||||
|
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_MACROS);
|
||||||
|
|
||||||
active_idx = roccat_current_profile(device);
|
active_idx = roccat_current_profile(device);
|
||||||
|
|||||||
@@ -690,15 +690,19 @@ ratbag_device_init_profiles(struct ratbag_device *device,
|
|||||||
device->num_profiles = num_profiles;
|
device->num_profiles = num_profiles;
|
||||||
|
|
||||||
if (num_profiles > 1) {
|
if (num_profiles > 1) {
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_PROFILE);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_PROFILE);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_PROFILE);
|
||||||
|
|
||||||
/* having more than one profile means we can remap the buttons
|
/* having more than one profile means we can remap the buttons
|
||||||
* at least */
|
* at least */
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_BUTTON_KEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_resolutions > 1)
|
if (num_resolutions > 1) {
|
||||||
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_RESOLUTION);
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION);
|
||||||
|
}
|
||||||
|
|
||||||
if (num_leds > 1)
|
if (num_leds > 1)
|
||||||
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_LED);
|
ratbag_device_set_capability(device, RATBAG_DEVICE_CAP_LED);
|
||||||
@@ -821,6 +825,17 @@ ratbag_device_set_capability(struct ratbag_device *device,
|
|||||||
if (cap == RATBAG_DEVICE_CAP_NONE || cap >= MAX_CAP)
|
if (cap == RATBAG_DEVICE_CAP_NONE || cap >= MAX_CAP)
|
||||||
abort();
|
abort();
|
||||||
|
|
||||||
|
if (cap != RATBAG_DEVICE_CAP_QUERY_CONFIGURATION && cap % 100) {
|
||||||
|
enum ratbag_device_capability parent_cap = (cap/100) * 100;
|
||||||
|
|
||||||
|
if (!long_bit_is_set(device->capabilities, parent_cap)) {
|
||||||
|
log_bug_libratbag(device->ratbag,
|
||||||
|
"Cap %d requires setting %d\n",
|
||||||
|
cap, parent_cap);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
long_set_bit(device->capabilities, cap);
|
long_set_bit(device->capabilities, cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user