From f106b505a39087df01e199905033aa2113ea959a Mon Sep 17 00:00:00 2001 From: mars Date: Tue, 4 Oct 2022 15:56:42 -0600 Subject: [PATCH] Fix cursor draw out-of-bounds --- src/main.rs | 80 ++++++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/src/main.rs b/src/main.rs index ebb3a5b..23033de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,6 @@ use alacritty_terminal::Term; use mio_extras::channel::Sender as MioSender; use softbuffer::GraphicsContext; use std::borrow::Cow; -use std::collections::HashMap; use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::Arc; use std::thread::JoinHandle; @@ -79,7 +78,7 @@ impl App { }, ..Default::default() }; - + alacritty_terminal::tty::setup_env(&term_config); let term_listener = TermListener::new(sender.clone()); @@ -207,55 +206,60 @@ impl App { } } + if !missing_chars.is_empty() { + log::debug!("Missing characters: {:?}", missing_chars); + } + let term_row = content.cursor.point.line.0 as usize; let term_col = content.cursor.point.column.0 as usize; - let mut px_row = term_row * width * self.cell_height + term_col * self.cell_width; - let cursor_color = 0x00ff00ff; + if (term_row + 1) * self.cell_height < height && (term_col + 1) * self.cell_width < width { + let mut px_row = term_row * width * self.cell_height + term_col * self.cell_width; - use alacritty_terminal::ansi::CursorShape; - match content.cursor.shape { - CursorShape::Block => { - for _y in 0..self.cell_height { + let cursor_color = 0x00ff00ff; + + use alacritty_terminal::ansi::CursorShape; + match content.cursor.shape { + CursorShape::Block => { + for _y in 0..self.cell_height { + for x in 0..self.cell_width { + buffer[px_row + x as usize] = cursor_color; + } + + px_row += width; + } + } + CursorShape::Beam => { + for _y in 0..self.cell_height { + buffer[px_row] = cursor_color; + px_row += width; + } + } + CursorShape::Underline => { + px_row += (self.cell_height - 1) * width; + for x in 0..self.cell_width { + buffer[px_row + x as usize] = cursor_color; + } + } + CursorShape::HollowBlock => { for x in 0..self.cell_width { buffer[px_row + x as usize] = cursor_color; } - px_row += width; - } - } - CursorShape::Beam => { - for _y in 0..self.cell_height { - buffer[px_row] = cursor_color; - px_row += width; - } - } - CursorShape::Underline => { - px_row += (self.cell_height - 1) * width; - for x in 0..self.cell_width { - buffer[px_row + x as usize] = cursor_color; - } - } - CursorShape::HollowBlock => { - for x in 0..self.cell_width { - buffer[px_row + x as usize] = cursor_color; - } + for _y in 0..(self.cell_height - 1) { + buffer[px_row] = cursor_color; + buffer[px_row + self.cell_width - 1] = cursor_color; + px_row += width; + } - for y in 0..(self.cell_height - 1) { - buffer[px_row] = cursor_color; - buffer[px_row + self.cell_width - 1] = cursor_color; - px_row += width; - } - - for x in 0..self.cell_width { - buffer[px_row + x as usize] = cursor_color; + for x in 0..self.cell_width { + buffer[px_row + x as usize] = cursor_color; + } } + CursorShape::Hidden => {} } - CursorShape::Hidden => {} } - log::debug!("Missing characters: {:?}", missing_chars); - self.graphics .set_buffer(&buffer, width as u16, height as u16); }