From 67a433ceedf3e415d9c989112d1248a7562a1ac5 Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Sat, 22 Jul 2023 19:05:12 +0000 Subject: [PATCH] Skip whitespaces for wide chars in preedit While we skip the spacers for the wide characters in the grid due to them having a proper flags, the draw_string method was generating the cells with incorrect flags leading to wide chars being cut off. --- CHANGELOG.md | 1 + alacritty/src/renderer/mod.rs | 34 +++++++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6801762473..7db853319c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - `Maximized` startup mode not filling the screen properly on GNOME Wayland - `OptionAsAlt` with `OnlyLeft`/`OnlyRight` settings not working properly on macOS - Default Vi key bindings for `Last`/`First` actions not working on X11/Wayland +- Cut off wide characters in preedit string ### Removed diff --git a/alacritty/src/renderer/mod.rs b/alacritty/src/renderer/mod.rs index 64aee821d51..fc586dc94b6 100644 --- a/alacritty/src/renderer/mod.rs +++ b/alacritty/src/renderer/mod.rs @@ -8,6 +8,7 @@ use glutin::context::{ContextApi, GlContext, PossiblyCurrentContext}; use glutin::display::{GetGlDisplay, GlDisplay}; use log::{debug, error, info, warn, LevelFilter}; use once_cell::sync::OnceCell; +use unicode_width::UnicodeWidthChar; use alacritty_terminal::index::Point; use alacritty_terminal::term::cell::Flags; @@ -175,15 +176,30 @@ impl Renderer { size_info: &SizeInfo, glyph_cache: &mut GlyphCache, ) { - let cells = string_chars.enumerate().map(|(i, character)| RenderableCell { - point: Point::new(point.line, point.column + i), - character, - extra: None, - flags: Flags::empty(), - bg_alpha: 1.0, - fg, - bg, - underline: fg, + 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; + } + + Some(RenderableCell { + point: Point::new(point.line, point.column + i), + character, + extra: None, + flags: Flags::empty(), + bg_alpha: 1.0, + fg, + bg, + underline: fg, + }) }); self.draw_cells(size_info, glyph_cache, cells);