From e3bebedbad5590b3d51b6c38f7b28cbc3416c22f Mon Sep 17 00:00:00 2001 From: Tim Stack Date: Thu, 15 Jun 2023 21:52:33 -0700 Subject: [PATCH] [cursor] following should only be done when the last line is selected --- src/lnav.indexing.cc | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/lnav.indexing.cc b/src/lnav.indexing.cc index d39c784a..9006c26a 100644 --- a/src/lnav.indexing.cc +++ b/src/lnav.indexing.cc @@ -188,15 +188,26 @@ rebuild_indexes(nonstd::optional deadline) logfile_sub_source& lss = lnav_data.ld_log_source; textview_curses& log_view = lnav_data.ld_views[LNV_LOG]; textview_curses& text_view = lnav_data.ld_views[LNV_TEXT]; - vis_line_t old_bottoms[LNV__MAX]; bool scroll_downs[LNV__MAX]; size_t retval = 0; for (int lpc = 0; lpc < LNV__MAX; lpc++) { - old_bottoms[lpc] = lnav_data.ld_views[lpc].get_top_for_last_row(); - scroll_downs[lpc] - = (lnav_data.ld_views[lpc].get_top() >= old_bottoms[lpc]) - && !(lnav_data.ld_flags & LNF_HEADLESS); + auto& view = lnav_data.ld_views[lpc]; + + if (view.is_selectable()) { + auto inner_height = view.get_inner_height(); + + if (inner_height > 0_vl) { + scroll_downs[lpc] + = (view.get_selection() == inner_height - 1_vl) + && !(lnav_data.ld_flags & LNF_HEADLESS); + } else { + scroll_downs[lpc] = !(lnav_data.ld_flags & LNF_HEADLESS); + } + } else { + scroll_downs[lpc] = (view.get_top() >= view.get_top_for_last_row()) + && !(lnav_data.ld_flags & LNF_HEADLESS); + } } { @@ -213,7 +224,6 @@ rebuild_indexes(nonstd::optional deadline) if (tss->current_file() != cb.front_file) { tss->to_front(cb.front_file); - old_bottoms[LNV_TEXT] = -1_vl; } nonstd::optional new_top_opt; @@ -323,12 +333,20 @@ rebuild_indexes(nonstd::optional deadline) } for (int lpc = 0; lpc < LNV__MAX; lpc++) { - textview_curses& scroll_view = lnav_data.ld_views[lpc]; + auto& scroll_view = lnav_data.ld_views[lpc]; if (scroll_downs[lpc] && scroll_view.get_top_for_last_row() > scroll_view.get_top()) { - scroll_view.set_top(scroll_view.get_top_for_last_row()); + if (scroll_view.is_selectable()) { + auto inner_height = scroll_view.get_inner_height(); + + if (inner_height > 0_vl) { + scroll_view.set_selection(inner_height - 1_vl); + } + } else { + scroll_view.set_top(scroll_view.get_top_for_last_row()); + } } }