diff --git a/src/driver-test.c b/src/driver-test.c index 9cfb3708..04b5989b 100644 --- a/src/driver-test.c +++ b/src/driver-test.c @@ -24,6 +24,7 @@ #include "config.h" #include +#include #include "libratbag-private.h" #include "libratbag-test.h" @@ -73,6 +74,54 @@ test_set_active_profile(struct ratbag_device *device, unsigned int index) return 0; } +static void +test_read_button(struct ratbag_button *button) +{ + struct ratbag_device *device = button->profile->device; + struct ratbag_test_device *d = ratbag_get_drv_data(device); + struct ratbag_test_profile *p = &d->profiles[button->profile->index]; + struct ratbag_button_macro *m; + const char data[] = "TEST"; + const char *c; + + switch (p->buttons[button->index].type) { + case RATBAG_BUTTON_ACTION_TYPE_BUTTON: + button->action.type = RATBAG_BUTTON_ACTION_TYPE_BUTTON; + button->action.action.button = p->buttons[button->index].button; + break; + case RATBAG_BUTTON_ACTION_TYPE_KEY: + button->action.type = RATBAG_BUTTON_ACTION_TYPE_KEY; + button->action.action.key.key = p->buttons[button->index].key; + break; + case RATBAG_BUTTON_ACTION_TYPE_MACRO: + button->action.type = RATBAG_BUTTON_ACTION_TYPE_MACRO; + m = ratbag_button_macro_new("test macro"); + + ARRAY_FOR_EACH(data, c) { + char str[6]; + snprintf_safe(str, 6, "KEY_%c", *c); + ratbag_button_macro_set_event(m, + 0, + RATBAG_MACRO_EVENT_KEY_PRESSED, + libevdev_event_code_from_name(EV_KEY, str)); + ratbag_button_macro_set_event(m, + 0, + RATBAG_MACRO_EVENT_KEY_RELEASED, + libevdev_event_code_from_name(EV_KEY, str)); + } + ratbag_button_copy_macro(button, m); + ratbag_button_macro_unref(m); + break; + default: + button->action.type = RATBAG_BUTTON_ACTION_TYPE_UNKNOWN; + } + + ratbag_button_enable_action_type(button, RATBAG_BUTTON_ACTION_TYPE_BUTTON); + ratbag_button_enable_action_type(button, RATBAG_BUTTON_ACTION_TYPE_KEY); + ratbag_button_enable_action_type(button, RATBAG_BUTTON_ACTION_TYPE_SPECIAL); + ratbag_button_enable_action_type(button, RATBAG_BUTTON_ACTION_TYPE_MACRO); +} + static int test_fake_probe(struct ratbag_device *device) { @@ -116,7 +165,7 @@ struct ratbag_driver test_driver = { .read_profile = test_read_profile, .write_profile = test_write_profile, .set_active_profile = test_set_active_profile, - .read_button = NULL, + .read_button = test_read_button, .write_button = NULL, .write_resolution_dpi = NULL, }; diff --git a/src/libratbag-test.h b/src/libratbag-test.h index 3dbd1ffd..c7d7786d 100644 --- a/src/libratbag-test.h +++ b/src/libratbag-test.h @@ -32,6 +32,12 @@ #define RATBAG_TEST_MAX_RESOLUTIONS 8 struct ratbag_test_button { + enum ratbag_button_action_type type; + union { + int button; + int key; + enum ratbag_button_action_special special; + }; }; struct ratbag_test_resolution { diff --git a/test/test-device.c b/test/test-device.c index 7a443119..052bffc4 100644 --- a/test/test-device.c +++ b/test/test-device.c @@ -655,6 +655,7 @@ START_TEST(device_buttons) struct ratbag_device *d; struct ratbag_profile *p; struct ratbag_button *b; + struct ratbag_button_macro *m; int nprofiles, nbuttons; int i, j; int device_freed_count = 0; @@ -662,6 +663,8 @@ START_TEST(device_buttons) struct ratbag_test_device td = sane_device; td.num_buttons = 10; + td.profiles[0].buttons[8].type = RATBAG_BUTTON_ACTION_TYPE_MACRO; + td.destroyed_data = &device_freed_count; r = ratbag_create_context(&abort_iface, NULL); @@ -681,6 +684,14 @@ START_TEST(device_buttons) b = ratbag_profile_get_button(p, j); ck_assert(b != NULL); + if (ratbag_button_get_action_type(b) == + RATBAG_BUTTON_ACTION_TYPE_MACRO) { + m = ratbag_button_get_macro(b); + ck_assert(m != NULL); + + ratbag_button_macro_unref(m); + } + ratbag_button_unref(b); } ratbag_profile_unref(p);