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 optimize();
|
||||||
void compute_range();
|
void compute_range();
|
||||||
|
|
||||||
|
void set_default_face(const Face& face) { m_default_face = face; }
|
||||||
|
const Face& default_face() const { return m_default_face; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LineList m_lines;
|
LineList m_lines;
|
||||||
BufferRange m_range;
|
BufferRange m_range;
|
||||||
|
Face m_default_face;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,6 +91,7 @@ CandidateList FaceRegistry::complete_alias_name(StringView prefix,
|
||||||
|
|
||||||
FaceRegistry::FaceRegistry()
|
FaceRegistry::FaceRegistry()
|
||||||
: m_aliases{
|
: m_aliases{
|
||||||
|
{ "Default", Face{ Color::Default, Color::Default } },
|
||||||
{ "PrimarySelection", Face{ Color::White, Color::Blue } },
|
{ "PrimarySelection", Face{ Color::White, Color::Blue } },
|
||||||
{ "SecondarySelection", Face{ Color::Black, Color::Blue } },
|
{ "SecondarySelection", Face{ Color::Black, Color::Blue } },
|
||||||
{ "PrimaryCursor", Face{ Color::Black, Color::White } },
|
{ "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;
|
static int current_pair = -1;
|
||||||
|
|
||||||
if (current_pair != -1)
|
if (current_pair != -1)
|
||||||
wattroff(window, COLOR_PAIR(current_pair));
|
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)
|
if (face.fg != Color::Default or face.bg != Color::Default)
|
||||||
{
|
{
|
||||||
current_pair = get_color_pair(face);
|
current_pair = get_color_pair(face);
|
||||||
|
@ -333,11 +338,12 @@ void NCursesUI::update_dimensions()
|
||||||
--m_dimensions.line;
|
--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)
|
for (const DisplayAtom& atom : line)
|
||||||
{
|
{
|
||||||
set_face(m_window, atom.face);
|
set_face(m_window, atom.face, default_face);
|
||||||
|
|
||||||
StringView content = atom.content();
|
StringView content = atom.content();
|
||||||
if (content.empty())
|
if (content.empty())
|
||||||
|
@ -365,6 +371,9 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
|
||||||
const DisplayLine& status_line,
|
const DisplayLine& status_line,
|
||||||
const DisplayLine& mode_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();
|
check_resize();
|
||||||
|
|
||||||
LineCount line_index = m_status_on_top ? 1 : 0;
|
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);
|
wmove(m_window, (int)line_index, 0);
|
||||||
wclrtoeol(m_window);
|
wclrtoeol(m_window);
|
||||||
draw_line(line, 0);
|
draw_line(line, 0, default_face);
|
||||||
++line_index;
|
++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))
|
while (line_index < m_dimensions.line + (m_status_on_top ? 1 : 0))
|
||||||
{
|
{
|
||||||
wmove(m_window, (int)line_index++, 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;
|
int status_line_pos = m_status_on_top ? 0 : (int)m_dimensions.line;
|
||||||
wmove(m_window, status_line_pos, 0);
|
wmove(m_window, status_line_pos, 0);
|
||||||
wclrtoeol(m_window);
|
wclrtoeol(m_window);
|
||||||
draw_line(status_line, 0);
|
draw_line(status_line, 0, default_face);
|
||||||
const auto mode_len = mode_line.length();
|
const auto mode_len = mode_line.length();
|
||||||
const auto remaining = m_dimensions.column - status_line.length();
|
const auto remaining = m_dimensions.column - status_line.length();
|
||||||
if (mode_len < remaining)
|
if (mode_len < remaining)
|
||||||
{
|
{
|
||||||
CharCount col = m_dimensions.column - mode_len;
|
CharCount col = m_dimensions.column - mode_len;
|
||||||
wmove(m_window, status_line_pos, (int)col);
|
wmove(m_window, status_line_pos, (int)col);
|
||||||
draw_line(mode_line, col);
|
draw_line(mode_line, col, default_face);
|
||||||
}
|
}
|
||||||
else if (remaining > 2)
|
else if (remaining > 2)
|
||||||
{
|
{
|
||||||
|
@ -405,7 +414,7 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
|
||||||
|
|
||||||
CharCount col = m_dimensions.column - remaining + 1;
|
CharCount col = m_dimensions.column - remaining + 1;
|
||||||
wmove(m_window, status_line_pos, (int)col);
|
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");
|
const char* tsl = tigetstr((char*)"tsl");
|
||||||
|
|
|
@ -51,7 +51,8 @@ public:
|
||||||
private:
|
private:
|
||||||
void check_resize();
|
void check_resize();
|
||||||
void redraw();
|
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;
|
NCursesWin* m_window = nullptr;
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "assert.hh"
|
#include "assert.hh"
|
||||||
#include "context.hh"
|
#include "context.hh"
|
||||||
|
#include "face_registry.hh"
|
||||||
#include "highlighter.hh"
|
#include "highlighter.hh"
|
||||||
#include "hook_manager.hh"
|
#include "hook_manager.hh"
|
||||||
#include "client.hh"
|
#include "client.hh"
|
||||||
|
@ -65,6 +66,7 @@ void Window::update_display_buffer(const Context& context)
|
||||||
kak_assert(&buffer() == &context.buffer());
|
kak_assert(&buffer() == &context.buffer());
|
||||||
scroll_to_keep_selection_visible_ifn(context);
|
scroll_to_keep_selection_visible_ifn(context);
|
||||||
|
|
||||||
|
m_display_buffer.set_default_face(get_face("Default"));
|
||||||
DisplayBuffer::LineList& lines = m_display_buffer.lines();
|
DisplayBuffer::LineList& lines = m_display_buffer.lines();
|
||||||
lines.clear();
|
lines.clear();
|
||||||
|
|
||||||
|
@ -283,6 +285,11 @@ ByteCoordAndTarget Window::offset_coord(ByteCoordAndTarget coord, LineCount offs
|
||||||
return { find_buffer_coord(lines[1], buffer(), column), column };
|
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)
|
void Window::on_option_changed(const Option& option)
|
||||||
{
|
{
|
||||||
run_hook_in_own_context("WinSetOption",
|
run_hook_in_own_context("WinSetOption",
|
||||||
|
|
|
@ -44,7 +44,7 @@ public:
|
||||||
ByteCoord offset_coord(ByteCoord coord, CharCount offset);
|
ByteCoord offset_coord(ByteCoord coord, CharCount offset);
|
||||||
ByteCoordAndTarget offset_coord(ByteCoordAndTarget coord, LineCount offset);
|
ByteCoordAndTarget offset_coord(ByteCoordAndTarget coord, LineCount offset);
|
||||||
|
|
||||||
void clear_display_buffer() { m_display_buffer = DisplayBuffer{}; }
|
void clear_display_buffer();
|
||||||
private:
|
private:
|
||||||
Window(const Window&) = delete;
|
Window(const Window&) = delete;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user