/* See LICENSE file for copyright and license details. */ #include "libgamepad.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(__GNUC__) # define LIBGAMEPAD_CONST__ __attribute__((__const__)) #else # define LIBGAMEPAD_CONST__ #endif #define READ_(ARR, I) ((ARR)[(I) / BITSOF(*(ARR))]) #define SHIFT_(ARR, I) ((I) % BITSOF(*(ARR))) #define ELEMSOF(A) (sizeof(A) / sizeof(*(A))) #define BITSOF(T) (8 * sizeof(T)) #define XORBIT(ARR, I) (READ_(ARR, I) ^= 1 << SHIFT_(ARR, I)) #define SETBIT(ARR, I) (READ_(ARR, I) |= 1 << SHIFT_(ARR, I)) #define GETBIT(ARR, I) ((READ_(ARR, I) >> SHIFT_(ARR, I)) & 1) #define ELEMS_REQUIRED(BITS, TYPE) ((BITS + BITSOF(TYPE) - 1) / BITSOF(TYPE)) #define DEFER_EINTR_(DEVICE, ERROR_CONDITION, GOTO_ON_FAILURE)\ do {\ while (ERROR_CONDITION) {\ if (errno != EINTR)\ goto GOTO_ON_FAILURE;\ (DEVICE)->internals->deferred_error = EINTR;\ }\ } while (0) struct libgamepad_attachment_monitor { struct udev *udev; struct udev_monitor *monitor; }; struct libgamepad_device_internals { int deferred_error; int close_fd; int require_sync; struct input_absinfo *absinfo; uint8_t *buttons; struct input_event *evbuf; size_t evbuf_size; size_t ev_queued; }; extern const char *libgamepad_button_names__[ #include "button.count" ]; extern const char *libgamepad_absolute_axis_names__[ #include "absolute-axis.count" ]; extern const char *libgamepad_relative_axis_names__[ #include "relative-axis.count" ]; int libgamepad_drain__(struct libgamepad_device *device);