Use a ColorPair in DisplayAtoms instead of separate fg/bg colors
This commit is contained in:
parent
594ee65949
commit
f677d4ba32
|
@ -17,6 +17,8 @@ enum class Color : char
|
||||||
White
|
White
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using ColorPair = std::pair<Color, Color>;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // color_hh_INCLUDED
|
#endif // color_hh_INCLUDED
|
||||||
|
|
|
@ -9,8 +9,6 @@
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
|
||||||
using ColorPair = std::pair<Color, Color>;
|
|
||||||
|
|
||||||
class ColorRegistry : public Singleton<ColorRegistry>
|
class ColorRegistry : public Singleton<ColorRegistry>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -30,8 +30,7 @@ void DisplayLine::optimize()
|
||||||
auto& atom = *atom_it;
|
auto& atom = *atom_it;
|
||||||
auto& next_atom = *next_atom_it;
|
auto& next_atom = *next_atom_it;
|
||||||
|
|
||||||
if (atom.fg_color == next_atom.fg_color and
|
if (atom.colors == next_atom.colors and
|
||||||
atom.bg_color == next_atom.bg_color and
|
|
||||||
atom.attribute == next_atom.attribute and
|
atom.attribute == next_atom.attribute and
|
||||||
atom.content.type() == AtomContent::BufferRange and
|
atom.content.type() == AtomContent::BufferRange and
|
||||||
next_atom.content.type() == AtomContent::BufferRange and
|
next_atom.content.type() == AtomContent::BufferRange and
|
||||||
|
|
|
@ -110,15 +110,14 @@ private:
|
||||||
|
|
||||||
struct DisplayAtom
|
struct DisplayAtom
|
||||||
{
|
{
|
||||||
Color fg_color;
|
ColorPair colors;
|
||||||
Color bg_color;
|
|
||||||
Attribute attribute;
|
Attribute attribute;
|
||||||
|
|
||||||
AtomContent content;
|
AtomContent content;
|
||||||
|
|
||||||
DisplayAtom(AtomContent content)
|
DisplayAtom(AtomContent content)
|
||||||
: content(std::move(content)), attribute(Normal),
|
: content{std::move(content)}, attribute{Normal},
|
||||||
fg_color(Color::Default), bg_color(Color::Default) {}
|
colors{Color::Default, Color::Default} {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class DisplayLine
|
class DisplayLine
|
||||||
|
|
|
@ -81,10 +81,7 @@ public:
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
highlight_range(display_buffer, match[n].first, match[n].second, true,
|
highlight_range(display_buffer, match[n].first, match[n].second, true,
|
||||||
[&](DisplayAtom& atom) {
|
[&](DisplayAtom& atom) { atom.colors = *col_it->second; });
|
||||||
atom.fg_color = col_it->second->first;
|
|
||||||
atom.bg_color = col_it->second->second;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -257,8 +254,7 @@ void show_line_numbers(DisplayBuffer& display_buffer)
|
||||||
char buffer[10];
|
char buffer[10];
|
||||||
snprintf(buffer, 10, format, (int)line.buffer_line() + 1);
|
snprintf(buffer, 10, format, (int)line.buffer_line() + 1);
|
||||||
DisplayAtom atom = DisplayAtom(AtomContent(buffer));
|
DisplayAtom atom = DisplayAtom(AtomContent(buffer));
|
||||||
atom.fg_color = Color::Black;
|
atom.colors = { Color::Black, Color::White };
|
||||||
atom.bg_color = Color::White;
|
|
||||||
line.insert(line.begin(), std::move(atom));
|
line.insert(line.begin(), std::move(atom));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -272,12 +268,12 @@ void highlight_selections(const SelectionList& selections, DisplayBuffer& displa
|
||||||
BufferIterator begin = forward ? sel.first() : utf8::next(sel.last());
|
BufferIterator begin = forward ? sel.first() : utf8::next(sel.last());
|
||||||
BufferIterator end = forward ? sel.last() : utf8::next(sel.first());
|
BufferIterator end = forward ? sel.last() : utf8::next(sel.first());
|
||||||
|
|
||||||
Color fg_color = (i == selections.size() - 1) ? Color::Cyan : Color::Black;
|
ColorPair colors = (i == selections.size() - 1) ? ColorPair{ Color::Cyan, Color::Blue }
|
||||||
Color bg_color = (i == selections.size() - 1) ? Color::Blue : Color::Blue;
|
: ColorPair{ Color::Black, Color::Blue };
|
||||||
highlight_range(display_buffer, begin, end, false,
|
highlight_range(display_buffer, begin, end, false,
|
||||||
[&](DisplayAtom& atom) { atom.fg_color = fg_color; atom.bg_color = bg_color; });
|
[&](DisplayAtom& atom) { atom.colors = colors; });
|
||||||
highlight_range(display_buffer, sel.last(), utf8::next(sel.last()), false,
|
highlight_range(display_buffer, sel.last(), utf8::next(sel.last()), false,
|
||||||
[](DisplayAtom& atom) { atom.fg_color = Color::Black; atom.bg_color = Color::White; });
|
[](DisplayAtom& atom) { atom.colors = { Color::Black, Color::White}; });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,8 +297,7 @@ void expand_unprintable(DisplayBuffer& display_buffer)
|
||||||
highlight_range(display_buffer,
|
highlight_range(display_buffer,
|
||||||
it.underlying_iterator(), (it+1).underlying_iterator(),
|
it.underlying_iterator(), (it+1).underlying_iterator(),
|
||||||
true, [&str](DisplayAtom& atom){ atom.content.replace(str);
|
true, [&str](DisplayAtom& atom){ atom.content.replace(str);
|
||||||
atom.bg_color = Color::Red;
|
atom.colors = { Color::Red, Color::Black }; });
|
||||||
atom.fg_color = Color::Black; });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -329,8 +324,7 @@ public:
|
||||||
{
|
{
|
||||||
const bool flagged = contains(lines, (int)line.buffer_line() + 1);
|
const bool flagged = contains(lines, (int)line.buffer_line() + 1);
|
||||||
DisplayAtom atom{AtomContent(flagged ? m_flag : empty)};
|
DisplayAtom atom{AtomContent(flagged ? m_flag : empty)};
|
||||||
atom.fg_color = Color::Blue;
|
atom.colors = { Color::Blue, Color::Cyan };
|
||||||
atom.bg_color = Color::Cyan;
|
|
||||||
line.insert(line.begin(), std::move(atom));
|
line.insert(line.begin(), std::move(atom));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,34 +43,32 @@ static int nc_color(Color color)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_color_pair(Color fg_color, Color bg_color)
|
static int get_color_pair(const ColorPair& colors)
|
||||||
{
|
{
|
||||||
static std::map<std::pair<Color, Color>, int> colorpairs;
|
static std::map<ColorPair, int> colorpairs;
|
||||||
static int next_pair = 1;
|
static int next_pair = 1;
|
||||||
|
|
||||||
std::pair<Color, Color> colorpair(fg_color, bg_color);
|
auto it = colorpairs.find(colors);
|
||||||
|
|
||||||
auto it = colorpairs.find(colorpair);
|
|
||||||
if (it != colorpairs.end())
|
if (it != colorpairs.end())
|
||||||
return it->second;
|
return it->second;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
init_pair(next_pair, nc_color(fg_color), nc_color(bg_color));
|
init_pair(next_pair, nc_color(colors.first), nc_color(colors.second));
|
||||||
colorpairs[colorpair] = next_pair;
|
colorpairs[colors] = next_pair;
|
||||||
return next_pair++;
|
return next_pair++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_color(Color fg_color, Color bg_color)
|
static void set_color(const ColorPair colors)
|
||||||
{
|
{
|
||||||
static int current_pair = -1;
|
static int current_pair = -1;
|
||||||
|
|
||||||
if (current_pair != -1)
|
if (current_pair != -1)
|
||||||
attroff(COLOR_PAIR(current_pair));
|
attroff(COLOR_PAIR(current_pair));
|
||||||
|
|
||||||
if (fg_color != Color::Default or bg_color != Color::Default)
|
if (colors.first != Color::Default or colors.second != Color::Default)
|
||||||
{
|
{
|
||||||
current_pair = get_color_pair(fg_color, bg_color);
|
current_pair = get_color_pair(colors);
|
||||||
attron(COLOR_PAIR(current_pair));
|
attron(COLOR_PAIR(current_pair));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,8 +99,8 @@ NCursesUI::NCursesUI()
|
||||||
use_default_colors();
|
use_default_colors();
|
||||||
ESCDELAY=25;
|
ESCDELAY=25;
|
||||||
|
|
||||||
m_menu_fg = get_color_pair(Color::Blue, Color::Cyan);
|
m_menu_fg = get_color_pair({ Color::Blue, Color::Cyan });
|
||||||
m_menu_bg = get_color_pair(Color::Cyan, Color::Blue);
|
m_menu_bg = get_color_pair({ Color::Cyan, Color::Blue });
|
||||||
|
|
||||||
signal(SIGWINCH, on_term_resize);
|
signal(SIGWINCH, on_term_resize);
|
||||||
signal(SIGINT, on_sigint);
|
signal(SIGINT, on_sigint);
|
||||||
|
@ -175,7 +173,7 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
|
||||||
set_attribute(A_BLINK, atom.attribute & Blink);
|
set_attribute(A_BLINK, atom.attribute & Blink);
|
||||||
set_attribute(A_BOLD, atom.attribute & Bold);
|
set_attribute(A_BOLD, atom.attribute & Bold);
|
||||||
|
|
||||||
set_color(atom.fg_color, atom.bg_color);
|
set_color(atom.colors);
|
||||||
|
|
||||||
String content = atom.content.content();
|
String content = atom.content.content();
|
||||||
if (content[content.length()-1] == '\n' and
|
if (content[content.length()-1] == '\n' and
|
||||||
|
@ -200,7 +198,7 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
|
||||||
set_attribute(A_REVERSE, 0);
|
set_attribute(A_REVERSE, 0);
|
||||||
set_attribute(A_BLINK, 0);
|
set_attribute(A_BLINK, 0);
|
||||||
set_attribute(A_BOLD, 0);
|
set_attribute(A_BOLD, 0);
|
||||||
set_color(Color::Blue, Color::Default);
|
set_color({ Color::Blue, Color::Default });
|
||||||
for (;line_index < m_dimensions.line; ++line_index)
|
for (;line_index < m_dimensions.line; ++line_index)
|
||||||
{
|
{
|
||||||
move((int)line_index, 0);
|
move((int)line_index, 0);
|
||||||
|
@ -208,7 +206,7 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
|
||||||
addch('~');
|
addch('~');
|
||||||
}
|
}
|
||||||
|
|
||||||
set_color(Color::Cyan, Color::Default);
|
set_color({ Color::Cyan, Color::Default });
|
||||||
draw_status();
|
draw_status();
|
||||||
CharCount status_len = mode_line.char_length();
|
CharCount status_len = mode_line.char_length();
|
||||||
// only draw mode_line if it does not overlap one status line
|
// only draw mode_line if it does not overlap one status line
|
||||||
|
@ -461,7 +459,7 @@ void NCursesUI::info_show(const String& content, const DisplayCoord& anchor, Men
|
||||||
m_info_win = newwin((int)size.line, (int)size.column,
|
m_info_win = newwin((int)size.line, (int)size.column,
|
||||||
(int)pos.line, (int)pos.column);
|
(int)pos.line, (int)pos.column);
|
||||||
|
|
||||||
wbkgd(m_info_win, COLOR_PAIR(get_color_pair(Color::Black, Color::Yellow)));
|
wbkgd(m_info_win, COLOR_PAIR(get_color_pair({ Color::Black, Color::Yellow })));
|
||||||
wmove(m_info_win, 0, 0);
|
wmove(m_info_win, 0, 0);
|
||||||
addutf8str(m_info_win, Utf8Iterator(content.begin()),
|
addutf8str(m_info_win, Utf8Iterator(content.begin()),
|
||||||
Utf8Iterator(content.end()));
|
Utf8Iterator(content.end()));
|
||||||
|
|
|
@ -70,8 +70,8 @@ public:
|
||||||
|
|
||||||
void write(const DisplayAtom& atom)
|
void write(const DisplayAtom& atom)
|
||||||
{
|
{
|
||||||
write(atom.fg_color);
|
write(atom.colors.first);
|
||||||
write(atom.bg_color);
|
write(atom.colors.second);
|
||||||
write(atom.attribute);
|
write(atom.attribute);
|
||||||
write(atom.content.content());
|
write(atom.content.content());
|
||||||
}
|
}
|
||||||
|
@ -144,8 +144,7 @@ DisplayAtom read<DisplayAtom>(int socket)
|
||||||
Color bg_color = read<Color>(socket);
|
Color bg_color = read<Color>(socket);
|
||||||
Attribute attribute = read<Attribute>(socket);
|
Attribute attribute = read<Attribute>(socket);
|
||||||
DisplayAtom atom(AtomContent(read<String>(socket)));
|
DisplayAtom atom(AtomContent(read<String>(socket)));
|
||||||
atom.fg_color = fg_color;
|
atom.colors = { fg_color, bg_color };
|
||||||
atom.bg_color = bg_color;
|
|
||||||
atom.attribute = attribute;
|
atom.attribute = attribute;
|
||||||
return atom;
|
return atom;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user