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, viewport_to_point, Config, TermDamage, TermMode,
}, },
tty::{self, Options}, tty::{self, Options},
vte::ansi::{Color, NamedColor, Rgb}, vte::ansi::{Color, CursorShape, NamedColor, Rgb},
Term, Term,
}; };
use cosmic::{ use cosmic::{
@ -757,43 +757,34 @@ impl Terminal {
} }
// Change color if cursor // Change color if cursor
if indexed.point == grid.cursor.point { if indexed.point == grid.cursor.point
//TODO: better handling of cursor && term.cursor_style().shape == CursorShape::Block
if term.mode().contains(TermMode::SHOW_CURSOR) { {
//Use specific cursor color if requested //Use specific cursor color if requested
if term.colors()[NamedColor::Cursor].is_some() { 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 {
fg = bg; 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 // Draw cursor
terminal.with_buffer(|buffer| { {
let cursor = terminal.term.lock().renderable_content().cursor; let cursor = terminal.term.lock().renderable_content().cursor;
let col = cursor.point.column.0; let col = cursor.point.column.0;
let line = cursor.point.line.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 { match cursor.shape {
CursorShape::Beam => { 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 { let quad = Quad {
bounds: Rectangle::new( bounds: Rectangle::new(
view_position view_position
+ Vector::new( + Vector::new(
(col as f32 * terminal.size().cell_width).floor(), (col as f32 * width).floor(),
line as f32 * terminal.size().cell_height, ((line + 1) as f32 * height).floor(),
), ),
Size::new(1.0, buffer.metrics().line_height), Size::new(width, 1.0),
), ),
..Default::default() ..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(); let duration = instant.elapsed();
log::trace!("redraw {}, {}: {:?}", view_w, view_h, duration); log::trace!("redraw {}, {}: {:?}", view_w, view_h, duration);