summaryrefslogtreecommitdiff
path: root/engine/src/windowing.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-06-05 21:34:12 +0200
committerHampusM <hampus@hampusmat.com>2026-06-05 21:34:12 +0200
commitd9df85eb2a645f328a5ae9dcaa1ca75b787ef67e (patch)
treee0deaa9bd37105471f9d32203be3152e40560a30 /engine/src/windowing.rs
parentf587ceeda7b05f7eca4d5c06c6509cd529262cf0 (diff)
feat(engine): add support for text keyboard input
Diffstat (limited to 'engine/src/windowing.rs')
-rw-r--r--engine/src/windowing.rs22
1 files changed, 22 insertions, 0 deletions
diff --git a/engine/src/windowing.rs b/engine/src/windowing.rs
index 3163869..53e7bc3 100644
--- a/engine/src/windowing.rs
+++ b/engine/src/windowing.rs
@@ -58,6 +58,8 @@ const MESSAGE_FROM_APP_QUEUE_SIZE: usize = 512;
const MESSAGE_TO_APP_QUEUE_SIZE: usize = 16; // Increase if more messages are added
+const TEXT_KEY_QUEUE_SIZE: usize = 255;
+
static CONTEXT_CREATED: AtomicBool = AtomicBool::new(false);
declare_entity!(
@@ -181,6 +183,8 @@ fn update_stuff(
.load(Ordering::Relaxed)
.into();
+ keyboard.set_text_keys(iter_array_queue(&context.shared_state.text_keys));
+
let Context {
ref message_from_app_queue,
ref mut display_handle,
@@ -542,6 +546,7 @@ struct SharedState
{
relative_mouse_pos_delta: AtomicTwoF64,
absolute_mouse_pos: AtomicTwoF64,
+ text_keys: ArrayQueue<char>,
is_dropped: AtomicBool,
}
@@ -552,6 +557,7 @@ impl Default for SharedState
Self {
relative_mouse_pos_delta: AtomicTwoF64::new((0.0, 0.0)),
absolute_mouse_pos: AtomicTwoF64::new((0.0, 0.0)),
+ text_keys: ArrayQueue::new(TEXT_KEY_QUEUE_SIZE),
is_dropped: AtomicBool::new(false),
}
}
@@ -692,6 +698,22 @@ impl ApplicationHandler for App
event: keyboard_event,
is_synthetic: _,
} => {
+ if let Some(key_text) = keyboard_event
+ .text
+ .filter(|_| keyboard_event.state.is_pressed())
+ {
+ for character in key_text.chars() {
+ if self.shared_state.text_keys.is_full() {
+ cold_path();
+ tracing::warn!(
+ "Text key queue is full. Dropping oldest character"
+ );
+ }
+
+ self.shared_state.text_keys.force_push(character);
+ }
+ }
+
if keyboard_event.repeat {
return;
}