diff --git a/CHANGELOG.md b/CHANGELOG.md index f2ad6446..9990cdbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ And please only add new entries to the top of this list, right below the `# Unre - On Wayland, a new `wayland-csd-adwaita-crossfont` feature was added to use `crossfont` instead of `ab_glyph` for decorations. - On Wayland, if not otherwise specified use upstream automatic CSD theme selection. - On X11, added `WindowExtX11::with_parent` to create child windows. +- On X11, fixed IME crashing during reload. # 0.27.3 diff --git a/src/platform_impl/linux/x11/ime/callbacks.rs b/src/platform_impl/linux/x11/ime/callbacks.rs index 1f6bc23b..5fa60770 100644 --- a/src/platform_impl/linux/x11/ime/callbacks.rs +++ b/src/platform_impl/linux/x11/ime/callbacks.rs @@ -108,10 +108,21 @@ unsafe fn replace_im(inner: *mut ImeInner) -> Result<(), ReplaceImError> { let mut new_contexts = HashMap::new(); for (window, old_context) in (*inner).contexts.iter() { let spot = old_context.as_ref().map(|old_context| old_context.ic_spot); - let style = old_context + + // Check if the IME was allowed on that context. + let is_allowed = old_context .as_ref() - .map(|old_context| old_context.style) + .map(|old_context| old_context.is_allowed()) .unwrap_or_default(); + + // We can't use the style from the old context here, since it may change on reload, so + // pick style from the new XIM based on the old state. + let style = if is_allowed { + new_im.preedit_style + } else { + new_im.none_style + }; + let new_context = { let result = ImeContext::new( xconn,