Fill in cursor support

Also added underline
This commit is contained in:
A-Walrus 2024-08-23 14:48:42 +03:00 committed by Jeremy Soller
parent 59d32c32ce
commit 4d61bb6def
2 changed files with 48 additions and 44 deletions

View file

@ -12,7 +12,7 @@ use alacritty_terminal::{
viewport_to_point, Config, TermDamage, TermMode,
},
tty::{self, Options},
vte::ansi::{Color, NamedColor, Rgb},
vte::ansi::{Color, CursorShape, NamedColor, Rgb},
Term,
};
use cosmic::{
@ -757,43 +757,34 @@ impl Terminal {
}
// Change color if cursor
if indexed.point == grid.cursor.point {
//TODO: better handling of cursor
if term.mode().contains(TermMode::SHOW_CURSOR) {
//Use specific cursor color if requested
if term.colors()[NamedColor::Cursor].is_some() {
fg = bg;
bg = convert_color(term.colors(), Color::Named(NamedColor::Cursor));
} else if self.colors[NamedColor::Cursor].is_some() {
//Use specific theme cursor color if exists
fg = bg;
bg = convert_color(&self.colors, Color::Named(NamedColor::Cursor));
} else {
mem::swap(&mut fg, &mut bg);
}
let fg_rgb = Rgb {
r: fg.r(),
g: fg.g(),
b: fg.b(),
};
let bg_rgb = Rgb {
r: bg.r(),
g: bg.g(),
b: bg.b(),
};
let contrast = fg_rgb.contrast(bg_rgb);
if contrast < MIN_CURSOR_CONTRAST {
fg = convert_color(
&self.colors,
Color::Named(NamedColor::Background),
);
bg = convert_color(
&self.colors,
Color::Named(NamedColor::Foreground),
);
}
} else {
if indexed.point == grid.cursor.point
&& term.cursor_style().shape == CursorShape::Block
{
//Use specific cursor color if requested
if term.colors()[NamedColor::Cursor].is_some() {
fg = bg;
bg = convert_color(term.colors(), Color::Named(NamedColor::Cursor));
} else if self.colors[NamedColor::Cursor].is_some() {
//Use specific theme cursor color if exists
fg = bg;
bg = convert_color(&self.colors, Color::Named(NamedColor::Cursor));
} else {
mem::swap(&mut fg, &mut bg);
}
let fg_rgb = Rgb {
r: fg.r(),
g: fg.g(),
b: fg.b(),
};
let bg_rgb = Rgb {
r: bg.r(),
g: bg.g(),
b: bg.b(),
};
let contrast = fg_rgb.contrast(bg_rgb);
if contrast < MIN_CURSOR_CONTRAST {
fg = convert_color(&self.colors, Color::Named(NamedColor::Background));
bg = convert_color(&self.colors, Color::Named(NamedColor::Foreground));
}
}

View file

@ -589,28 +589,41 @@ where
}
// Draw cursor
terminal.with_buffer(|buffer| {
{
let cursor = terminal.term.lock().renderable_content().cursor;
let col = cursor.point.column.0;
let line = cursor.point.line.0;
let color = Color::WHITE; // TODO
let width = terminal.size().cell_width;
let height = terminal.size().cell_height;
let top_left = view_position
+ Vector::new((col as f32 * width).floor(), (line as f32 * height).floor());
match cursor.shape {
CursorShape::Beam => {
let quad = Quad {
bounds: Rectangle::new(top_left, Size::new(1.0, height)),
..Default::default()
};
renderer.fill_quad(quad, color);
}
CursorShape::Underline => {
let quad = Quad {
bounds: Rectangle::new(
view_position
+ Vector::new(
(col as f32 * terminal.size().cell_width).floor(),
line as f32 * terminal.size().cell_height,
(col as f32 * width).floor(),
((line + 1) as f32 * height).floor(),
),
Size::new(1.0, buffer.metrics().line_height),
Size::new(width, 1.0),
),
..Default::default()
};
renderer.fill_quad(quad, Color::WHITE);
renderer.fill_quad(quad, color);
}
_ => {}
CursorShape::HollowBlock => {} // TODO not sure when this would even be activated
CursorShape::Block | CursorShape::Hidden => {} // Block is handled seperately
}
});
}
let duration = instant.elapsed();
log::trace!("redraw {}, {}: {:?}", view_w, view_h, duration);