#input #keyboard #mouse #touch

buttons

A simple API for storing and querying input state

6 releases (breaking)

0.5.0 Jul 22, 2023
0.4.0 Nov 14, 2022
0.3.1 Dec 23, 2020
0.2.0 Jul 12, 2020
0.1.0 Jan 1, 2019

#541 in Game dev

38 downloads per month

CC0 license

31KB
755 lines

buttons

Crates.io Docs.rs

A simple Rust crate for managing and querying input state.

Usage

With winit

(Enabling the winit feature.)

let mut event_loop = winit::event_loop::EventLoop::new();
let mut keyboard = buttons::winit::keyboard();
let mut mouse = buttons::winit::mouse();
let mut touch = buttons::winit::touch();

// Track input
event_loop.run(move |event, _, _| {
    keyboard.handle_event(&event);
    mouse.handle_event(&event);
    touch.handle_event(&event);

    // Check state
    if keyboard.pressed(VirtualKeyCode::Escape)
        || mouse.released(MouseButton::Right)
        || touch.first_touch().is_some()
    {
        // Do something
    }
});

lib.rs:

This is simple Rust crate for managing and querying input state.

It treats the mouse and keyboard as an immutable data structure that you can query to find which keys and buttons are pressed (or where the pointer is).

The core data structures of Mouse and Keyboard are generic, in theory supporting multiple windowing libraries. You can roll your own, or you can enable the winit which has factory methods to easily create a Mouse and Keyboard which work with the winit library.

As stated, the mouse and keyboard are immutable. To track input changes, each provide a begin_frame_input method which return an object you can make changes to for the frame.

Examples

let mut event_loop = winit::event_loop::EventLoop::new();
let mut keyboard = buttons::support::winit::keyboard();
let mut mouse = buttons::support::winit::mouse();
let mut touch = buttons::support::winit::touch();

// Track input
event_loop.run(move |event, _, _| {
    keyboard.handle_event(&event);
    mouse.handle_event(&event);
    touch.handle_event(&event);

    // Check state
    if keyboard.pressed(VirtualKeyCode::Escape)
        || mouse.released(MouseButton::Right)
        || touch.first_touch().is_some()
    {
        // Do something
    }
});

Dependencies

~2–16MB
~169K SLoC