Currently, the OS-specific API is used for all controllers. However, on Windows, this means only Xbox 360 controllers. And on Linux, it means the kernel does some remapping to make it an evdev device, which we then have to undo and map back to the original buttons.

Investigate whether this can be worked around by implementing the USB HID protocol directly. This might also make controllers portable between OSes, as the HID descriptor would be the same, no matter which OS, and only the talking to a HID device part needs to be abstracted then.