-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
flush ButtonInput<KeyCode> cache when Bevy window loses focus #12878
Conversation
Welcome, new contributor! Please make sure you've read our contributing guide and we look forward to reviewing your pull request shortly ✨ |
f619d02
to
6d360c1
Compare
This helps avoiding stuck key presses after switching from and then back to Bevy
6d360c1
to
9200f2c
Compare
It looks like your PR is a breaking change, but you didn't provide a migration guide. Could you add some context on what users should update when this change get released in a new version of Bevy? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've run into this bug before and found it quite frustrating. I think this is a good fix that should result in consistent cross-platform behavior.
Not sure if this is related, but when I run debug builds, I seem to get random keys starting in the pressed state (e.g. A general purpose flush like this PR I think would be welcome as a catch-all for |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks good, but should be merged after the 0.30 pr to avoid conflicting with that pr.
Unblocked |
@gavlig could you resolve the conflicts or do you need help for that? Worst case if they're too hard, you can open a new PR with the same changes |
I'll adopt this tomorrow and resolve the merge conflicts. |
This was adopted from #12878. I rebased the changes resolved the following merge conflicts: - moved over the changes originally done in bevy_winit/src/lib.rs's `handle_winit_event` into bevy_winit/src/state.rs's `window_event` function - moved WinitEvent::KeyboardFocusLost event forwarding originally done in bevy_winit/src/winit_event.rs to the equivalent in bevy_winit/src/state.rs Tested this by following the modified keyboard_input example from the original PR. First, I verified I could reproduce the issue without the changes. Then, after applying the changes, I verified that when I Alt+Tabbed away from the running example that the log showed I released Alt and when I tabbed back it didn't behave like Alt was stuck. The following is from the original pull request by @gavlig # Objective This helps avoiding stuck key presses after switching from and back to Bevy window. Key press event gets stuck because window loses focus before receiving a key release event thus we end up with false positive in ButtonInput. ## Solution I saw two ways to fix this: 1. add bevy_window as dependency and read WindowFocus events 2. add a KeyboardFocusLost event specifically for this. I chose the latter because adding another dependency felt wrong, but if that is more preferable changing this pr won't be a problem. Also if someone sees another way please let me know. To test the bug use this small modification over examples/keyboard_input.rs: (it will work only if you have Alt-Tab combination for switching between windows in your OS, otherwise change AltLeft accordingly) ``` //! Demonstrates handling a key press/release. use bevy::{prelude::*, input::keyboard::KeyboardInput}; fn main() { App::new() .add_plugins(DefaultPlugins) .add_systems(Update, keyboard_input_system) .run(); } /// This system prints 'Alt' key state fn keyboard_input_system(keyboard_input: Res<ButtonInput<KeyCode>>, mut keyboard_input_events: EventReader<KeyboardInput>) { for event in keyboard_input_events.read() { info!("{:?}", event); } if keyboard_input.pressed(KeyCode::AltLeft) { info!("'Alt' currently pressed"); } if keyboard_input.just_pressed(KeyCode::AltLeft) { info!("'Alt' just pressed"); } if keyboard_input.just_released(KeyCode::AltLeft) { info!("'Alt' just released"); } } ``` Here i made a quick video with demo of the fix: https://youtu.be/qTvUCk4IHvo In first part i press Alt and Alt+Tab to switch back and forth from example app, logs will indicate that too. In second part I applied fix and you'll see that Alt will no longer be pressed when window gets unfocused ## Migration Guide `WinitEvent` has a new enum variant: `WinitEvent::KeyboardFocusLost`. Co-authored-by: gavlig <[email protected]>
Thank you for handling this and for all your work on Bevy! Should I close this pr or will it be closed automatically? |
Objective
This helps avoiding stuck key presses after switching from and back to Bevy window. Key press event gets stuck because window loses focus before receiving a key release event thus we end up with false positive in ButtonInput.
Solution
I saw two ways to fix this:
I chose the latter because adding another dependency felt wrong, but if that is more preferable changing this pr won't be a problem. Also if someone sees another way please let me know.
To test the bug use this small modification over examples/keyboard_input.rs:
(it will work only if you have Alt-Tab combination for switching between windows in your OS, otherwise change AltLeft accordingly)
Here i made a quick video with demo of the fix: https://youtu.be/qTvUCk4IHvo
In first part i press Alt and Alt+Tab to switch back and forth from example app, logs will indicate that too. In second part I applied fix and you'll see that Alt will no longer be pressed when window gets unfocused
Migration Guide
WinitEvent
has a new enum variant:WinitEvent::KeyboardFocusLost
.