Fill in cursor support
Also added underline
This commit is contained in:
parent
59d32c32ce
commit
4d61bb6def
2 changed files with 48 additions and 44 deletions
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue