mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2025-12-25 08:10:05 +01:00
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:
parent
9696f37393
commit
27fda918d8
2 changed files with 35 additions and 12 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue