evdev: Detect whether input devices are accelerometers Anything with X, Y and Z axes but no buttons is probably an accelerometer (this is the assumption made in udev). Signed-off-by: Simon McVittie <smcv@collabora.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
diff --git a/src/core/linux/SDL_evdev_capabilities.c b/src/core/linux/SDL_evdev_capabilities.c
index 82b1118..12185fe 100644
--- a/src/core/linux/SDL_evdev_capabilities.c
+++ b/src/core/linux/SDL_evdev_capabilities.c
@@ -33,6 +33,24 @@ SDL_EVDEV_GuessDeviceClass(unsigned long bitmask_ev[NBITS(EV_MAX)],
int devclass = 0;
unsigned long keyboard_mask;
+ /* X, Y, Z axes but no buttons probably means an accelerometer */
+ if (test_bit(EV_ABS, bitmask_ev) &&
+ test_bit(ABS_X, bitmask_abs) &&
+ test_bit(ABS_Y, bitmask_abs) &&
+ test_bit(ABS_Z, bitmask_abs) &&
+ !test_bit(EV_KEY, bitmask_ev)) {
+ return SDL_UDEV_DEVICE_ACCELEROMETER;
+ }
+
+ /* RX, RY, RZ axes but no buttons also probably means an accelerometer */
+ if (test_bit(EV_ABS, bitmask_ev) &&
+ test_bit(ABS_RX, bitmask_abs) &&
+ test_bit(ABS_RY, bitmask_abs) &&
+ test_bit(ABS_RZ, bitmask_abs) &&
+ !test_bit(EV_KEY, bitmask_ev)) {
+ return SDL_UDEV_DEVICE_ACCELEROMETER;
+ }
+
if (test_bit(EV_ABS, bitmask_ev) &&
test_bit(ABS_X, bitmask_abs) && test_bit(ABS_Y, bitmask_abs)) {
if (test_bit(BTN_STYLUS, bitmask_key) || test_bit(BTN_TOOL_PEN, bitmask_key)) {
diff --git a/src/core/linux/SDL_evdev_capabilities.h b/src/core/linux/SDL_evdev_capabilities.h
index 10bceb5..e9c66c0 100644
--- a/src/core/linux/SDL_evdev_capabilities.h
+++ b/src/core/linux/SDL_evdev_capabilities.h
@@ -37,7 +37,8 @@ typedef enum
SDL_UDEV_DEVICE_KEYBOARD = 0x0002,
SDL_UDEV_DEVICE_JOYSTICK = 0x0004,
SDL_UDEV_DEVICE_SOUND = 0x0008,
- SDL_UDEV_DEVICE_TOUCHSCREEN = 0x0010
+ SDL_UDEV_DEVICE_TOUCHSCREEN = 0x0010,
+ SDL_UDEV_DEVICE_ACCELEROMETER = 0x0020
} SDL_UDEV_deviceclass;
#define BITS_PER_LONG (sizeof(unsigned long) * 8)