Skip to content

Commit

Permalink
Skip whitespaces for wide chars in preedit
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
kchibisov authored Jul 22, 2023
1 parent 0c94e4a commit 67a433c
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 9 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
34 changes: 25 additions & 9 deletions alacritty/src/renderer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 67a433c

Please sign in to comment.