pad: switch the button mapping to one that can handle keys or buttons

No functional changes, we still use the same bits everywhere.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2019-01-17 11:49:39 +10:00
parent 9696f37393
commit 27fda918d8
2 changed files with 35 additions and 12 deletions

View file

@ -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);

View file

@ -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;