#input #input-event #winit #state #helper #mouse-input #cache

winit_input_helper

Processes winit events, allowing input state to be queried at any time

27 releases (15 breaking)

0.16.0 Mar 4, 2024
0.15.1 Nov 12, 2023
0.14.1 Mar 25, 2023
0.13.0 Aug 1, 2022
0.2.0 Nov 8, 2018

#78 in GUI

Download history 1061/week @ 2024-08-18 1263/week @ 2024-08-25 1213/week @ 2024-09-01 1152/week @ 2024-09-08 996/week @ 2024-09-15 1545/week @ 2024-09-22 1352/week @ 2024-09-29 446/week @ 2024-10-06 899/week @ 2024-10-13 882/week @ 2024-10-20 1083/week @ 2024-10-27 847/week @ 2024-11-03 414/week @ 2024-11-10 658/week @ 2024-11-17 1034/week @ 2024-11-24 969/week @ 2024-12-01

3,122 downloads per month
Used in 55 crates (44 directly)

MIT license

28KB
446 lines

Winit Input Helper

Crates.io Docs

Processes and stores winit events, allowing input state to be queried at any time.

How to use

Each event is passed to the WinitInputHelper via the update method.

The current input state can then be accessed via methods such as key_pressed, key_released, key_held, mouse, mouse_diff etc.

To see all available methods look at docs.rs

use winit::event_loop::EventLoop;
use winit::keyboard::{Key, KeyCode};
use winit::window::WindowBuilder;
use winit_input_helper::WinitInputHelper;

fn main() {
    let mut input = WinitInputHelper::new();

    let event_loop = EventLoop::new().unwrap();
    let _window = WindowBuilder::new().build(&event_loop).unwrap();

    event_loop
        .run(move |event, elwt| {
            // Pass every event to the WinitInputHelper.
            // It will return true when the last event has been processed and it is time to run your application logic.
            if input.update(&event) {
                if input.key_released(KeyCode::KeyQ) || input.close_requested() || input.destroyed()
                {
                    elwt.exit();
                    return;
                }

                if input.key_pressed(KeyCode::KeyW) {
                    println!("The 'W' key (US layout) was pressed on the keyboard");
                }

                if input.key_held(KeyCode::KeyR) {
                    println!("The 'R' key (US layout) key is held");
                }

                // query the change in cursor this update
                let cursor_diff = input.cursor_diff();
                if cursor_diff != (0.0, 0.0) {
                    println!("The cursor diff is: {:?}", cursor_diff);
                    println!("The cursor position is: {:?}", input.cursor());
                }

                // You are expected to control your own timing within this block.
                // Usually via rendering with vsync.
                // render();
            }
        })
        .unwrap();
}

Publishing a new version

In order to avoid forcing the user to enable the default winit backends, winit_input_helper sets its winit dependency to default-features = false. This complicates the publishing procedure a little because winit cannot compile without any backends enabled.

So to publish we run: cargo publish --features winit/default

Dependencies

~2–19MB
~227K SLoC