From a2326683d263fcf930e68874df7e0165417fb419 Mon Sep 17 00:00:00 2001 From: HampusM Date: Sat, 15 Aug 2026 19:39:11 +0200 Subject: fix(engine): prevent ignored keyboard key input when main loop is slow --- engine/src/windowing.rs | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'engine/src/windowing.rs') diff --git a/engine/src/windowing.rs b/engine/src/windowing.rs index 4279148..aa86f01 100644 --- a/engine/src/windowing.rs +++ b/engine/src/windowing.rs @@ -31,6 +31,7 @@ use crate::ecs::phase::{Phase, PRE_UPDATE as PRE_UPDATE_PHASE}; use crate::ecs::sole::Single; use crate::ecs::system::observer::Observe; use crate::ecs::uid::Uid; +use crate::ecs::util::StreamingIterator; use crate::ecs::{declare_entity, pair, Query, Sole}; use crate::util::{BitArray, MapVec}; use crate::vector::Vec2; @@ -207,21 +208,41 @@ fn update_stuff( mouse_button_input.flags.clear(); } - for (key_index, key_state_bits) in input.keys.iter_occupied() { - let key = Key::KEYS[key_index]; + let mut key_updates = input.keys.iter_occupied_mut(); - let key_state = match key_state_bits { + while let Some(mut key_item) = key_updates.streaming_next() { + let key = Key::KEYS[key_item.index]; + + if key_item.bits == KEY_PRESSED_BITS | KEY_RELEASED_BITS { + match keyboard.get_key_state(key) { + KeyState::Pressed => { + keyboard.set_key_state(key, KeyState::Released); + + key_item.clear_and_set(KEY_PRESSED_BITS, u8::MAX); + } + KeyState::Released => { + keyboard.set_key_state(key, KeyState::Pressed); + + key_item.clear_and_set(KEY_RELEASED_BITS, u8::MAX); + } + } + + continue; + } + + let key_state = match key_item.bits { KEY_PRESSED_BITS => KeyState::Pressed, KEY_RELEASED_BITS => KeyState::Released, _ => unreachable!(), }; keyboard.set_key_state(key, key_state); + + key_item.clear_and_set(0, u8::MAX); } input.relative_mouse_pos_delta = Vec2 { x: 0.0, y: 0.0 }; input.mouse_scroll_delta = MouseScrollDelta { vert_lines: 0.0, hor_lines: 0.0 }; - input.keys.clear(); }; keyboard.set_text_keys(iter_array_queue(&context.shared_state.text_keys)); @@ -776,7 +797,7 @@ struct MouseButtonFlags: u8 const BITS_PER_KEY: usize = 2; -const KEY_PRESSED_BITS: u8 = 0b11; +const KEY_PRESSED_BITS: u8 = 0b10; const KEY_RELEASED_BITS: u8 = 0b01; #[derive(Debug)] @@ -1005,9 +1026,7 @@ impl ApplicationHandler for App KeyState::Released => KEY_RELEASED_BITS, }; - input - .keys - .clear_and_set(key as usize, key_state_bits, u8::MAX); + input.keys.clear_and_set(key as usize, key_state_bits, 0); } WindowEvent::CursorMoved { device_id: _, position } => { { -- cgit v1.2.3-18-g5258