diff options
Diffstat (limited to 'src/window.cc')
| -rw-r--r-- | src/window.cc | 60 |
1 files changed, 24 insertions, 36 deletions
diff --git a/src/window.cc b/src/window.cc index 520d77e1..c65bebe8 100644 --- a/src/window.cc +++ b/src/window.cc @@ -132,7 +132,7 @@ const DisplayBuffer& Window::update_display_buffer(const Context& context) return m_display_buffer; kak_assert(&buffer() == &context.buffer()); - const DisplaySetup setup = compute_display_setup(context); + DisplaySetup setup = compute_display_setup(context); for (LineCount line = 0; line < setup.line_count; ++line) { @@ -144,8 +144,26 @@ const DisplayBuffer& Window::update_display_buffer(const Context& context) m_display_buffer.compute_range(); const BufferRange range{{0,0}, buffer().end_coord()}; - m_builtin_highlighters.highlight({context, setup, HighlightPass::Wrap, {}}, m_display_buffer, range); - m_builtin_highlighters.highlight({context, setup, HighlightPass::Move, {}}, m_display_buffer, range); + for (auto pass : {HighlightPass::Replace, HighlightPass::Wrap, HighlightPass::Move}) + m_builtin_highlighters.highlight({context, setup, pass, {}}, m_display_buffer, range); + + if (context.ensure_cursor_visible) + { + auto cursor_pos = display_coord(context.selections().main().cursor()); + kak_assert(cursor_pos); + + if (auto line_overflow = cursor_pos->line - m_dimensions.line + setup.scroll_offset.line + 1; line_overflow > 0) + { + lines.erase(lines.begin(), lines.begin() + (size_t)line_overflow); + setup.first_line = lines.begin()->range().begin.line; + } + + auto max_first_column = cursor_pos->column - (setup.widget_columns + setup.scroll_offset.column); + setup.first_column = std::min(setup.first_column, max_first_column); + + auto min_first_column = cursor_pos->column - (m_dimensions.column - setup.scroll_offset.column) + 1; + setup.first_column = std::max(setup.first_column, min_first_column); + } for (auto& line : m_display_buffer.lines()) line.trim_from(setup.widget_columns, setup.first_column, m_dimensions.column); @@ -203,11 +221,9 @@ DisplaySetup Window::compute_display_setup(const Context& context) const offset.line = std::min(offset.line, (m_dimensions.line + 1) / 2); offset.column = std::min(offset.column, (m_dimensions.column + 1) / 2); - const int tabstop = context.options()["tabstop"].get<int>(); const auto& cursor = context.selections().main().cursor(); - bool ensure_cursor_visible = context.ensure_cursor_visible; - if (ensure_cursor_visible) + if (context.ensure_cursor_visible) { if (cursor.line - offset.line < win_pos.line) win_pos.line = std::max(0_line, cursor.line - offset.line); @@ -216,39 +232,11 @@ DisplaySetup Window::compute_display_setup(const Context& context) const } win_pos.line = std::min(win_pos.line, buffer().line_count()-1); - DisplaySetup setup{ - win_pos.line, - m_dimensions.line, - win_pos.column, - 0_col, - {cursor.line - win_pos.line, - get_column(buffer(), tabstop, cursor) - win_pos.column}, - offset, - ensure_cursor_visible - }; - for (auto pass : { HighlightPass::Move, HighlightPass::Wrap }) + DisplaySetup setup{win_pos.line, m_dimensions.line, win_pos.column, 0_col, offset}; + for (auto pass : {HighlightPass::Move, HighlightPass::Wrap, HighlightPass::Replace}) m_builtin_highlighters.compute_display_setup({context, setup, pass, {}}, setup); check_display_setup(setup, *this); - // now ensure the cursor column is visible - if (ensure_cursor_visible) - { - auto underflow = std::max(-setup.first_column, - setup.cursor_pos.column - setup.scroll_offset.column); - if (underflow < 0) - { - setup.first_column += underflow; - setup.cursor_pos.column -= underflow; - } - auto overflow = setup.cursor_pos.column + setup.scroll_offset.column - (m_dimensions.column - setup.widget_columns) + 1; - if (overflow > 0) - { - setup.first_column += overflow; - setup.cursor_pos.column -= overflow; - } - check_display_setup(setup, *this); - } - return setup; } |
