diff --git a/src/libratbag.c b/src/libratbag.c index cf2bb92a..042d272c 100644 --- a/src/libratbag.c +++ b/src/libratbag.c @@ -752,6 +752,12 @@ ratbag_button_get_type(struct ratbag_button *button) return button->type; } +LIBRATBAG_EXPORT enum ratbag_button_action_type +ratbag_button_get_action_type(struct ratbag_button *button) +{ + return button->action.type; +} + LIBRATBAG_EXPORT unsigned int ratbag_button_get_button(struct ratbag_button *button) { diff --git a/src/libratbag.sym b/src/libratbag.sym index 6be55d84..b4797587 100644 --- a/src/libratbag.sym +++ b/src/libratbag.sym @@ -4,6 +4,7 @@ LIBRATBAG_0.1.0 { global: ratbag_create_context; ratbag_button_ref; + ratbag_button_get_action_type; ratbag_button_get_type; ratbag_button_get_button; ratbag_button_get_key; diff --git a/tools/ratbag-command.c b/tools/ratbag-command.c index 30eb24a4..33c06cf4 100644 --- a/tools/ratbag-command.c +++ b/tools/ratbag-command.c @@ -164,6 +164,85 @@ button_type_to_str(enum ratbag_button_type type) return str; } +static inline const char * +button_action_special_to_str(struct ratbag_button *button) +{ + enum ratbag_button_action_special special; + const char *str = "UNKNOWN"; + + special = ratbag_button_get_special(button); + + switch (special) { + case RATBAG_BUTTON_ACTION_SPECIAL_INVALID: str = "invalid"; break; + case RATBAG_BUTTON_ACTION_SPECIAL_DOUBLECLICK: str = "double click"; break; + + /* Wheel mappings */ + case RATBAG_BUTTON_ACTION_SPECIAL_WHEEL_LEFT: str = "wheel left"; break; + case RATBAG_BUTTON_ACTION_SPECIAL_WHEEL_RIGHT: str = "wheel right"; break; + case RATBAG_BUTTON_ACTION_SPECIAL_WHEEL_UP: str = "wheel up"; break; + case RATBAG_BUTTON_ACTION_SPECIAL_WHEEL_DOWN: str = "wheel down"; break; + case RATBAG_BUTTON_ACTION_SPECIAL_RATCHET_MODE_SWITCH: str = "ratchet mode switch"; break; + + /* DPI switch */ + case RATBAG_BUTTON_ACTION_SPECIAL_RESOLUTION_CYCLE_UP: str = "resolution cycle up"; break; + case RATBAG_BUTTON_ACTION_SPECIAL_RESOLUTION_UP: str = "resolution up"; break; + case RATBAG_BUTTON_ACTION_SPECIAL_RESOLUTION_DOWN: str = "resolution down"; break; + + /* Profile */ + case RATBAG_BUTTON_ACTION_SPECIAL_PROFILE_CYCLE_UP: str = "profile cycle up"; break; + case RATBAG_BUTTON_ACTION_SPECIAL_PROFILE_UP: str = "profile up"; break; + case RATBAG_BUTTON_ACTION_SPECIAL_PROFILE_DOWN: str = "profile down"; break; + } + + return str; +} + +static inline char * +button_action_button_to_str(struct ratbag_button *button) +{ + char str[96]; + + sprintf(str, "button %d", ratbag_button_get_button(button)); + + return strdup(str); +} + +static inline char * +button_action_key_to_str(struct ratbag_button *button) +{ + const char *str; + unsigned int modifiers[10]; + size_t m_size = 10; + + str = libevdev_event_code_get_name(EV_KEY, ratbag_button_get_key(button, modifiers, &m_size)); + if (!str) + str = "UNKNOWN"; + + return strdup(str); +} + +static inline char * +button_action_to_str(struct ratbag_button *button) +{ + enum ratbag_button_action_type type; + char *str; + + type = ratbag_button_get_action_type(button); + + switch (type) { + case RATBAG_BUTTON_ACTION_TYPE_BUTTON: str = button_action_button_to_str(button); break; + case RATBAG_BUTTON_ACTION_TYPE_KEY: str = button_action_key_to_str(button); break; + case RATBAG_BUTTON_ACTION_TYPE_SPECIAL: str = strdup(button_action_special_to_str(button)); break; + case RATBAG_BUTTON_ACTION_TYPE_MACRO: str = strdup("macro"); break; + case RATBAG_BUTTON_ACTION_TYPE_NONE: str = strdup("none"); break; + default: + error("type %d unknown\n", type); + str = strdup("UNKNOWN"); + } + + return str; +} + static struct ratbag_device * ratbag_cmd_open_device(struct ratbag *ratbag, const char *path) { @@ -194,6 +273,7 @@ ratbag_cmd_info(struct ratbag *ratbag, uint32_t flags, int argc, char **argv) struct ratbag_device *device; struct ratbag_profile *profile, *active_profile; struct ratbag_button *button; + char *action; int num_profiles, num_buttons; int i, b; int rc = 1; @@ -251,7 +331,10 @@ ratbag_cmd_info(struct ratbag *ratbag, uint32_t flags, int argc, char **argv) button = ratbag_profile_get_button_by_index(profile, b); type = ratbag_button_get_type(button); - printf(" Button: %d type %s\n", b, button_type_to_str(type)); + action = button_action_to_str(button); + printf(" Button: %d type %s is mapped to '%s'\n", + b, button_type_to_str(type), action); + free(action); button = ratbag_button_unref(button); }