Fix panic when drawing at the edge of the screen. (#11737)

When pressing tab at the edge of the screen, Helix panics in debug mode
subtracting position.col - self.offset.col.

To correctly account for graphemes that are partially visible,
column_in_bounds takes a width and returns whether the whole range is
in bounds.

Co-authored-by: Rose Hogenson <rosehogenson@posteo.net>
This commit is contained in:
rhogenson 2024-09-22 10:17:02 -07:00 committed by GitHub
parent 8b1764d164
commit 73deabaa40
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 5 additions and 6 deletions

View file

@ -433,7 +433,7 @@ impl<'a> TextRenderer<'a> {
Grapheme::Newline => &self.newline, Grapheme::Newline => &self.newline,
}; };
let in_bounds = self.column_in_bounds(position.col + width - 1); let in_bounds = self.column_in_bounds(position.col, width);
if in_bounds { if in_bounds {
self.surface.set_string( self.surface.set_string(
@ -452,7 +452,6 @@ impl<'a> TextRenderer<'a> {
); );
self.surface.set_style(rect, style); self.surface.set_style(rect, style);
} }
if *is_in_indent_area && !is_whitespace { if *is_in_indent_area && !is_whitespace {
*last_indent_level = position.col; *last_indent_level = position.col;
*is_in_indent_area = false; *is_in_indent_area = false;
@ -461,8 +460,8 @@ impl<'a> TextRenderer<'a> {
width width
} }
pub fn column_in_bounds(&self, colum: usize) -> bool { pub fn column_in_bounds(&self, colum: usize, width: usize) -> bool {
self.offset.col <= colum && colum < self.viewport.width as usize + self.offset.col self.offset.col <= colum && colum + width <= self.offset.col + self.viewport.width as usize
} }
/// Overlay indentation guides ontop of a rendered line /// Overlay indentation guides ontop of a rendered line

View file

@ -164,7 +164,7 @@ impl Decoration for Cursor<'_> {
renderer: &mut TextRenderer, renderer: &mut TextRenderer,
grapheme: &FormattedGrapheme, grapheme: &FormattedGrapheme,
) -> usize { ) -> usize {
if renderer.column_in_bounds(grapheme.visual_pos.col) if renderer.column_in_bounds(grapheme.visual_pos.col, grapheme.width())
&& renderer.offset.row < grapheme.visual_pos.row && renderer.offset.row < grapheme.visual_pos.row
{ {
let position = grapheme.visual_pos - renderer.offset; let position = grapheme.visual_pos - renderer.offset;

View file

@ -98,7 +98,7 @@ impl Renderer<'_, '_> {
fn draw_eol_diagnostic(&mut self, diag: &Diagnostic, row: u16, col: usize) -> u16 { fn draw_eol_diagnostic(&mut self, diag: &Diagnostic, row: u16, col: usize) -> u16 {
let style = self.styles.severity_style(diag.severity()); let style = self.styles.severity_style(diag.severity());
let width = self.renderer.viewport.width; let width = self.renderer.viewport.width;
if !self.renderer.column_in_bounds(col + 1) { if !self.renderer.column_in_bounds(col + 1, 1) {
return 0; return 0;
} }
let col = (col - self.renderer.offset.col) as u16; let col = (col - self.renderer.offset.col) as u16;