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:
parent
f30cd317b0
commit
9668dccea9
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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 } },
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user