mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-06-26 10:54:26 +02:00
Feature - 256 color support
- Inverted the _COLOR_NOFG to be _COLOR_HASFG, for better readability and the added benefit of having newly constructed color with no specification having a value of 0.
This commit is contained in:
parent
157b32e93b
commit
3cd45c3acd
2 changed files with 45 additions and 48 deletions
|
@ -59,7 +59,7 @@ static struct
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
Color::Color ()
|
Color::Color ()
|
||||||
: value (_COLOR_NOFG | _COLOR_NOBG)
|
: value (0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,13 +71,13 @@ Color::Color (const Color& other)
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
Color::Color (unsigned int c)
|
Color::Color (unsigned int c)
|
||||||
: value (_COLOR_NOFG | _COLOR_NOBG)
|
: value (0)
|
||||||
{
|
{
|
||||||
if (!(c & _COLOR_FG)) value &= ~_COLOR_FG;
|
if (!(c & _COLOR_HASFG)) value &= ~_COLOR_FG;
|
||||||
if (!(c & _COLOR_BG)) value &= ~_COLOR_BG;
|
if (!(c & _COLOR_HASBG)) value &= ~_COLOR_BG;
|
||||||
|
|
||||||
value = c & (_COLOR_256 | _COLOR_UNDERLINE | _COLOR_BOLD | _COLOR_BRIGHT |
|
value = c & (_COLOR_256 | _COLOR_HASBG | _COLOR_HASFG |_COLOR_UNDERLINE |
|
||||||
_COLOR_BG | _COLOR_FG);
|
_COLOR_BOLD | _COLOR_BRIGHT | _COLOR_BG | _COLOR_FG);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -93,7 +93,7 @@ Color::Color (unsigned int c)
|
||||||
// colorN 0 <= N <= 255 fg 38;5;N bg 48;5;N
|
// colorN 0 <= N <= 255 fg 38;5;N bg 48;5;N
|
||||||
// rgbRGB 0 <= R,G,B <= 5 fg 38;5;16 + R*36 + G*6 + B bg 48;5;16 + R*36 + G*6 + B
|
// rgbRGB 0 <= R,G,B <= 5 fg 38;5;16 + R*36 + G*6 + B bg 48;5;16 + R*36 + G*6 + B
|
||||||
Color::Color (const std::string& spec)
|
Color::Color (const std::string& spec)
|
||||||
: value (_COLOR_NOFG | _COLOR_NOBG)
|
: value (0)
|
||||||
{
|
{
|
||||||
// By converting underscores to spaces, we inherently support the old "on_red"
|
// By converting underscores to spaces, we inherently support the old "on_red"
|
||||||
// style of specifying background colors.
|
// style of specifying background colors.
|
||||||
|
@ -136,12 +136,12 @@ Color::Color (const std::string& spec)
|
||||||
{
|
{
|
||||||
if (bg)
|
if (bg)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOBG;
|
value |= _COLOR_HASBG;
|
||||||
value |= index << 8;
|
value |= index << 8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOFG;
|
value |= _COLOR_HASFG;
|
||||||
value |= index;
|
value |= index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -156,12 +156,12 @@ Color::Color (const std::string& spec)
|
||||||
|
|
||||||
if (bg)
|
if (bg)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOBG;
|
value |= _COLOR_HASBG;
|
||||||
value |= (index + 232) << 8;
|
value |= (index + 232) << 8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOFG;
|
value |= _COLOR_HASFG;
|
||||||
value |= index + 232;
|
value |= index + 232;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,12 +187,12 @@ Color::Color (const std::string& spec)
|
||||||
index = 16 + r*36 + g*6 + b;
|
index = 16 + r*36 + g*6 + b;
|
||||||
if (bg)
|
if (bg)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOBG;
|
value |= _COLOR_HASBG;
|
||||||
value |= index << 8;
|
value |= index << 8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOFG;
|
value |= _COLOR_HASFG;
|
||||||
value |= index;
|
value |= index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,12 +208,12 @@ Color::Color (const std::string& spec)
|
||||||
|
|
||||||
if (bg)
|
if (bg)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOBG;
|
value |= _COLOR_HASBG;
|
||||||
value |= index << 8;
|
value |= index << 8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOFG;
|
value |= _COLOR_HASFG;
|
||||||
value |= index;
|
value |= index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,35 +226,35 @@ Color::Color (const std::string& spec)
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
Color::Color (color_id fg)
|
Color::Color (color_id fg)
|
||||||
: value (_COLOR_NOFG | _COLOR_NOBG)
|
: value (0)
|
||||||
{
|
{
|
||||||
if (fg != Color::nocolor)
|
if (fg != Color::nocolor)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOFG;
|
value |= _COLOR_HASFG;
|
||||||
value |= fg;
|
value |= fg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
Color::Color (color_id fg, color_id bg)
|
Color::Color (color_id fg, color_id bg)
|
||||||
: value (_COLOR_NOFG | _COLOR_NOBG)
|
: value (0)
|
||||||
{
|
{
|
||||||
if (bg != Color::nocolor)
|
if (bg != Color::nocolor)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOBG;
|
value |= _COLOR_HASFG;
|
||||||
value |= (bg << 8);
|
value |= (bg << 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fg != Color::nocolor)
|
if (fg != Color::nocolor)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOFG;
|
value |= _COLOR_HASFG;
|
||||||
value |= fg;
|
value |= fg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
Color::Color (color_id fg, color_id bg, bool underline, bool bold, bool bright)
|
Color::Color (color_id fg, color_id bg, bool underline, bool bold, bool bright)
|
||||||
: value (_COLOR_NOFG | _COLOR_NOBG)
|
: value (0)
|
||||||
{
|
{
|
||||||
value |= ((underline ? 1 : 0) << 18)
|
value |= ((underline ? 1 : 0) << 18)
|
||||||
| ((bold ? 1 : 0) << 17)
|
| ((bold ? 1 : 0) << 17)
|
||||||
|
@ -262,13 +262,13 @@ Color::Color (color_id fg, color_id bg, bool underline, bool bold, bool bright)
|
||||||
|
|
||||||
if (bg != Color::nocolor)
|
if (bg != Color::nocolor)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOBG;
|
value |= _COLOR_HASBG;
|
||||||
value |= (bg << 8);
|
value |= (bg << 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fg != Color::nocolor)
|
if (fg != Color::nocolor)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOFG;
|
value |= _COLOR_HASFG;
|
||||||
value |= fg;
|
value |= fg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -296,10 +296,10 @@ Color::operator std::string () const
|
||||||
if (value & _COLOR_UNDERLINE)
|
if (value & _COLOR_UNDERLINE)
|
||||||
description += std::string (description.length () ? " " : "") + "underline";
|
description += std::string (description.length () ? " " : "") + "underline";
|
||||||
|
|
||||||
if (!(value & _COLOR_NOFG))
|
if (value & _COLOR_HASFG)
|
||||||
description += std::string (description.length () ? " " : "") + fg ();
|
description += std::string (description.length () ? " " : "") + fg ();
|
||||||
|
|
||||||
if (!(value & _COLOR_NOBG))
|
if (value & _COLOR_HASBG)
|
||||||
{
|
{
|
||||||
description += std::string (description.length () ? " " : "") + "on";
|
description += std::string (description.length () ? " " : "") + "on";
|
||||||
|
|
||||||
|
@ -333,16 +333,16 @@ void Color::blend (const Color& other)
|
||||||
value |= (c.value & _COLOR_BOLD); // Inherit bold.
|
value |= (c.value & _COLOR_BOLD); // Inherit bold.
|
||||||
value |= (c.value & _COLOR_BRIGHT); // Inherit bright.
|
value |= (c.value & _COLOR_BRIGHT); // Inherit bright.
|
||||||
|
|
||||||
if (!(c.value & _COLOR_NOFG))
|
if (c.value & _COLOR_HASFG)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOFG; // There is now a color.
|
value |= _COLOR_HASFG; // There is now a color.
|
||||||
value &= ~_COLOR_FG; // Remove previous color.
|
value &= ~_COLOR_FG; // Remove previous color.
|
||||||
value |= (c.value & _COLOR_FG); // Apply other color.
|
value |= (c.value & _COLOR_FG); // Apply other color.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(c.value & _COLOR_NOBG))
|
if (c.value & _COLOR_HASBG)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOBG; // There is now a color.
|
value |= _COLOR_HASBG; // There is now a color.
|
||||||
value &= ~_COLOR_BG; // Remove previous color.
|
value &= ~_COLOR_BG; // Remove previous color.
|
||||||
value |= (c.value & _COLOR_BG); // Apply other color.
|
value |= (c.value & _COLOR_BG); // Apply other color.
|
||||||
}
|
}
|
||||||
|
@ -355,16 +355,16 @@ void Color::blend (const Color& other)
|
||||||
if (!(value & _COLOR_256)) c.upgrade ();
|
if (!(value & _COLOR_256)) c.upgrade ();
|
||||||
|
|
||||||
// 256 <-- 256.
|
// 256 <-- 256.
|
||||||
if (!(c.value & _COLOR_NOFG))
|
if (c.value & _COLOR_HASFG)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOFG; // There is now a color.
|
value |= _COLOR_HASFG; // There is now a color.
|
||||||
value &= ~_COLOR_FG; // Remove previous color.
|
value &= ~_COLOR_FG; // Remove previous color.
|
||||||
value |= (c.value & _COLOR_FG); // Apply other color.
|
value |= (c.value & _COLOR_FG); // Apply other color.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(c.value & _COLOR_NOBG))
|
if (c.value & _COLOR_HASBG)
|
||||||
{
|
{
|
||||||
value &= ~_COLOR_NOBG; // There is now a color.
|
value |= _COLOR_HASBG; // There is now a color.
|
||||||
value &= ~_COLOR_BG; // Remove previous color.
|
value &= ~_COLOR_BG; // Remove previous color.
|
||||||
value |= (c.value & _COLOR_BG); // Apply other color.
|
value |= (c.value & _COLOR_BG); // Apply other color.
|
||||||
}
|
}
|
||||||
|
@ -375,7 +375,7 @@ void Color::upgrade ()
|
||||||
{
|
{
|
||||||
if (!(value & _COLOR_256))
|
if (!(value & _COLOR_256))
|
||||||
{
|
{
|
||||||
if (!(value & _COLOR_NOFG))
|
if (value & _COLOR_HASFG)
|
||||||
{
|
{
|
||||||
bool bold = value & _COLOR_BOLD;
|
bool bold = value & _COLOR_BOLD;
|
||||||
unsigned int fg = value & _COLOR_FG;
|
unsigned int fg = value & _COLOR_FG;
|
||||||
|
@ -384,7 +384,7 @@ void Color::upgrade ()
|
||||||
value |= (bold ? fg + 7 : fg - 1);
|
value |= (bold ? fg + 7 : fg - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(value & _COLOR_NOBG))
|
if (value & _COLOR_HASBG)
|
||||||
{
|
{
|
||||||
bool bright = value & _COLOR_BRIGHT;
|
bool bright = value & _COLOR_BRIGHT;
|
||||||
unsigned int bg = (value & _COLOR_BG) >> 8;
|
unsigned int bg = (value & _COLOR_BG) >> 8;
|
||||||
|
@ -429,13 +429,13 @@ std::string Color::colorize (const std::string& input)
|
||||||
needTerminator = true;
|
needTerminator = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(value & _COLOR_NOFG))
|
if (value & _COLOR_HASFG)
|
||||||
{
|
{
|
||||||
result << "\033[38;5;" << (value & _COLOR_FG) << "m";
|
result << "\033[38;5;" << (value & _COLOR_FG) << "m";
|
||||||
needTerminator = true;
|
needTerminator = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(value & _COLOR_NOBG))
|
if (value & _COLOR_HASBG)
|
||||||
{
|
{
|
||||||
result << "\033[48;5;" << ((value & _COLOR_BG) >> 8) << "m";
|
result << "\033[48;5;" << ((value & _COLOR_BG) >> 8) << "m";
|
||||||
needTerminator = true;
|
needTerminator = true;
|
||||||
|
@ -449,7 +449,7 @@ std::string Color::colorize (const std::string& input)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 16 color
|
// 16 color
|
||||||
if (value != (_COLOR_NOFG | _COLOR_NOBG))
|
if (value != 0)
|
||||||
{
|
{
|
||||||
result << "\033[";
|
result << "\033[";
|
||||||
|
|
||||||
|
@ -465,13 +465,13 @@ std::string Color::colorize (const std::string& input)
|
||||||
result << "4";
|
result << "4";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(value & _COLOR_NOBG))
|
if (value & _COLOR_HASBG)
|
||||||
{
|
{
|
||||||
if (count++) result << ";";
|
if (count++) result << ";";
|
||||||
result << ((value & _COLOR_BRIGHT ? 99 : 39) + ((value & _COLOR_BG) >> 8));
|
result << ((value & _COLOR_BRIGHT ? 99 : 39) + ((value & _COLOR_BG) >> 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(value & _COLOR_NOFG))
|
if (value & _COLOR_HASFG)
|
||||||
{
|
{
|
||||||
if (count++) result << ";";
|
if (count++) result << ";";
|
||||||
result << (29 + (value & _COLOR_FG));
|
result << (29 + (value & _COLOR_FG));
|
||||||
|
@ -494,10 +494,7 @@ std::string Color::colorize (const std::string& input, const std::string& spec)
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
bool Color::nontrivial ()
|
bool Color::nontrivial ()
|
||||||
{
|
{
|
||||||
if (value != (_COLOR_NOFG | _COLOR_NOBG))
|
return value != 0 ? true : false;
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -517,7 +514,7 @@ std::string Color::fg () const
|
||||||
|
|
||||||
if (value & _COLOR_256)
|
if (value & _COLOR_256)
|
||||||
{
|
{
|
||||||
if (!(value & _COLOR_NOFG))
|
if (value & _COLOR_HASFG)
|
||||||
{
|
{
|
||||||
std::stringstream s;
|
std::stringstream s;
|
||||||
s << "color" << (value & _COLOR_FG);
|
s << "color" << (value & _COLOR_FG);
|
||||||
|
@ -541,7 +538,7 @@ std::string Color::bg () const
|
||||||
|
|
||||||
if (value & _COLOR_256)
|
if (value & _COLOR_256)
|
||||||
{
|
{
|
||||||
if (!(value & _COLOR_NOBG))
|
if (value & _COLOR_HASBG)
|
||||||
{
|
{
|
||||||
std::stringstream s;
|
std::stringstream s;
|
||||||
s << "color" << ((value & _COLOR_BG) >> 8);
|
s << "color" << ((value & _COLOR_BG) >> 8);
|
||||||
|
|
|
@ -31,8 +31,8 @@
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
#define _COLOR_256 0x00200000 // 256-color mode.
|
#define _COLOR_256 0x00200000 // 256-color mode.
|
||||||
#define _COLOR_NOBG 0x00100000 // No background color (all values taken).
|
#define _COLOR_HASBG 0x00100000 // Has background color (all values taken).
|
||||||
#define _COLOR_NOFG 0x00080000 // No foreground color (all values taken).
|
#define _COLOR_HASFG 0x00080000 // Has foreground color (all values taken).
|
||||||
#define _COLOR_UNDERLINE 0x00040000 // General underline attribute.
|
#define _COLOR_UNDERLINE 0x00040000 // General underline attribute.
|
||||||
#define _COLOR_BOLD 0x00020000 // 16-color bold attribute.
|
#define _COLOR_BOLD 0x00020000 // 16-color bold attribute.
|
||||||
#define _COLOR_BRIGHT 0x00010000 // 16-color bright background attribute.
|
#define _COLOR_BRIGHT 0x00010000 // 16-color bright background attribute.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue