diff --git a/crates/eframe/src/web/app_runner.rs b/crates/eframe/src/web/app_runner.rs
index f913e9b6d..3364d83ce 100644
--- a/crates/eframe/src/web/app_runner.rs
+++ b/crates/eframe/src/web/app_runner.rs
@@ -394,7 +394,10 @@ impl AppRunner {
if self.has_focus() {
// The eframe app has focus.
- if ime.is_some() {
+ if let Some(ime) = ime {
+ if ime.should_interrupt_composition {
+ self.text_agent.interrupt_ime_composition();
+ }
// We are editing text: give the focus to the text agent.
self.text_agent.focus();
} else {
@@ -406,7 +409,7 @@ impl AppRunner {
if let Err(err) = self
.text_agent
- .move_to(ime, self.canvas(), self.egui_ctx.zoom_factor())
+ .update(ime, self.canvas(), self.egui_ctx.zoom_factor())
{
log::error!(
"failed to update text agent position: {}",
diff --git a/crates/eframe/src/web/events.rs b/crates/eframe/src/web/events.rs
index 326ba1556..f9d992c2f 100644
--- a/crates/eframe/src/web/events.rs
+++ b/crates/eframe/src/web/events.rs
@@ -190,11 +190,6 @@ pub(crate) fn on_keydown(event: web_sys::KeyboardEvent, runner: &mut AppRunner)
return;
}
- if event.is_composing() || event.key_code() == 229 {
- // https://web.archive.org/web/20200526195704/https://www.fxsitecompat.dev/en-CA/docs/2018/keydown-and-keyup-events-are-now-fired-during-ime-composition/
- return;
- }
-
let modifiers = modifiers_from_kb_event(&event);
runner.input.set_modifiers(modifiers);
diff --git a/crates/eframe/src/web/text_agent.rs b/crates/eframe/src/web/text_agent.rs
index d8d6b672e..b80882769 100644
--- a/crates/eframe/src/web/text_agent.rs
+++ b/crates/eframe/src/web/text_agent.rs
@@ -1,7 +1,7 @@
//! The text agent is a hidden `` element used to capture
//! IME and mobile keyboard input events.
-use std::cell::Cell;
+use std::{cell::RefCell, rc::Rc};
use wasm_bindgen::prelude::*;
@@ -9,7 +9,7 @@ use super::{AppRunner, WebRunner};
pub struct TextAgent {
input: web_sys::HtmlInputElement,
- prev_ime_output: Cell