Skip to content

Commit

Permalink
Fix panic when drawing at the edge of the screen.
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.
  • Loading branch information
Rose Hogenson committed Sep 21, 2024
1 parent 9f93de5 commit ce36b33
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 ce36b33

Please sign in to comment.