diff --git a/src/evdev-tablet-pad.c b/src/evdev-tablet-pad.c index cb02726a..431972ae 100644 --- a/src/evdev-tablet-pad.c +++ b/src/evdev-tablet-pad.c @@ -369,7 +369,7 @@ pad_notify_button_mask(struct pad_dispatch *pad, code = i * 8; while (buttons_slice) { int enabled; - char map; + key_or_button_map_t map; code++; enabled = (buttons_slice & 1); @@ -379,10 +379,21 @@ pad_notify_button_mask(struct pad_dispatch *pad, continue; map = pad->button_map[code - 1]; - if (map != -1) { - group = pad_button_get_mode_group(pad, map); - pad_button_update_mode(group, map, state); - tablet_pad_notify_button(base, time, map, state, group); + if (map_is_unmapped(map)) + continue; + + if (map_is_button(map)) { + int32_t button = map_value(map); + + group = pad_button_get_mode_group(pad, button); + pad_button_update_mode(group, button, state); + tablet_pad_notify_button(base, + time, + button, + state, + group); + } else { + abort(); } } } @@ -554,7 +565,7 @@ pad_init_buttons_from_libwacom(struct pad_dispatch *pad, if (code == 0) continue; - pad->button_map[code] = map++; + map_set_button_map(pad->button_map[code], map++); } pad->nbuttons = map; @@ -579,22 +590,22 @@ pad_init_buttons_from_kernel(struct pad_dispatch *pad, /* we match wacom_report_numbered_buttons() from the kernel */ for (code = BTN_0; code < BTN_0 + 10; code++) { if (libevdev_has_event_code(device->evdev, EV_KEY, code)) - pad->button_map[code] = map++; + map_set_button_map(pad->button_map[code], map++); } for (code = BTN_BASE; code < BTN_BASE + 2; code++) { if (libevdev_has_event_code(device->evdev, EV_KEY, code)) - pad->button_map[code] = map++; + map_set_button_map(pad->button_map[code], map++); } for (code = BTN_A; code < BTN_A + 6; code++) { if (libevdev_has_event_code(device->evdev, EV_KEY, code)) - pad->button_map[code] = map++; + map_set_button_map(pad->button_map[code], map++); } for (code = BTN_LEFT; code < BTN_LEFT + 7; code++) { if (libevdev_has_event_code(device->evdev, EV_KEY, code)) - pad->button_map[code] = map++; + map_set_button_map(pad->button_map[code], map++); } pad->nbuttons = map; @@ -607,7 +618,7 @@ pad_init_buttons(struct pad_dispatch *pad, size_t i; for (i = 0; i < ARRAY_LENGTH(pad->button_map); i++) - pad->button_map[i] = -1; + map_init(pad->button_map[i]); if (!pad_init_buttons_from_libwacom(pad, device)) pad_init_buttons_from_kernel(pad, device); diff --git a/src/evdev-tablet-pad.h b/src/evdev-tablet-pad.h index 6208caf8..feb95272 100644 --- a/src/evdev-tablet-pad.h +++ b/src/evdev-tablet-pad.h @@ -47,6 +47,18 @@ struct button_state { unsigned char bits[NCHARS(KEY_CNT)]; }; +typedef struct { + uint32_t value; +} key_or_button_map_t; + +#define map_init(x_) ((x_).value = (uint32_t)-1) +#define map_is_unmapped(x_) ((x_).value == (uint32_t)-1) +#define map_is_button(x_) (((x_).value & 0xFF000000) == 0) +#define map_is_key(x_) (((x_).value & 0xFF000000) != 0) +#define map_set_button_map(field_, value_) ((field_).value = value_) +#define map_set_key_map(field_, value_) ((field_).value = value_ | 0xFF000000) +#define map_value(x_) ((x_).value & 0x00FFFFFF) + struct pad_dispatch { struct evdev_dispatch base; struct evdev_device *device; @@ -56,7 +68,7 @@ struct pad_dispatch { struct button_state button_state; struct button_state prev_button_state; - char button_map[KEY_CNT]; + key_or_button_map_t button_map[KEY_CNT]; unsigned int nbuttons; bool have_abs_misc_terminator;