pad: switch the button mapping to one that can handle keys or buttons
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 17 Jan 2019 01:49:39 +0000 (11:49 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Wed, 4 Dec 2019 05:31:46 +0000 (15:31 +1000)
No functional changes, we still use the same bits everywhere.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
src/evdev-tablet-pad.c
src/evdev-tablet-pad.h

index cb02726a75ec418fea3269319a13849659da8cc5..431972ae190d3840b524e2a7908344ea80817a21 100644 (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);
index 6208caf8e4a902a6813308ca6d1891231462c558..feb95272f0a4d0d9736362b1a1766266cb5acd5e 100644 (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;