From d3ded8c677b25237aee8d4951c6da347684c4266 Mon Sep 17 00:00:00 2001 From: Ege Gungordu Date: Tue, 23 Jan 2024 18:31:14 +0300 Subject: [PATCH] add isComposing support of KeyboardEvent --- packages/html/src/events/keyboard.rs | 18 ++++++++++++++++++ packages/html/src/web_sys_bind/events.rs | 4 ++++ packages/interpreter/src/interpreter.js | 2 ++ packages/rink/src/hooks.rs | 2 ++ 4 files changed, 26 insertions(+) diff --git a/packages/html/src/events/keyboard.rs b/packages/html/src/events/keyboard.rs index feb0ab313..1dac40d1c 100644 --- a/packages/html/src/events/keyboard.rs +++ b/packages/html/src/events/keyboard.rs @@ -33,6 +33,7 @@ impl std::fmt::Debug for KeyboardData { .field("modifiers", &self.modifiers()) .field("location", &self.location()) .field("is_auto_repeating", &self.is_auto_repeating()) + .field("is_composing", &self.is_composing()) .finish() } } @@ -44,6 +45,7 @@ impl PartialEq for KeyboardData { && self.modifiers() == other.modifiers() && self.location() == other.location() && self.is_auto_repeating() == other.is_auto_repeating() + && self.is_composing() == other.is_composing() } } @@ -75,6 +77,11 @@ impl KeyboardData { self.inner.is_auto_repeating() } + /// Indicates whether the key is fired within a composition session. + pub fn is_composing(&self) -> bool { + self.inner.is_composing() + } + /// Downcast this KeyboardData to a concrete type. pub fn downcast(&self) -> Option<&T> { self.inner.as_any().downcast_ref::() @@ -92,6 +99,7 @@ impl ModifiersInteraction for KeyboardData { #[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq, Clone)] pub struct SerializedKeyboardData { char_code: u32, + is_composing: bool, key: String, key_code: KeyCode, #[serde(deserialize_with = "resilient_deserialize_code")] @@ -114,9 +122,11 @@ impl SerializedKeyboardData { location: Location, is_auto_repeating: bool, modifiers: Modifiers, + is_composing: bool, ) -> Self { Self { char_code: key.legacy_charcode(), + is_composing, key: key.to_string(), key_code: KeyCode::from_raw_code( std::convert::TryInto::try_into(key.legacy_keycode()) @@ -144,6 +154,7 @@ impl From<&KeyboardData> for SerializedKeyboardData { data.location(), data.is_auto_repeating(), data.modifiers(), + data.is_composing(), ) } } @@ -166,6 +177,10 @@ impl HasKeyboardData for SerializedKeyboardData { self.repeat } + fn is_composing(&self) -> bool { + self.is_composing + } + fn as_any(&self) -> &dyn std::any::Any { self } @@ -236,6 +251,9 @@ pub trait HasKeyboardData: ModifiersInteraction + std::any::Any { /// `true` iff the key is being held down such that it is automatically repeating. fn is_auto_repeating(&self) -> bool; + /// Indicates whether the key is fired within a composition session. + fn is_composing(&self) -> bool; + /// return self as Any fn as_any(&self) -> &dyn std::any::Any; } diff --git a/packages/html/src/web_sys_bind/events.rs b/packages/html/src/web_sys_bind/events.rs index 40d14f28b..f5fb84760 100644 --- a/packages/html/src/web_sys_bind/events.rs +++ b/packages/html/src/web_sys_bind/events.rs @@ -78,6 +78,10 @@ impl HasKeyboardData for KeyboardEvent { self.repeat() } + fn is_composing(&self) -> bool { + self.is_composing() + } + fn as_any(&self) -> &dyn std::any::Any { self } diff --git a/packages/interpreter/src/interpreter.js b/packages/interpreter/src/interpreter.js index c8384a8b7..0e9800645 100644 --- a/packages/interpreter/src/interpreter.js +++ b/packages/interpreter/src/interpreter.js @@ -351,6 +351,7 @@ async function serialize_event(event) { case "keyup": { let { charCode, + isComposing, key, altKey, ctrlKey, @@ -364,6 +365,7 @@ async function serialize_event(event) { } = event; return { char_code: charCode, + is_composing: isComposing, key: key, alt_key: altKey, ctrl_key: ctrlKey, diff --git a/packages/rink/src/hooks.rs b/packages/rink/src/hooks.rs index d519273f0..81f6558b6 100644 --- a/packages/rink/src/hooks.rs +++ b/packages/rink/src/hooks.rs @@ -179,6 +179,7 @@ impl InnerInputState { k.location(), is_repeating, k.modifiers(), + k.is_composing(), ); } @@ -779,6 +780,7 @@ fn translate_key_event(event: crossterm::event::KeyEvent) -> Option { Location::Standard, false, modifiers, + false, ))) }