Add support for Default face

The Default face is used to set default color values, if set
to default (the default), refers to terminal default colors.
This commit is contained in:
Maxime Coste 2015-06-04 13:49:28 +01:00
parent f30cd317b0
commit 9668dccea9
6 changed files with 32 additions and 10 deletions

View File

@ -149,9 +149,13 @@ public:
void optimize();
void compute_range();
void set_default_face(const Face& face) { m_default_face = face; }
const Face& default_face() const { return m_default_face; }
private:
LineList m_lines;
BufferRange m_range;
Face m_default_face;
};
}

View File

@ -91,6 +91,7 @@ CandidateList FaceRegistry::complete_alias_name(StringView prefix,
FaceRegistry::FaceRegistry()
: m_aliases{
{ "Default", Face{ Color::Default, Color::Default } },
{ "PrimarySelection", Face{ Color::White, Color::Blue } },
{ "SecondarySelection", Face{ Color::Black, Color::Blue } },
{ "PrimaryCursor", Face{ Color::Black, Color::White } },

View File

@ -206,13 +206,18 @@ static int get_color_pair(const Face& face)
}
}
static void set_face(WINDOW* window, Face face)
void set_face(WINDOW* window, Face face, const Face& default_face)
{
static int current_pair = -1;
if (current_pair != -1)
wattroff(window, COLOR_PAIR(current_pair));
if (face.fg == Color::Default)
face.fg = default_face.fg;
if (face.bg == Color::Default)
face.bg = default_face.bg;
if (face.fg != Color::Default or face.bg != Color::Default)
{
current_pair = get_color_pair(face);
@ -333,11 +338,12 @@ void NCursesUI::update_dimensions()
--m_dimensions.line;
}
void NCursesUI::draw_line(const DisplayLine& line, CharCount col_index) const
void NCursesUI::draw_line(const DisplayLine& line, CharCount col_index,
const Face& default_face) const
{
for (const DisplayAtom& atom : line)
{
set_face(m_window, atom.face);
set_face(m_window, atom.face, default_face);
StringView content = atom.content();
if (content.empty())
@ -365,6 +371,9 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
const DisplayLine& status_line,
const DisplayLine& mode_line)
{
const Face& default_face = display_buffer.default_face();
wbkgdset(m_window, COLOR_PAIR(get_color_pair(default_face)));
check_resize();
LineCount line_index = m_status_on_top ? 1 : 0;
@ -372,11 +381,11 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
{
wmove(m_window, (int)line_index, 0);
wclrtoeol(m_window);
draw_line(line, 0);
draw_line(line, 0, default_face);
++line_index;
}
set_face(m_window, { Color::Blue, Color::Default });
set_face(m_window, { Color::Blue, Color::Default }, default_face);
while (line_index < m_dimensions.line + (m_status_on_top ? 1 : 0))
{
wmove(m_window, (int)line_index++, 0);
@ -387,14 +396,14 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
int status_line_pos = m_status_on_top ? 0 : (int)m_dimensions.line;
wmove(m_window, status_line_pos, 0);
wclrtoeol(m_window);
draw_line(status_line, 0);
draw_line(status_line, 0, default_face);
const auto mode_len = mode_line.length();
const auto remaining = m_dimensions.column - status_line.length();
if (mode_len < remaining)
{
CharCount col = m_dimensions.column - mode_len;
wmove(m_window, status_line_pos, (int)col);
draw_line(mode_line, col);
draw_line(mode_line, col, default_face);
}
else if (remaining > 2)
{
@ -405,7 +414,7 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
CharCount col = m_dimensions.column - remaining + 1;
wmove(m_window, status_line_pos, (int)col);
draw_line(trimmed_mode_line, col);
draw_line(trimmed_mode_line, col, default_face);
}
const char* tsl = tigetstr((char*)"tsl");

View File

@ -51,7 +51,8 @@ public:
private:
void check_resize();
void redraw();
void draw_line(const DisplayLine& line, CharCount col_index) const;
void draw_line(const DisplayLine& line, CharCount col_index,
const Face& default_face) const;
NCursesWin* m_window = nullptr;

View File

@ -2,6 +2,7 @@
#include "assert.hh"
#include "context.hh"
#include "face_registry.hh"
#include "highlighter.hh"
#include "hook_manager.hh"
#include "client.hh"
@ -65,6 +66,7 @@ void Window::update_display_buffer(const Context& context)
kak_assert(&buffer() == &context.buffer());
scroll_to_keep_selection_visible_ifn(context);
m_display_buffer.set_default_face(get_face("Default"));
DisplayBuffer::LineList& lines = m_display_buffer.lines();
lines.clear();
@ -283,6 +285,11 @@ ByteCoordAndTarget Window::offset_coord(ByteCoordAndTarget coord, LineCount offs
return { find_buffer_coord(lines[1], buffer(), column), column };
}
void Window::clear_display_buffer()
{
m_display_buffer = DisplayBuffer{};
}
void Window::on_option_changed(const Option& option)
{
run_hook_in_own_context("WinSetOption",

View File

@ -44,7 +44,7 @@ public:
ByteCoord offset_coord(ByteCoord coord, CharCount offset);
ByteCoordAndTarget offset_coord(ByteCoordAndTarget coord, LineCount offset);
void clear_display_buffer() { m_display_buffer = DisplayBuffer{}; }
void clear_display_buffer();
private:
Window(const Window&) = delete;