diff --git a/crates/ability/src/input/ime.rs b/crates/ability/src/input/ime.rs index 6b231cd..b83b34a 100644 --- a/crates/ability/src/input/ime.rs +++ b/crates/ability/src/input/ime.rs @@ -11,6 +11,7 @@ type ImeCallback = ( ThreadsafeFunction, ThreadsafeFunction, ThreadsafeFunction, + ThreadsafeFunction, ); pub fn ime_ts_fn(env: &Env, app: OpenHarmonyApp) -> Result { @@ -67,9 +68,27 @@ pub fn ime_ts_fn(env: &Env, app: OpenHarmonyApp) -> Result { .callee_handled::() .build()?; + let on_ime_enter_app = app.clone(); + let on_ime_enter_callback: Function = + env.create_function_from_closure("on_ime_enter_callback", move |ctx| { + let value = ctx.first_arg::().unwrap(); + if let Some(ref mut h) = *on_ime_enter_app.event_loop.borrow_mut() { + h(Event::Input(InputEvent::ImeEvent(ImeEvent::EnterEvent( + value, + )))) + } + Ok(()) + })?; + + let on_ime_enter_callback_tsfn = on_ime_enter_callback + .build_threadsafe_function() + .callee_handled::() + .build()?; + Ok(( insert_text_callback_tsfn, on_ime_hide_callback_tsfn, on_backspace_callback_tsfn, + on_ime_enter_callback_tsfn, )) } diff --git a/crates/ability/src/input/mod.rs b/crates/ability/src/input/mod.rs index 3c88e20..6243327 100644 --- a/crates/ability/src/input/mod.rs +++ b/crates/ability/src/input/mod.rs @@ -30,6 +30,7 @@ pub enum ImeEvent { TextInputEvent(TextInputEventData), BackspaceEvent(i32), ImeStatusEvent(KeyboardStatus), + EnterEvent(i32), } impl Debug for ImeEvent { @@ -38,6 +39,7 @@ impl Debug for ImeEvent { ImeEvent::TextInputEvent(data) => write!(f, "TextInputEvent: {:?}", data), ImeEvent::BackspaceEvent(len) => write!(f, "BackspaceEvent: delete length is {}", len), ImeEvent::ImeStatusEvent(status) => write!(f, "ImeStatusEvent: {:?}", status), + ImeEvent::EnterEvent(key) => write!(f, "EnterEvent: {:?}", key), } } } diff --git a/crates/ability/src/render/xcomponent.rs b/crates/ability/src/render/xcomponent.rs index eafffb6..b548eab 100644 --- a/crates/ability/src/render/xcomponent.rs +++ b/crates/ability/src/render/xcomponent.rs @@ -38,8 +38,12 @@ pub fn render( let insert_text_app = app.clone(); let redraw_app = app.clone(); - let (insert_text_callback_tsfn, on_ime_hide_callback_tsfn, on_backspace_callback_tsfn) = - input::ime_ts_fn(env, app.clone())?; + let ( + insert_text_callback_tsfn, + on_ime_hide_callback_tsfn, + on_backspace_callback_tsfn, + on_ime_enter_callback_tsfn, + ) = input::ime_ts_fn(env, app.clone())?; xcomponent.on_surface_created(move |xc_raw, win| { { @@ -72,6 +76,9 @@ pub fn render( b_ime.on_backspace(|len| { on_backspace_callback_tsfn.call(len, NonBlocking); }); + b_ime.on_enter(|key| { + on_ime_enter_callback_tsfn.call(key as i32, NonBlocking); + }); } {