summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-04-23 21:11:50 +0100
committerMaxime Coste <frrrwww@gmail.com>2015-04-23 21:11:50 +0100
commit840e58e0b1d3ca977a411b3d048009eff5f4bdd5 (patch)
tree620363c77fbea93db364df3ee5ed27a8a0728344
parente0f7a6f0bebe30bf57592b3fc4f9970673fd38a3 (diff)
NCurses: When mode line is too long, trim it rather hiding it
-rw-r--r--src/display_buffer.cc4
-rw-r--r--src/display_buffer.hh2
-rw-r--r--src/ncurses_ui.cc19
-rw-r--r--src/window.cc2
4 files changed, 19 insertions, 8 deletions
diff --git a/src/display_buffer.cc b/src/display_buffer.cc
index 3bcf37b2..bfd2c780 100644
--- a/src/display_buffer.cc
+++ b/src/display_buffer.cc
@@ -169,11 +169,11 @@ CharCount DisplayLine::length() const
return len;
}
-void DisplayLine::trim(CharCount first_char, CharCount char_count)
+void DisplayLine::trim(CharCount first_char, CharCount char_count, bool only_buffer)
{
for (auto it = begin(); first_char > 0 and it != end(); )
{
- if (not it->has_buffer_range())
+ if (only_buffer and not it->has_buffer_range())
{
++it;
continue;
diff --git a/src/display_buffer.hh b/src/display_buffer.hh
index 3d3da830..9f0e0fb7 100644
--- a/src/display_buffer.hh
+++ b/src/display_buffer.hh
@@ -114,7 +114,7 @@ public:
// remove first_char from the begining of the line, and make sure
// the line is less that char_count character
- void trim(CharCount first_char, CharCount char_count);
+ void trim(CharCount first_char, CharCount char_count, bool only_buffer);
void optimize();
private:
diff --git a/src/ncurses_ui.cc b/src/ncurses_ui.cc
index d18dc9ba..f0870a20 100644
--- a/src/ncurses_ui.cc
+++ b/src/ncurses_ui.cc
@@ -388,14 +388,25 @@ void NCursesUI::draw(const DisplayBuffer& display_buffer,
wmove(m_window, status_line_pos, 0);
wclrtoeol(m_window);
draw_line(status_line, 0);
- CharCount status_len = mode_line.length();
- // only draw mode_line if it does not overlap one status line
- if (m_dimensions.column - status_line.length() > status_len + 1)
+ 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 - status_len;
+ CharCount col = m_dimensions.column - mode_len;
wmove(m_window, status_line_pos, (int)col);
draw_line(mode_line, col);
}
+ else if (remaining > 2)
+ {
+ DisplayLine trimmed_mode_line = mode_line;
+ trimmed_mode_line.trim(mode_len + 2 - remaining, remaining - 2, false);
+ trimmed_mode_line.insert(trimmed_mode_line.begin(), { "<" });
+ kak_assert(trimmed_mode_line.length() == remaining - 1);
+
+ CharCount col = m_dimensions.column - remaining + 1;
+ wmove(m_window, status_line_pos, (int)col);
+ draw_line(trimmed_mode_line, col);
+ }
const char* tsl = tigetstr((char*)"tsl");
const char* fsl = tigetstr((char*)"fsl");
diff --git a/src/window.cc b/src/window.cc
index 1c205d8d..d96ca331 100644
--- a/src/window.cc
+++ b/src/window.cc
@@ -83,7 +83,7 @@ void Window::update_display_buffer(const Context& context)
// cut the start of the line before m_position.column
for (auto& line : lines)
- line.trim(m_position.column, m_dimensions.column);
+ line.trim(m_position.column, m_dimensions.column, true);
m_display_buffer.optimize();
m_timestamp = buffer().timestamp();