From 780509aedf5c914d1615d57019485ef85c16f669 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 13 Apr 2024 10:32:49 +0800 Subject: [PATCH] fix(move): fix using the wrong window (#28312) --- src/nvim/move.c | 37 ++++++++++++------------- test/functional/ui/decorations_spec.lua | 2 +- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/nvim/move.c b/src/nvim/move.c index 4448091b8a..9de86e5aeb 100644 --- a/src/nvim/move.c +++ b/src/nvim/move.c @@ -299,7 +299,7 @@ void update_topline(win_T *wp) // scrolling down is never needed. if (wp->w_cursor.lnum < wp->w_topline) { check_topline = true; - } else if (check_top_offset()) { + } else if (check_top_offset(wp)) { check_topline = true; } else if (wp->w_skipcol > 0 && wp->w_cursor.lnum == wp->w_topline) { colnr_T vcol; @@ -349,7 +349,7 @@ void update_topline(win_T *wp) if (n >= halfheight) { scroll_cursor_halfway(wp, false, false); } else { - scroll_cursor_top(wp, scrolljump_value(), false); + scroll_cursor_top(wp, scrolljump_value(wp), false); check_botline = true; } } else { @@ -422,7 +422,7 @@ void update_topline(win_T *wp) line_count = wp->w_cursor.lnum - wp->w_botline + 1 + (int)(*so_ptr); } if (line_count <= wp->w_height_inner + 1) { - scroll_cursor_bot(wp, scrolljump_value(), false); + scroll_cursor_bot(wp, scrolljump_value(wp), false); } else { scroll_cursor_halfway(wp, false, false); } @@ -455,33 +455,30 @@ void update_topline(win_T *wp) *so_ptr = save_so; } -// Return the scrolljump value to use for the current window. -// When 'scrolljump' is positive use it as-is. -// When 'scrolljump' is negative use it as a percentage of the window height. -static int scrolljump_value(void) +/// Return the scrolljump value to use for the window "wp". +/// When 'scrolljump' is positive use it as-is. +/// When 'scrolljump' is negative use it as a percentage of the window height. +static int scrolljump_value(win_T *wp) { - int result = p_sj >= 0 ? (int)p_sj : (curwin->w_height_inner * (int)(-p_sj)) / 100; + int result = p_sj >= 0 ? (int)p_sj : (wp->w_height_inner * (int)(-p_sj)) / 100; return result; } -// Return true when there are not 'scrolloff' lines above the cursor for the -// current window. -static bool check_top_offset(void) +/// Return true when there are not 'scrolloff' lines above the cursor for window "wp". +static bool check_top_offset(win_T *wp) { - int so = get_scrolloff_value(curwin); - if (curwin->w_cursor.lnum < curwin->w_topline + so - || hasAnyFolding(curwin)) { + int so = get_scrolloff_value(wp); + if (wp->w_cursor.lnum < wp->w_topline + so || hasAnyFolding(wp)) { lineoff_T loff; - loff.lnum = curwin->w_cursor.lnum; + loff.lnum = wp->w_cursor.lnum; loff.fill = 0; - int n = curwin->w_topfill; // always have this context + int n = wp->w_topfill; // always have this context // Count the visible screen lines above the cursor line. while (n < so) { - topline_back(curwin, &loff); + topline_back(wp, &loff); // Stop when included a line above the window. - if (loff.lnum < curwin->w_topline - || (loff.lnum == curwin->w_topline - && loff.fill > 0)) { + if (loff.lnum < wp->w_topline + || (loff.lnum == wp->w_topline && loff.fill > 0)) { break; } n += loff.height; diff --git a/test/functional/ui/decorations_spec.lua b/test/functional/ui/decorations_spec.lua index 843121b45a..eea62140ce 100644 --- a/test/functional/ui/decorations_spec.lua +++ b/test/functional/ui/decorations_spec.lua @@ -4895,7 +4895,7 @@ if (h->n_buckets < new_n_buckets) { // expand ]]) end) - it('works with full page scrolling #28390', function() + it('works with full page scrolling #28290', function() screen:try_resize(20, 8) command('call setline(1, range(20))') api.nvim_buf_set_extmark(0, ns, 10, 0, { virt_lines = {{{'VIRT1'}}, {{'VIRT2'}}} })