mirror of
https://github.com/fish-shell/fish-shell.git
synced 2025-03-27 14:45:13 +08:00
output: Simplify some duplicated code
Becomes a bit boring after a while
This commit is contained in:
parent
19efd22468
commit
f7b2bf8229
@ -147,44 +147,21 @@ bool outputter_t::write_color(rgb_color_t color, bool is_fg) {
|
|||||||
/// \param c Foreground color.
|
/// \param c Foreground color.
|
||||||
/// \param c2 Background color.
|
/// \param c2 Background color.
|
||||||
void outputter_t::set_color(rgb_color_t c, rgb_color_t c2) {
|
void outputter_t::set_color(rgb_color_t c, rgb_color_t c2) {
|
||||||
if (!cur_term) return;
|
// Test if we have at least basic support for setting fonts, colors and related bits - otherwise
|
||||||
|
// just give up...
|
||||||
|
if (!cur_term || !exit_attribute_mode) return;
|
||||||
|
|
||||||
const rgb_color_t normal = rgb_color_t::normal();
|
const rgb_color_t normal = rgb_color_t::normal();
|
||||||
bool bg_set = false, last_bg_set = false;
|
bool bg_set = false, last_bg_set = false;
|
||||||
bool is_bold = false;
|
bool is_bold = c.is_bold() || c2.is_bold();
|
||||||
bool is_underline = false;
|
bool is_underline = c.is_underline() || c2.is_underline();
|
||||||
bool is_italics = false;
|
bool is_italics = c.is_italics() || c2.is_italics();
|
||||||
bool is_dim = false;
|
bool is_dim = c.is_dim() || c2.is_dim();
|
||||||
bool is_reverse = false;
|
bool is_reverse = c.is_reverse() || c2.is_reverse();
|
||||||
|
|
||||||
// Test if we have at least basic support for setting fonts, colors and related bits - otherwise
|
|
||||||
// just give up...
|
|
||||||
if (!exit_attribute_mode) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
is_bold |= c.is_bold();
|
|
||||||
is_bold |= c2.is_bold();
|
|
||||||
|
|
||||||
is_underline |= c.is_underline();
|
|
||||||
is_underline |= c2.is_underline();
|
|
||||||
|
|
||||||
is_italics |= c.is_italics();
|
|
||||||
is_italics |= c2.is_italics();
|
|
||||||
|
|
||||||
is_dim |= c.is_dim();
|
|
||||||
is_dim |= c2.is_dim();
|
|
||||||
|
|
||||||
is_reverse |= c.is_reverse();
|
|
||||||
is_reverse |= c2.is_reverse();
|
|
||||||
|
|
||||||
if (c.is_reset() || c2.is_reset()) {
|
if (c.is_reset() || c2.is_reset()) {
|
||||||
c = c2 = normal;
|
c = c2 = normal;
|
||||||
was_bold = false;
|
reset_modes();
|
||||||
was_underline = false;
|
|
||||||
was_italics = false;
|
|
||||||
was_dim = false;
|
|
||||||
was_reverse = false;
|
|
||||||
// If we exit attibute mode, we must first set a color, or previously colored text might
|
// If we exit attibute mode, we must first set a color, or previously colored text might
|
||||||
// lose it's color. Terminals are weird...
|
// lose it's color. Terminals are weird...
|
||||||
write_foreground_color(*this, 0);
|
write_foreground_color(*this, 0);
|
||||||
@ -192,40 +169,14 @@ void outputter_t::set_color(rgb_color_t c, rgb_color_t c2) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (was_bold && !is_bold) {
|
if ((was_bold && !is_bold)
|
||||||
// Only way to exit bold mode is a reset of all attributes.
|
|| (was_dim && !is_dim)
|
||||||
|
|| (was_reverse && !is_reverse)) {
|
||||||
|
// Only way to exit bold/dim/reverse mode is a reset of all attributes.
|
||||||
writembs(*this, exit_attribute_mode);
|
writembs(*this, exit_attribute_mode);
|
||||||
last_color = normal;
|
last_color = normal;
|
||||||
last_color2 = normal;
|
last_color2 = normal;
|
||||||
was_bold = false;
|
reset_modes();
|
||||||
was_underline = false;
|
|
||||||
was_italics = false;
|
|
||||||
was_dim = false;
|
|
||||||
was_reverse = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (was_dim && !is_dim) {
|
|
||||||
// Only way to exit dim mode is a reset of all attributes.
|
|
||||||
writembs(*this, exit_attribute_mode);
|
|
||||||
last_color = normal;
|
|
||||||
last_color2 = normal;
|
|
||||||
was_bold = false;
|
|
||||||
was_underline = false;
|
|
||||||
was_italics = false;
|
|
||||||
was_dim = false;
|
|
||||||
was_reverse = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (was_reverse && !is_reverse) {
|
|
||||||
// Only way to exit reverse mode is a reset of all attributes.
|
|
||||||
writembs(*this, exit_attribute_mode);
|
|
||||||
last_color = normal;
|
|
||||||
last_color2 = normal;
|
|
||||||
was_bold = false;
|
|
||||||
was_underline = false;
|
|
||||||
was_italics = false;
|
|
||||||
was_dim = false;
|
|
||||||
was_reverse = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!last_color2.is_normal() && !last_color2.is_reset()) {
|
if (!last_color2.is_normal() && !last_color2.is_reset()) {
|
||||||
@ -248,11 +199,7 @@ void outputter_t::set_color(rgb_color_t c, rgb_color_t c2) {
|
|||||||
if (!bg_set && last_bg_set) {
|
if (!bg_set && last_bg_set) {
|
||||||
// Background color changed and is no longer set, so we exit bold mode.
|
// Background color changed and is no longer set, so we exit bold mode.
|
||||||
writembs(*this, exit_attribute_mode);
|
writembs(*this, exit_attribute_mode);
|
||||||
was_bold = false;
|
reset_modes();
|
||||||
was_underline = false;
|
|
||||||
was_italics = false;
|
|
||||||
was_dim = false;
|
|
||||||
was_reverse = false;
|
|
||||||
// We don't know if exit_attribute_mode resets colors, so we set it to something known.
|
// We don't know if exit_attribute_mode resets colors, so we set it to something known.
|
||||||
if (write_foreground_color(*this, 0)) {
|
if (write_foreground_color(*this, 0)) {
|
||||||
last_color = rgb_color_t::black();
|
last_color = rgb_color_t::black();
|
||||||
@ -266,11 +213,7 @@ void outputter_t::set_color(rgb_color_t c, rgb_color_t c2) {
|
|||||||
writembs(*this, exit_attribute_mode);
|
writembs(*this, exit_attribute_mode);
|
||||||
|
|
||||||
last_color2 = rgb_color_t::normal();
|
last_color2 = rgb_color_t::normal();
|
||||||
was_bold = false;
|
reset_modes();
|
||||||
was_underline = false;
|
|
||||||
was_italics = false;
|
|
||||||
was_dim = false;
|
|
||||||
was_reverse = false;
|
|
||||||
} else if (!c.is_special()) {
|
} else if (!c.is_special()) {
|
||||||
write_color(c, true /* foreground */);
|
write_color(c, true /* foreground */);
|
||||||
}
|
}
|
||||||
@ -287,11 +230,7 @@ void outputter_t::set_color(rgb_color_t c, rgb_color_t c2) {
|
|||||||
write_color(last_color, true /* foreground */);
|
write_color(last_color, true /* foreground */);
|
||||||
}
|
}
|
||||||
|
|
||||||
was_bold = false;
|
reset_modes();
|
||||||
was_underline = false;
|
|
||||||
was_italics = false;
|
|
||||||
was_dim = false;
|
|
||||||
was_reverse = false;
|
|
||||||
last_color2 = c2;
|
last_color2 = c2;
|
||||||
} else if (!c2.is_special()) {
|
} else if (!c2.is_special()) {
|
||||||
write_color(c2, false /* not foreground */);
|
write_color(c2, false /* not foreground */);
|
||||||
|
@ -32,6 +32,14 @@ class outputter_t {
|
|||||||
bool was_dim = false;
|
bool was_dim = false;
|
||||||
bool was_reverse = false;
|
bool was_reverse = false;
|
||||||
|
|
||||||
|
void reset_modes() {
|
||||||
|
was_bold = false;
|
||||||
|
was_underline = false;
|
||||||
|
was_italics = false;
|
||||||
|
was_dim = false;
|
||||||
|
was_reverse = false;
|
||||||
|
}
|
||||||
|
|
||||||
/// Construct an outputter which outputs to a given fd.
|
/// Construct an outputter which outputs to a given fd.
|
||||||
explicit outputter_t(int fd) : fd_(fd) {}
|
explicit outputter_t(int fd) : fd_(fd) {}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user