patch 9.1.0414: Unable to leave long line with 'smoothscroll' and 'scrolloff'

Problem:  Unable to leave long line with 'smoothscroll' and 'scrolloff'.
          Corrupted screen near the end of a long line with 'scrolloff'.
          (Ernie Rael, after 9.1.0280)
Solution: Only correct cursor in case scroll_cursor_bot() was not itself
          called to make the cursor visible. Avoid adjusting for
          'scrolloff' beyond the text line height (Luuk van Baal)

fixes: #14726
closes: #14783

Signed-off-by: Luuk van Baal <luukvbaal@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/testdir/dumps/Test_smooth_long_6.dump b/src/testdir/dumps/Test_smooth_long_6.dump
index 507aa46..ba48c28 100644
--- a/src/testdir/dumps/Test_smooth_long_6.dump
+++ b/src/testdir/dumps/Test_smooth_long_6.dump
@@ -3,4 +3,4 @@
 |t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o
 |f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e
 |x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w
-|:|s|e|t| |s|c|r|o|l@1|o| @9|3|,|9|0| @9|6@1|%| 
+| @21|3|,|9|0| @9|6@1|%| 
diff --git a/src/testdir/dumps/Test_smooth_long_7.dump b/src/testdir/dumps/Test_smooth_long_7.dump
index 225207f..222e001 100644
--- a/src/testdir/dumps/Test_smooth_long_7.dump
+++ b/src/testdir/dumps/Test_smooth_long_7.dump
@@ -3,4 +3,4 @@
 |t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o
 |f| |t|e|x|t| |w|i>t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e
 |x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w|i|t|h| |l|o|t|s| |o|f| |t|e|x|t| |w
-|:|s|e|t| |s|c|r|o|l@1|o| @9|3|,|1|7|0| @8|6@1|%| 
+| @21|3|,|1|7|0| @8|6@1|%| 
diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_1.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_1.dump
new file mode 100644
index 0000000..6c1d223
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_long_scrolloff_1.dump
@@ -0,0 +1,8 @@
+| +0&#ffffff0@39
+@40
+@40
+> @39
+@40
+@40
+@40
+@40
diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_2.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_2.dump
new file mode 100644
index 0000000..5b9e20d
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_long_scrolloff_2.dump
@@ -0,0 +1,8 @@
+|<+0#4040ff13#ffffff0@2| +0#0000000&|l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+>t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+| @39
diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_3.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_3.dump
new file mode 100644
index 0000000..5b9e20d
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_long_scrolloff_3.dump
@@ -0,0 +1,8 @@
+|<+0#4040ff13#ffffff0@2| +0#0000000&|l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+>t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+| @39
diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_4.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_4.dump
new file mode 100644
index 0000000..6ecdf5b
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_long_scrolloff_4.dump
@@ -0,0 +1,8 @@
+|<+0#4040ff13#ffffff0@2| +0#0000000&|l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+>t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+| @39
diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_5.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_5.dump
new file mode 100644
index 0000000..5ff26d2
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_long_scrolloff_5.dump
@@ -0,0 +1,8 @@
+|<+0#4040ff13#ffffff0@2| +0#0000000&|l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+>t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+| @39
diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_6.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_6.dump
new file mode 100644
index 0000000..2ef87da
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_long_scrolloff_6.dump
@@ -0,0 +1,8 @@
+|<+0#4040ff13#ffffff0@2| +0#0000000&|l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g|t|w|o| |l|o|n|g
+>t|h|r|e@1| @34
+|f|o|u|r| @35
+@40
diff --git a/src/testdir/dumps/Test_smooth_long_scrolloff_7.dump b/src/testdir/dumps/Test_smooth_long_scrolloff_7.dump
new file mode 100644
index 0000000..c21c022
--- /dev/null
+++ b/src/testdir/dumps/Test_smooth_long_scrolloff_7.dump
@@ -0,0 +1,8 @@
+| +0&#ffffff0@39
+@40
+@40
+@40
+@40
+@40
+> @39
+@40
diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim
index da9e4a1..fa1d032 100644
--- a/src/testdir/test_scroll_opt.vim
+++ b/src/testdir/test_scroll_opt.vim
@@ -1153,4 +1153,39 @@
   bwipe!
 endfunc
 
+func Test_smooth_long_scrolloff()
+  CheckScreendump
+
+  let lines =<< trim END
+    set smoothscroll scrolloff=3
+    call setline(1, ['one', 'two long'->repeat(100), 'three', 'four', 'five', 'six'])
+  END
+  call writefile(lines, 'XSmoothLongScrolloff', 'D')
+  let buf = RunVimInTerminal('-u NONE -S XSmoothLongScrolloff', #{rows: 8, cols: 40})
+  "FIXME: empty screen due to reset_skipcol()/curs_columns() shenanigans
+  call term_sendkeys(buf, ":norm j601|\<CR>")
+  call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_1', {})
+
+  call term_sendkeys(buf, "gj")
+  call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_2', {})
+
+  call term_sendkeys(buf, "gj")
+  call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_3', {})
+
+  call term_sendkeys(buf, "gj")
+  call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_4', {})
+
+  call term_sendkeys(buf, "gj")
+  call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_5', {})
+
+  call term_sendkeys(buf, "gj")
+  call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_6', {})
+
+  call term_sendkeys(buf, "gk")
+  "FIXME: empty screen due to reset_skipcol()/curs_columns() shenanigans
+  call VerifyScreenDump(buf, 'Test_smooth_long_scrolloff_7', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab