Rebase and include necessary curses changes

This commit is contained in:
David Flemström 2019-03-03 17:48:19 +01:00 committed by Florian Dehau
parent a25bbea555
commit 21e79ca078

View File

@ -44,12 +44,11 @@ impl Backend for CursesBackend {
let mut style = Style { let mut style = Style {
fg: Color::Reset, fg: Color::Reset,
bg: Color::Reset, bg: Color::Reset,
modifier: Modifier::Reset, modifier: Modifier::empty(),
}; };
let mut curses_style = CursesStyle { let mut curses_style = CursesStyle {
fg: easycurses::Color::White, fg: easycurses::Color::White,
bg: easycurses::Color::Black, bg: easycurses::Color::Black,
attribute: pancurses::Attribute::Normal,
}; };
let mut update_color = false; let mut update_color = false;
for (col, row, cell) in content { for (col, row, cell) in content {
@ -60,12 +59,7 @@ impl Backend for CursesBackend {
last_col = col; last_col = col;
last_row = row; last_row = row;
if cell.style.modifier != style.modifier { if cell.style.modifier != style.modifier {
if curses_style.attribute != pancurses::Attribute::Normal { apply_modifier_diff(&mut self.curses.win, style.modifier, cell.style.modifier);
self.curses.win.attroff(curses_style.attribute);
}
let attribute: pancurses::Attribute = cell.style.modifier.into();
self.curses.win.attron(attribute);
curses_style.attribute = attribute;
style.modifier = cell.style.modifier; style.modifier = cell.style.modifier;
}; };
if cell.style.fg != style.fg { if cell.style.fg != style.fg {
@ -138,7 +132,6 @@ impl Backend for CursesBackend {
struct CursesStyle { struct CursesStyle {
fg: easycurses::Color, fg: easycurses::Color,
bg: easycurses::Color, bg: easycurses::Color,
attribute: pancurses::Attribute,
} }
#[cfg(unix)] #[cfg(unix)]
@ -224,22 +217,67 @@ impl From<Color> for Option<easycurses::Color> {
Color::Cyan | Color::LightCyan => Some(easycurses::Color::Cyan), Color::Cyan | Color::LightCyan => Some(easycurses::Color::Cyan),
Color::White | Color::Gray | Color::DarkGray => Some(easycurses::Color::White), Color::White | Color::Gray | Color::DarkGray => Some(easycurses::Color::White),
Color::Blue | Color::LightBlue => Some(easycurses::Color::Blue), Color::Blue | Color::LightBlue => Some(easycurses::Color::Blue),
Color::Indexed(_) => None,
Color::Rgb(_, _, _) => None, Color::Rgb(_, _, _) => None,
} }
} }
} }
impl From<Modifier> for pancurses::Attribute { fn apply_modifier_diff(win: &mut pancurses::Window, from: Modifier, to: Modifier) {
fn from(modifier: Modifier) -> pancurses::Attribute { remove_modifier(win, from - to);
match modifier { add_modifier(win, to - from);
Modifier::Blink => pancurses::Attribute::Blink, }
Modifier::Bold => pancurses::Attribute::Bold,
Modifier::CrossedOut => pancurses::Attribute::Strikeout, fn remove_modifier(win: &mut pancurses::Window, remove: Modifier) {
Modifier::Faint => pancurses::Attribute::Dim, if remove.contains(Modifier::BOLD) {
Modifier::Invert => pancurses::Attribute::Reverse, win.attroff(pancurses::Attribute::Bold);
Modifier::Italic => pancurses::Attribute::Italic,
Modifier::Underline => pancurses::Attribute::Underline,
_ => pancurses::Attribute::Normal,
} }
if remove.contains(Modifier::DIM) {
win.attroff(pancurses::Attribute::Dim);
}
if remove.contains(Modifier::ITALIC) {
win.attroff(pancurses::Attribute::Italic);
}
if remove.contains(Modifier::UNDERLINED) {
win.attroff(pancurses::Attribute::Underline);
}
if remove.contains(Modifier::SLOW_BLINK) || remove.contains(Modifier::RAPID_BLINK) {
win.attroff(pancurses::Attribute::Blink);
}
if remove.contains(Modifier::REVERSED) {
win.attroff(pancurses::Attribute::Reverse);
}
if remove.contains(Modifier::HIDDEN) {
win.attroff(pancurses::Attribute::Invisible);
}
if remove.contains(Modifier::CROSSED_OUT) {
win.attroff(pancurses::Attribute::Strikeout);
}
}
fn add_modifier(win: &mut pancurses::Window, add: Modifier) {
if add.contains(Modifier::BOLD) {
win.attron(pancurses::Attribute::Bold);
}
if add.contains(Modifier::DIM) {
win.attron(pancurses::Attribute::Dim);
}
if add.contains(Modifier::ITALIC) {
win.attron(pancurses::Attribute::Italic);
}
if add.contains(Modifier::UNDERLINED) {
win.attron(pancurses::Attribute::Underline);
}
if add.contains(Modifier::SLOW_BLINK) || add.contains(Modifier::RAPID_BLINK) {
win.attron(pancurses::Attribute::Blink);
}
if add.contains(Modifier::REVERSED) {
win.attron(pancurses::Attribute::Reverse);
}
if add.contains(Modifier::HIDDEN) {
win.attron(pancurses::Attribute::Invisible);
}
if add.contains(Modifier::CROSSED_OUT) {
win.attron(pancurses::Attribute::Strikeout);
} }
} }