diff --git a/src/driver-etekcity.c b/src/driver-etekcity.c index 831c5b56..67f099b5 100644 --- a/src/driver-etekcity.c +++ b/src/driver-etekcity.c @@ -600,7 +600,7 @@ etekcity_read_button(struct ratbag_button *button) button->index, button->profile->index, rc < 0 ? strerror(-rc) : "not read enough", rc); } else { - ratbag_button_set_macro(button); + ratbag_button_set_macro(button, macro->name); log_raw(device->ratbag, "macro on button %d of profile %d is named '%s', and contains %d events:\n", button->index, button->profile->index, diff --git a/src/libratbag-private.h b/src/libratbag-private.h index 8dd263a0..45e4a659 100644 --- a/src/libratbag-private.h +++ b/src/libratbag-private.h @@ -257,8 +257,8 @@ struct ratbag_macro_event { #define MAX_MACRO_EVENTS 64 struct ratbag_macro { - const char *name; - const char *group; + char *name; + char *group; struct ratbag_macro_event events[MAX_MACRO_EVENTS]; }; diff --git a/src/libratbag.c b/src/libratbag.c index 0c240865..982a9914 100644 --- a/src/libratbag.c +++ b/src/libratbag.c @@ -1204,8 +1204,11 @@ static void ratbag_button_destroy(struct ratbag_button *button) { list_remove(&button->link); - if (button->action.macro) + if (button->action.macro) { + if (button->action.macro->name) + free(button->action.macro->name); free(button->action.macro); + } free(button); } @@ -1288,16 +1291,20 @@ ratbag_resolution_get_user_data(const struct ratbag_resolution *ratbag_resolutio } LIBRATBAG_EXPORT int -ratbag_button_set_macro(struct ratbag_button *button) +ratbag_button_set_macro(struct ratbag_button *button, const char *name) { struct ratbag_macro *macro; if (!button->action.macro) button->action.macro = zalloc(sizeof(*macro)); - else + else { + if (button->action.macro->name) + free(button->action.macro->name); memset(button->action.macro, 0, sizeof(*macro)); + } button->action.type = RATBAG_BUTTON_ACTION_TYPE_MACRO; + button->action.macro->name = name ? strdup(name) : NULL; return 0; } @@ -1380,3 +1387,12 @@ ratbag_button_get_macro_event_timeout(struct ratbag_button *button, unsigned int return macro->events[index].event.timeout; } + +LIBRATBAG_EXPORT const char * +ratbag_button_get_macro_name(struct ratbag_button *button) +{ + if (button->action.type != RATBAG_BUTTON_ACTION_TYPE_MACRO) + return NULL; + + return button->action.macro->name; +} diff --git a/src/libratbag.h b/src/libratbag.h index 11d50b38..f15c90f6 100644 --- a/src/libratbag.h +++ b/src/libratbag.h @@ -1269,6 +1269,22 @@ enum ratbag_macro_event_type { RATBAG_MACRO_EVENT_WAIT, }; +/** + * @ingroup button + * + * If a button's action is @ref RATBAG_BUTTON_ACTION_TYPE_MACRO, + * this function returns the macro name. + * + * If the button's action type is not @ref RATBAG_BUTTON_ACTION_TYPE_MACRO, + * this function returns NULL. + * + * @param button A previously initialized ratbag button + * + * @return The name of the macro associated to the button. + */ +const char * +ratbag_button_get_macro_name(struct ratbag_button *button); + /** * @ingroup button * @@ -1334,7 +1350,7 @@ ratbag_button_get_macro_event_timeout(struct ratbag_button *button, unsigned int * allocates the required memory to store the macro. */ int -ratbag_button_set_macro(struct ratbag_button *button); +ratbag_button_set_macro(struct ratbag_button *button, const char *name); /** * @ingroup button diff --git a/src/libratbag.sym b/src/libratbag.sym index 1b1cda5d..291f51b2 100644 --- a/src/libratbag.sym +++ b/src/libratbag.sym @@ -11,6 +11,7 @@ global: ratbag_button_get_macro_event_type; ratbag_button_get_macro_event_key; ratbag_button_get_macro_event_timeout; + ratbag_button_get_macro_name; ratbag_button_get_special; ratbag_button_get_user_data; ratbag_button_has_action_type; diff --git a/tools/shared.c b/tools/shared.c index 56273f42..280975fc 100644 --- a/tools/shared.c +++ b/tools/shared.c @@ -158,10 +158,13 @@ char * button_action_macro_to_str(struct ratbag_button *button) { char str[4096] = {0}; + const char *name; int offset; unsigned int i; - offset = snprintf(str, sizeof(str), "macro:"); + name = ratbag_button_get_macro_name(button); + offset = snprintf(str, sizeof(str), "macro \"%s\":", + name ? name : "UNKNOWN"); for (i = 0; i < MAX_MACRO_EVENTS; i++) { enum ratbag_macro_event_type type = ratbag_button_get_macro_event_type(button, i); int key = ratbag_button_get_macro_event_key(button, i);