Преглед на файлове

Merge pull request #1863 from egegungordu/is-composing-support

Add `isComposing` support
Jonathan Kelley преди 1 година
родител
ревизия
b1921cf17d

+ 4 - 1
packages/desktop/headless_tests/events.rs

@@ -154,7 +154,7 @@ fn app(cx: Scope) -> Element {
         ctrlKey: false,
         metaKey: false,
         shiftKey: false,
-        isComposing: false,
+        isComposing: true,
         which: 65,
         bubbles: true,
         })"#,
@@ -356,6 +356,7 @@ fn app(cx: Scope) -> Element {
                     assert_eq!(event.data.code().to_string(), "KeyA");
                     assert_eq!(event.data.location(), Location::Standard);
                     assert!(event.data.is_auto_repeating());
+                    assert!(event.data.is_composing());
                     received_events.modify(|x| *x + 1)
                 }
             }
@@ -368,6 +369,7 @@ fn app(cx: Scope) -> Element {
                     assert_eq!(event.data.code().to_string(), "KeyA");
                     assert_eq!(event.data.location(), Location::Standard);
                     assert!(!event.data.is_auto_repeating());
+                    assert!(!event.data.is_composing());
                     received_events.modify(|x| *x + 1)
                 }
             }
@@ -380,6 +382,7 @@ fn app(cx: Scope) -> Element {
                     assert_eq!(event.data.code().to_string(), "KeyA");
                     assert_eq!(event.data.location(), Location::Standard);
                     assert!(!event.data.is_auto_repeating());
+                    assert!(!event.data.is_composing());
                     received_events.modify(|x| *x + 1)
                 }
             }

+ 18 - 0
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<T: 'static>(&self) -> Option<&T> {
         self.inner.as_any().downcast_ref::<T>()
@@ -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;
 }

+ 4 - 0
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
     }

+ 2 - 0
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,

+ 2 - 0
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<EventData> {
         Location::Standard,
         false,
         modifiers,
+        false,
     )))
 }