summaryrefslogtreecommitdiff
path: root/engine/src/windowing.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-08-15 19:39:11 +0200
committerHampusM <hampus@hampusmat.com>2026-08-15 20:53:37 +0200
commita2326683d263fcf930e68874df7e0165417fb419 (patch)
tree8d91937e00dc473807bbf415531eebcb44ef5a0a /engine/src/windowing.rs
parent068dadbbb0eccd9bbb8963e975ba22dd0738d859 (diff)
fix(engine): prevent ignored keyboard key input when main loop is slowHEADmaster
Diffstat (limited to 'engine/src/windowing.rs')
-rw-r--r--engine/src/windowing.rs35
1 files changed, 27 insertions, 8 deletions
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 } => {
{