Expand description
GilRs - Game Input Library for Rust
GilRs abstract platform specific APIs to provide unified interfaces for working with gamepads.
Main features:
- Unified gamepad layout—buttons and axes are represented by familiar names
- Support for SDL2 mappings including
SDL_GAMECONTROLLERCONFIG
environment variable which Steam uses - Hotplugging—GilRs will try to assign new IDs for new gamepads and reuse same ID for gamepads which reconnected
- Force feedback (rumble)
- Power information (is gamepad wired, current battery status)
Example
use gilrs::{Gilrs, Button, Event};
let mut gilrs = Gilrs::new().unwrap();
// Iterate over all connected gamepads
for (_id, gamepad) in gilrs.gamepads() {
println!("{} is {:?}", gamepad.name(), gamepad.power_info());
}
let mut active_gamepad = None;
loop {
// Examine new events
while let Some(Event { id, event, time }) = gilrs.next_event() {
println!("{:?} New event from {}: {:?}", time, id, event);
active_gamepad = Some(id);
}
// You can also use cached gamepad state
if let Some(gamepad) = active_gamepad.map(|id| gilrs.gamepad(id)) {
if gamepad.is_pressed(Button::South) {
println!("Button South is pressed (XBox - A, PS - X)");
}
}
}
Supported features
Input | Hotplugging | Force feedback | |
---|---|---|---|
Linux/BSD (evdev) | ✓ | ✓ | ✓ |
Windows (XInput) | ✓ | ✓ | ✓ |
OS X | ✓ | ✓ | ✕ |
Wasm | ✓ | ✓ | n/a |
Android | ✕ | ✕ | ✕ |
Controller layout
Mappings
GilRs use SDL-compatible controller mappings to fix on Linux legacy drivers that doesn’t follow
Linux Gamepad API and to provide
unified button layout for platforms that doesn’t make any guarantees about it. The main source
is SDL_GameControllerDB, but library also
support loading mappings from environment variable SDL_GAMECONTROLLERCONFIG
(which Steam
use).
Cargo features
serde-serialize
- enable deriving of serde’sSerialize
andDeserialize
for various types.
Platform specific notes
Linux/BSD (evdev)
With evdev, GilRs read (and write, in case of force feedback) directly from appropriate
/dev/input/event*
file. This mean that user have to have read and write access to this file.
On most distros it shouldn’t be a problem, but if it is, you will have to create udev rule.
On FreeBSD generic HID gamepads use hgame(4) and special use Linux driver via webcamd
.
To build GilRs, you will need pkg-config and libudev .pc file. On some distributions this file
is packaged in separate archive (e.g., libudev-dev
in Debian, libudev-devd
in FreeBSD).
Wasm
Wasm implementation uses stdweb, or wasm-bindgen with the wasm-bindgen feature.
For stdweb, you will need cargo-web to build gilrs for
wasm32-unknown-unknown. For wasm-bindgen, you will need the wasm-bindgen cli or a tool like
wasm-pack.
Unlike other platforms, events are only generated when you call Gilrs::next_event()
.
Re-exports
pub use crate::ev::filter::Filter;
pub use crate::ev::Axis;
pub use crate::ev::Button;
pub use crate::ev::Event;
pub use crate::ev::EventType;
Modules
- Gamepad state and other event related functionality.
- Force feedback module.
Structs
- Iterator over all connected gamepads.
- Represents handle to game controller.
- Gamepad ID.
- Main object responsible of managing gamepads.
- Allow to create
Gilrs
with customized behaviour. - Stores data used to map gamepad buttons and axes.
Enums
- Error type which can be returned when creating
Gilrs
. - The error type for functions related to gamepad mapping.
- Source of gamepad mappings.
- State of device’s power supply.