Skip to content

Commit

Permalink
Fix panic when drawing at the edge of the screen. (#11737)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
rhogenson and Rose Hogenson committed Sep 22, 2024
1 parent 8b1764d commit 73deaba
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 6 deletions.
7 changes: 3 additions & 4 deletions helix-term/src/ui/document.rs
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ impl<'a> TextRenderer<'a> {
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 {
self.surface.set_string(
Expand All @@ -452,7 +452,6 @@ impl<'a> TextRenderer<'a> {
);
self.surface.set_style(rect, style);
}

if *is_in_indent_area && !is_whitespace {
*last_indent_level = position.col;
*is_in_indent_area = false;
Expand All @@ -461,8 +460,8 @@ impl<'a> TextRenderer<'a> {
width
}

pub fn column_in_bounds(&self, colum: usize) -> bool {
self.offset.col <= colum && colum < self.viewport.width as usize + self.offset.col
pub fn column_in_bounds(&self, colum: usize, width: usize) -> bool {
self.offset.col <= colum && colum + width <= self.offset.col + self.viewport.width as usize
}

/// Overlay indentation guides ontop of a rendered line
Expand Down
2 changes: 1 addition & 1 deletion helix-term/src/ui/text_decorations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ impl Decoration for Cursor<'_> {
renderer: &mut TextRenderer,
grapheme: &FormattedGrapheme,
) -> 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
{
let position = grapheme.visual_pos - renderer.offset;
Expand Down
2 changes: 1 addition & 1 deletion helix-term/src/ui/text_decorations/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ impl Renderer<'_, '_> {
fn draw_eol_diagnostic(&mut self, diag: &Diagnostic, row: u16, col: usize) -> u16 {
let style = self.styles.severity_style(diag.severity());
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;
}
let col = (col - self.renderer.offset.col) as u16;
Expand Down

0 comments on commit 73deaba

Please sign in to comment.