code = i * 8;
while (buttons_slice) {
int enabled;
- char map;
+ key_or_button_map_t map;
code++;
enabled = (buttons_slice & 1);
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();
}
}
}
if (code == 0)
continue;
- pad->button_map[code] = map++;
+ map_set_button_map(pad->button_map[code], map++);
}
pad->nbuttons = map;
/* 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;
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);
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;
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;