hidpp20: fix after button type revamp

the logical and physical bits were inverted:
- logical is the action of the button
- physical corresponds to the actual button on the mouse (so the 'type')
- there is a duplicate from driver-etekcity to match 2 actions, this should
  be factorized in a helper somewhere in a later commit

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
This commit is contained in:
Benjamin Tissoires
2015-08-26 16:48:03 -04:00
parent 7ba2c7cee7
commit 08a568aed2
3 changed files with 80 additions and 69 deletions

View File

@@ -62,21 +62,13 @@ struct hidpp20drv_data {
struct hidpp20_control_id *controls;
};
static enum ratbag_button_action_type
hidpp20drv_raw_to_action(enum ratbag_button_type button_type)
{
if (button_type == RATBAG_BUTTON_TYPE_UNKNOWN)
return RATBAG_BUTTON_ACTION_TYPE_NONE;
return RATBAG_BUTTON_ACTION_TYPE_BUTTON;
}
static void
hidpp20drv_read_button(struct ratbag_button *button)
{
struct ratbag_device *device = button->profile->device;
struct hidpp20drv_data *drv_data = ratbag_get_drv_data(device);
struct hidpp20_control_id *control;
const struct ratbag_button_action *action;
uint16_t mapping;
if (!(drv_data->capabilities & HIDPP_CAP_BUTTON_KEY_1b04))
@@ -93,8 +85,10 @@ hidpp20drv_read_button(struct ratbag_button *button)
mapping,
control->reporting.divert || control->reporting.persist ? "(redirected) " : "",
__FILE__, __LINE__);
button->type = hidpp20_1b04_get_logical_mapping(mapping);
button->action.type = hidpp20drv_raw_to_action(button->type);
button->type = hidpp20_1b04_get_physical_mapping(control->task_id);
action = hidpp20_1b04_get_logical_mapping(mapping);
if (action)
button->action = *action;
}
static int
@@ -111,7 +105,7 @@ hidpp20drv_write_button(struct ratbag_button *button,
return -ENOTSUP;
control = &drv_data->controls[button->index];
mapping = hidpp20_1b04_get_logical_control_id(button->type);
mapping = hidpp20_1b04_get_logical_control_id(action);
if (!mapping)
return -EINVAL;

View File

@@ -504,39 +504,13 @@ err:
#define CMD_SPECIAL_KEYS_BUTTONS_GET_REPORTING 0x20
#define CMD_SPECIAL_KEYS_BUTTONS_SET_REPORTING 0x30
struct hidpp20_1b04_mapping {
uint16_t value;
const char *name;
enum ratbag_button_type type;
};
static const struct hidpp20_1b04_mapping hidpp20_1b04_logical_mapping[] =
{
{ 0, "None" , RATBAG_BUTTON_TYPE_UNKNOWN},
{ 1, "Volume Up" , RATBAG_BUTTON_TYPE_UNKNOWN},
{ 2, "Volume Down" , RATBAG_BUTTON_TYPE_UNKNOWN},
{ 3, "Mute" , RATBAG_BUTTON_TYPE_UNKNOWN},
{ 4, "Play/Pause" , RATBAG_BUTTON_TYPE_UNKNOWN},
{ 5, "Next" , RATBAG_BUTTON_TYPE_UNKNOWN},
{ 6, "Previous" , RATBAG_BUTTON_TYPE_UNKNOWN},
{ 7, "Stop" , RATBAG_BUTTON_TYPE_UNKNOWN},
{ 80, "Left" , RATBAG_BUTTON_TYPE_LEFT},
{ 81, "Right" , RATBAG_BUTTON_TYPE_RIGHT},
{ 82, "Middle" , RATBAG_BUTTON_TYPE_MIDDLE},
{ 83, "Back" , RATBAG_BUTTON_TYPE_SIDE},
{ 86, "Forward" , RATBAG_BUTTON_TYPE_EXTRA},
{ 195, "AppSwitchGesture" , RATBAG_BUTTON_TYPE_UNKNOWN},
{ 196, "SmartShift" , RATBAG_BUTTON_TYPE_WHEEL_RATCHET_MODE_SHIFT},
{ 315, "LedToggle" , RATBAG_BUTTON_TYPE_UNKNOWN},
};
struct hidpp20_1b04_action_mapping {
uint16_t value;
const char *name;
struct ratbag_button_action action;
};
static const struct hidpp20_1b04_action_mapping hidpp20_1b04_physical_mapping[] =
static const struct hidpp20_1b04_action_mapping hidpp20_1b04_logical_mapping[] =
{
{ 0, "None" , BUTTON_ACTION_NONE },
{ 1, "Volume Up" , BUTTON_ACTION_KEY(KEY_VOLUMEUP) },
@@ -546,39 +520,82 @@ static const struct hidpp20_1b04_action_mapping hidpp20_1b04_physical_mapping[]
{ 5, "Next" , BUTTON_ACTION_KEY(KEY_NEXTSONG) },
{ 6, "Previous" , BUTTON_ACTION_KEY(KEY_PREVIOUSSONG) },
{ 7, "Stop" , BUTTON_ACTION_KEY(KEY_STOPCD) },
{ 56, "Left Click" , BUTTON_ACTION_BUTTON(1) },
{ 57, "Right Click" , BUTTON_ACTION_BUTTON(2) },
{ 58, "Middle Click" , BUTTON_ACTION_BUTTON(3) },
{ 59, "Wheel Side Click Left" , BUTTON_ACTION_BUTTON(10) }, /* FIXME */
{ 60, "Back Click" , BUTTON_ACTION_BUTTON(4) },
{ 61, "Wheel Side Click Right" , BUTTON_ACTION_BUTTON(11)}, /* FIXME */
{ 62, "Forward Click" , BUTTON_ACTION_BUTTON(5) },
{ 156, "Gesture Button" , BUTTON_ACTION_NONE },
{ 157, "SmartShift" , BUTTON_ACTION_SPECIAL(RATBAG_BUTTON_ACTION_SPECIAL_RATCHET_MODE_SWITCH) },
{ 221, "LedToggle" , BUTTON_ACTION_NONE },
{ 80, "Left" , BUTTON_ACTION_BUTTON(1) },
{ 81, "Right" , BUTTON_ACTION_BUTTON(2) },
{ 82, "Middle" , BUTTON_ACTION_BUTTON(3) },
{ 83, "Back" , BUTTON_ACTION_BUTTON(4) },
{ 86, "Forward" , BUTTON_ACTION_BUTTON(5) },
{ 195, "AppSwitchGesture" , BUTTON_ACTION_NONE },
{ 196, "SmartShift" , BUTTON_ACTION_SPECIAL(RATBAG_BUTTON_ACTION_SPECIAL_RATCHET_MODE_SWITCH) },
{ 315, "LedToggle" , BUTTON_ACTION_NONE },
};
enum ratbag_button_type
struct hidpp20_1b04_physical_mapping {
uint16_t value;
const char *name;
enum ratbag_button_type type;
};
static const struct hidpp20_1b04_physical_mapping hidpp20_1b04_physical_mapping[] =
{
{ 0, "None" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 1, "Volume Up" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 2, "Volume Down" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 3, "Mute" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 4, "Play/Pause" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 5, "Next" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 6, "Previous" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 7, "Stop" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 56, "Left Click" , RATBAG_BUTTON_TYPE_LEFT },
{ 57, "Right Click" , RATBAG_BUTTON_TYPE_RIGHT },
{ 58, "Middle Click" , RATBAG_BUTTON_TYPE_MIDDLE },
{ 59, "Wheel Side Click Left" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 60, "Back Click" , RATBAG_BUTTON_TYPE_SIDE },
{ 61, "Wheel Side Click Right" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 62, "Forward Click" , RATBAG_BUTTON_TYPE_EXTRA },
{ 156, "Gesture Button" , RATBAG_BUTTON_TYPE_UNKNOWN },
{ 157, "SmartShift" , RATBAG_BUTTON_TYPE_WHEEL_RATCHET_MODE_SHIFT },
{ 221, "LedToggle" , RATBAG_BUTTON_TYPE_UNKNOWN },
};
const struct ratbag_button_action *
hidpp20_1b04_get_logical_mapping(uint16_t value)
{
const struct hidpp20_1b04_mapping *map;
const struct hidpp20_1b04_action_mapping *map;
ARRAY_FOR_EACH(hidpp20_1b04_logical_mapping, map) {
if (map->value == value)
return map->type;
return &map->action;
}
return RATBAG_BUTTON_TYPE_UNKNOWN;
}
uint16_t
hidpp20_1b04_get_logical_control_id(enum ratbag_button_type type)
hidpp20_1b04_get_logical_control_id(const struct ratbag_button_action *action)
{
const struct hidpp20_1b04_mapping *map;
const struct hidpp20_1b04_action_mapping *mapping;
ARRAY_FOR_EACH(hidpp20_1b04_logical_mapping, map) {
if (map->type == type)
return map->value;
ARRAY_FOR_EACH(hidpp20_1b04_logical_mapping, mapping) {
if (mapping->action.type == action->type) {
switch (action->type) {
case RATBAG_BUTTON_ACTION_TYPE_BUTTON:
if (mapping->action.action.button != action->action.button)
continue;
break;
case RATBAG_BUTTON_ACTION_TYPE_KEY:
if (mapping->action.action.key.key != action->action.key.key)
continue;
case RATBAG_BUTTON_ACTION_TYPE_SPECIAL:
if (mapping->action.action.special != action->action.special)
continue;
case RATBAG_BUTTON_ACTION_TYPE_MACRO:
/* FIXME: currently, do nothing */
default: /* do nothing, we are good */
break;
}
return mapping->value;
}
}
return 0;
@@ -587,33 +604,33 @@ hidpp20_1b04_get_logical_control_id(enum ratbag_button_type type)
const char *
hidpp20_1b04_get_logical_mapping_name(uint16_t value)
{
const struct hidpp20_1b04_mapping *map;
const struct hidpp20_1b04_action_mapping *mapping;
ARRAY_FOR_EACH(hidpp20_1b04_logical_mapping, map) {
if (map->value == value)
return map->name;
ARRAY_FOR_EACH(hidpp20_1b04_logical_mapping, mapping) {
if (mapping->value == value)
return mapping->name;
}
return "UNKNOWN";
}
const struct ratbag_button_action*
enum ratbag_button_type
hidpp20_1b04_get_physical_mapping(uint16_t value)
{
const struct hidpp20_1b04_action_mapping *map;
const struct hidpp20_1b04_physical_mapping *map;
ARRAY_FOR_EACH(hidpp20_1b04_physical_mapping, map) {
if (map->value == value)
return &map->action;
return map->type;
}
return NULL;
return RATBAG_BUTTON_TYPE_UNKNOWN;
}
const char *
hidpp20_1b04_get_physical_mapping_name(uint16_t value)
{
const struct hidpp20_1b04_action_mapping *map;
const struct hidpp20_1b04_physical_mapping *map;
ARRAY_FOR_EACH(hidpp20_1b04_physical_mapping, map) {
if (map->value == value)

View File

@@ -171,10 +171,10 @@ int hidpp20_special_key_mouse_get_controls(struct ratbag_device *device,
int hidpp20_special_key_mouse_set_control(struct ratbag_device *device,
struct hidpp20_control_id *control);
enum ratbag_button_type hidpp20_1b04_get_logical_mapping(uint16_t value);
uint16_t hidpp20_1b04_get_logical_control_id(enum ratbag_button_type type);
const struct ratbag_button_action *hidpp20_1b04_get_logical_mapping(uint16_t value);
uint16_t hidpp20_1b04_get_logical_control_id(const struct ratbag_button_action *action);
const char *hidpp20_1b04_get_logical_mapping_name(uint16_t value);
const struct ratbag_button_action *hidpp20_1b04_get_physical_mapping(uint16_t value);
enum ratbag_button_type hidpp20_1b04_get_physical_mapping(uint16_t value);
const char *hidpp20_1b04_get_physical_mapping_name(uint16_t value);
/* -------------------------------------------------------------------------- */