diff --git a/window/src/os/windows/window.rs b/window/src/os/windows/window.rs index 69e516d14..adce38928 100644 --- a/window/src/os/windows/window.rs +++ b/window/src/os/windows/window.rs @@ -2068,14 +2068,19 @@ unsafe fn ime_set_context( wparam: WPARAM, lparam: LPARAM, ) -> Option { - let inner = rc_from_hwnd(hwnd)?; - let inner = inner.borrow_mut(); + let use_system_rendering = { + let inner = rc_from_hwnd(hwnd)?; + let inner = inner.borrow(); + inner.config.ime_preedit_rendering == ImePreeditRendering::System + }; - if inner.config.ime_preedit_rendering == ImePreeditRendering::System { + if use_system_rendering { return None; } - // Don't show system CompositionWindow because application itself draws it + // Don't show system CompositionWindow because application itself draws it. + // Note: DefWindowProcW may trigger other window messages, so we must + // release the borrow before calling it. let lparam = lparam & !(ISC_SHOWUICOMPOSITIONWINDOW as LPARAM); let result = DefWindowProcW(hwnd, msg, wparam, lparam); Some(result) @@ -2523,6 +2528,11 @@ unsafe fn key(hwnd: HWND, msg: UINT, wparam: WPARAM, lparam: LPARAM) -> Option