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:
parent
8b1764d164
commit
73deabaa40
3 changed files with 5 additions and 6 deletions
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue