int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ) { int i; // Is joystick present? if( !_glfwJoy[ joy ].Present ) { return 0; } // Update joystick state _glfwPollJoystickEvents(); // Does the joystick support less buttons than requested? if( _glfwJoy[ joy ].NumButtons < numbuttons ) { numbuttons = _glfwJoy[ joy ].NumButtons; } // Copy button states from internal state for( i = 0; i < numbuttons; ++ i ) { buttons[ i ] = _glfwJoy[ joy ].Button[ i ]; } return numbuttons; }
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) { int i; // Is joystick present? if( !_glfwJoy[ joy ].Present ) { return 0; } // Update joystick state _glfwPollJoystickEvents(); // Does the joystick support less axes than requested? if( _glfwJoy[ joy ].NumAxes < numaxes ) { numaxes = _glfwJoy[ joy ].NumAxes; } // Copy axis positions from internal state for( i = 0; i < numaxes; ++ i ) { pos[ i ] = _glfwJoy[ joy ].Axis[ i ]; } return numaxes; }
// Polls for and processes events the specified joystick // static GLFWbool pollJoystickEvents(_GLFWjoystickLinux* js) { #if defined(__linux__) _glfwPollJoystickEvents(); if (!js->present) return GLFW_FALSE; // Read all queued events (non-blocking) for (;;) { struct js_event e; errno = 0; if (read(js->fd, &e, sizeof(e)) < 0) { // Reset the joystick slot if the device was disconnected if (errno == ENODEV) { free(js->axes); free(js->buttons); free(js->name); free(js->path); memset(js, 0, sizeof(_GLFWjoystickLinux)); _glfwInputJoystickChange(js - _glfw.linux_js.js, GLFW_DISCONNECTED); } break; } // Clear the initial-state bit e.type &= ~JS_EVENT_INIT; if (e.type == JS_EVENT_AXIS) js->axes[e.number] = (float) e.value / 32767.0f; else if (e.type == JS_EVENT_BUTTON) js->buttons[e.number] = e.value ? GLFW_PRESS : GLFW_RELEASE; } #endif // __linux__ return js->present; }