From 9668dccea9bfc8ef94767911384a6209b8f87c1c Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Thu, 4 Jun 2015 13:49:28 +0100 Subject: [PATCH] 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. --- src/display_buffer.hh | 4 ++++ src/face_registry.cc | 1 + src/ncurses_ui.cc | 25 +++++++++++++++++-------- src/ncurses_ui.hh | 3 ++- src/window.cc | 7 +++++++ src/window.hh | 2 +- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/display_buffer.hh b/src/display_buffer.hh index 35381058..9d264279 100644 --- a/src/display_buffer.hh +++ b/src/display_buffer.hh @@ -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; }; } diff --git a/src/face_registry.cc b/src/face_registry.cc index 1a972852..cbbd32ed 100644 --- a/src/face_registry.cc +++ b/src/face_registry.cc @@ -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 } }, diff --git a/src/ncurses_ui.cc b/src/ncurses_ui.cc index 46d6d76e..7ea51ef2 100644 --- a/src/ncurses_ui.cc +++ b/src/ncurses_ui.cc @@ -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"); diff --git a/src/ncurses_ui.hh b/src/ncurses_ui.hh index 2f992d2e..5227c4be 100644 --- a/src/ncurses_ui.hh +++ b/src/ncurses_ui.hh @@ -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; diff --git a/src/window.cc b/src/window.cc index 7685b97c..0cacdad2 100644 --- a/src/window.cc +++ b/src/window.cc @@ -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", diff --git a/src/window.hh b/src/window.hh index 0ad70a54..f83377d7 100644 --- a/src/window.hh +++ b/src/window.hh @@ -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;