![]() # Objective Defocusing a window while a key is held (such as when Alt+tabbing), will currently send a key release on X11 and Windows. This is likely the behavior that most people expect. However it's synthetic events from winit are unimplemented for WASM and some other platforms. (See https://github.com/rust-windowing/winit/issues/1272). While we can implement it upstream, there is also some doubt about the synthetic events API as a whole (https://github.com/rust-windowing/winit/issues/3543), so I propose to do it in bevy directly for now. ## Solution This PR implements key tracking in bevy directly so we can synthesize our own key release events across all platforms. Note regarding X11 specifically: - On `main`, pressing a keyboard shortcut to unfocus the window (`Ctrl + Super + ArrowRight` in my case) will yield the following events: ``` Pressed Control Pressed Super Released Control Released ArrowRight Released Super ``` - On this branch, it will yield the following sequence: ``` Pressed Control Pressed Super Released Control Released Super ``` To me the behavior of this branch is more expected than `main`, because `main` produces an `ArrowRight` release without producing a press first. ## Testing Tested in WASM and X11 with ```rust App::new() .add_plugins(DefaultPlugins) .add_systems(Update, |mut keys: EventReader<KeyboardInput>| { for ev in keys.read() { error!("received {ev:?}"); } }) .run(); ``` |
||
---|---|---|
.. | ||
src | ||
Cargo.toml | ||
LICENSE-APACHE | ||
LICENSE-MIT | ||
README.md |