From 90054614c241375839571d4dd2145edcb65257a6 Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Sun, 21 Apr 2024 15:23:10 +0400 Subject: Fix IME preview overlapping text Fix incorrect usage of the `flags` when drawing the preedit resulting in setting the `flags`, but not actually reading the value back. The logic to skip things was also used incorrectly, because the renderer does that already based on the `WIDE_CHAR` flag on the cell. Fixes: 67a433ceed (Skip whitespaces for wide chars in preedit) --- CHANGELOG.md | 9 +++++---- alacritty/src/renderer/mod.rs | 31 +++++++++++++++---------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6b301e2..b41ed24f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,14 +10,15 @@ Notable changes to the `alacritty_terminal` crate are documented in its ## 0.14.0-dev +### Changed + +- Pressing `Alt` with unicode input will now add `ESC` like for ASCII input + ### Fixed - Crash when trying to create a new tab without decorations enabled - New window being treated as focused when it's not on Wayland - -### Changed - -- Pressing `Alt` with unicode input will now add `ESC` like for ASCII input +- IME preview blending into text below it ## 0.13.2 diff --git a/alacritty/src/renderer/mod.rs b/alacritty/src/renderer/mod.rs index 02bfd762..f4f1397f 100644 --- a/alacritty/src/renderer/mod.rs +++ b/alacritty/src/renderer/mod.rs @@ -205,30 +205,29 @@ impl Renderer { size_info: &SizeInfo, glyph_cache: &mut GlyphCache, ) { - let mut skip_next = false; - let cells = string_chars.enumerate().filter_map(|(i, character)| { - if skip_next { - skip_next = false; - return None; - } - - let mut flags = Flags::empty(); - if character.width() == Some(2) { - flags.insert(Flags::WIDE_CHAR); - // Wide character is always followed by a spacer, so skip it. - skip_next = true; - } + let mut wide_char_spacer = false; + let cells = string_chars.enumerate().map(|(i, character)| { + let flags = if wide_char_spacer { + wide_char_spacer = false; + Flags::WIDE_CHAR_SPACER + } else if character.width() == Some(2) { + // The spacer is always following the wide char. + wide_char_spacer = true; + Flags::WIDE_CHAR + } else { + Flags::empty() + }; - Some(RenderableCell { + RenderableCell { point: Point::new(point.line, point.column + i), character, extra: None, - flags: Flags::empty(), + flags, bg_alpha: 1.0, fg, bg, underline: fg, - }) + } }); self.draw_cells(size_info, glyph_cache, cells); -- cgit v1.2.3-54-g00ecf