diff --git a/src/linux_joystick.c b/src/linux_joystick.c index 38c6a503..c0a951ff 100644 --- a/src/linux_joystick.c +++ b/src/linux_joystick.c @@ -38,7 +38,6 @@ #include #include -#define NUM_BITS(size) ((size) / 8) #define TEST_BIT(bit, arr) (arr[(bit) / 8] & (1 << ((bit) % 8))) static void handleKeyEvent(_GLFWjoystick* js, int code, int value) @@ -100,8 +99,11 @@ static void pollJoystick(_GLFWjoystick* js) { int i; - for (i = ABS_X; i < ABS_MAX; i++) + for (i = 0; i < ABS_CNT; i++) { + if (js->linjs.absMap[i] < 0) + continue; + struct input_absinfo *info = &js->linjs.absInfo[i]; if (ioctl(js->linjs.fd, EVIOCGABS(i), info) < 0) @@ -117,9 +119,9 @@ static GLFWbool openJoystickDevice(const char* path) { int jid, fd, i; char name[256] = ""; - char evBits[NUM_BITS(EV_MAX)] = {0}; - char keyBits[NUM_BITS(KEY_MAX)] = {0}; - char absBits[NUM_BITS(ABS_MAX)] = {0}; + char evBits[(EV_CNT + 7) / 8] = {0}; + char keyBits[(KEY_CNT + 7) / 8] = {0}; + char absBits[(ABS_CNT + 7) / 8] = {0}; int axisCount = 0; int buttonCount = 0; int hatCount = 0; @@ -151,7 +153,7 @@ static GLFWbool openJoystickDevice(const char* path) if (ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) strncpy(name, "Unknown", sizeof(name)); - for (i = BTN_MISC; i < KEY_MAX; i++) + for (i = BTN_MISC; i < KEY_CNT; i++) { if (!TEST_BIT(i, keyBits)) continue; @@ -159,8 +161,9 @@ static GLFWbool openJoystickDevice(const char* path) linjs.keyMap[i] = buttonCount++; } - for (i = ABS_X; i < ABS_MAX; i++) + for (i = 0; i < ABS_CNT; i++) { + linjs.absMap[i] = -1; if (!TEST_BIT(i, absBits)) continue; diff --git a/src/linux_joystick.h b/src/linux_joystick.h index 73b4819f..127a4485 100644 --- a/src/linux_joystick.h +++ b/src/linux_joystick.h @@ -31,18 +31,16 @@ #define _GLFW_PLATFORM_JOYSTICK_STATE _GLFWjoystickLinux linjs #define _GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE _GLFWlibraryLinux linjs -#define HATS_MAX ((ABS_HAT3Y - ABS_HAT0X) / 2) - // Linux-specific joystick data // typedef struct _GLFWjoystickLinux { int fd; char path[PATH_MAX]; - int keyMap[KEY_MAX]; - int absMap[ABS_MAX]; - struct input_absinfo absInfo[ABS_MAX]; - int hats[HATS_MAX][2]; + int keyMap[KEY_CNT]; + int absMap[ABS_CNT]; + struct input_absinfo absInfo[ABS_CNT]; + int hats[4][2]; } _GLFWjoystickLinux; // Linux-specific joystick API data