ime for text input

This commit is contained in:
Mona Mayrhofer 2026-03-03 14:11:50 +01:00
parent a2b086a779
commit 5f89601ef2
WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
GPG key ID: 374AB152BDEBA1AE
10 changed files with 784 additions and 48 deletions

View file

@ -64,7 +64,6 @@ pub fn MouseArea() -> Element {
});
let key_down_handler = use_callback(move |evt: Event<KeyboardData>| {
tracing::info!("Keydown");
spawn(async move {
_ = socket
.send(ClientEvent::KeyEvent {
@ -75,12 +74,49 @@ pub fn MouseArea() -> Element {
});
});
let key_up_handler = use_callback(move |evt: Event<KeyboardData>| {
// let key_up_handler = use_callback(move |evt: Event<KeyboardData>| {
// spawn(async move {
// _ = socket
// .send(ClientEvent::KeyEvent {
// key: evt.key().to_string(),
// is_pressed: false,
// })
// .await;
// });
// });
let mut input_state = use_signal(String::new);
let input_handler = use_callback(move |evt: Event<FormData>| {
let v = evt.value();
input_state.set(v.clone());
spawn(async move {
_ = socket.send(ClientEvent::TextInputEvent { text: v }).await;
});
});
let key_press_handler = use_callback(move |evt: Event<KeyboardData>| {
if evt.key() == Key::Enter {
spawn(async move {
_ = socket
.send(ClientEvent::TextInputDoneEvent {
text: input_state.replace(String::new()),
})
.await;
});
}
});
let input_focus_handler = use_callback(move |evt: Event<FocusData>| {
input_state.set(String::new());
spawn(async move {
_ = socket.send(ClientEvent::TextInputStartEvent).await;
});
});
let input_blur_handler = use_callback(move |evt: Event<FocusData>| {
spawn(async move {
_ = socket
.send(ClientEvent::KeyEvent {
key: evt.key().to_string(),
is_pressed: false,
.send(ClientEvent::TextInputDoneEvent {
text: input_state.replace(String::new()),
})
.await;
});
@ -88,7 +124,12 @@ pub fn MouseArea() -> Element {
rsx! {
div {
input { onkeydown: key_down_handler, onkeyup: key_up_handler}
input {
oninput: input_handler,
value: input_state,
onkeypress: key_press_handler,
onfocus: input_focus_handler,
onblur: input_blur_handler }
div {
class: Styles::mouse_area,
@ -105,6 +146,9 @@ enum ClientEvent {
MouseMove { dx: f64, dy: f64 },
Click,
KeyEvent { key: String, is_pressed: bool },
TextInputStartEvent,
TextInputEvent { text: String },
TextInputDoneEvent { text: String },
}
#[derive(Serialize, Deserialize, Debug)]
@ -131,6 +175,15 @@ async fn mouse_move(
ClientEvent::KeyEvent { key, is_pressed } => {
mouse_service.key_event(key, is_pressed).await;
},
ClientEvent::TextInputEvent { text } => {
mouse_service.text_input(text).await;
},
ClientEvent::TextInputStartEvent => {
mouse_service.text_input_start().await;
},
ClientEvent::TextInputDoneEvent { text } => {
mouse_service.text_input_end(text).await;
},
}
}
}))