New crate for input event data: `event_types`

104 points reinis-mazeiks

Docs

I noticed that Rust has a lot of competing frameworks for GUIs. Many of them define their own event types, and many of them don't get it quite right imo. So I made a small, (hopefully) re-usable and idiomatic crate with some user input event types to be adopted in your GUI framework.

use euclid::num::Zero;
use keyboard_types::Modifiers;
use event_types::event_data::PointerDown;
use event_types::*;

// Your library can construct event data
let pointer_data = PointerProperties::builder()
    .coordinates(Coordinates::zero())
    .held_buttons(PointerButton::Primary)
    .id(PointerId(0))
    .pointer_type(PointerType::Mouse)
    .is_primary(true)
    .build();
let event_data = PointerDown::new(pointer_data, Modifiers::SHIFT, PointerButton::Primary, 1);

// So that your users can get info about input events
dbg!(event_data.button_pressed());
dbg!(event_data.pointer());
dbg!(event_data.modifiers());

It currently includes some pointer event data (which can be used to represent mouse, stylus and touch events in a general way), wheel event data, and keyboard event data. You would wrap these event data in your own Event type.

why i think my crate is good:

  • Meaningful types, nothing stringly typed (or intly typed)
  • Data organized in a way that makes sense (instead of putting everything in 1 flat structure like JS)
  • Existing crates leveraged to solve common problems (e.g. \euclid\\ for geometry primitives)
  • As I was writing it, I consulted the W3C event specs. They've captured a lot of knowledge on what kinds of data we need to track for a flexible solution.
  • blazin fast (especially the enums 🚀🚀 ofc)

The crate is based on some code I previously wrote for Dioxus, an amazing GUI framework.

Docs | Crate | Repo