summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Hofmann <scm@uninformativ.de>2023-10-07 07:40:07 +0200
committerHiltjo Posthuma <hiltjo@codemadness.org>2023-10-07 12:16:59 +0200
commit2fc7e532b23e2f820c6b73d352ec7c41fefa45b5 (patch)
tree33e02e000a5cabdca94add480200daf6a10ce0b3
parentFix bounds checks of dc.col (diff)
downloadst-2fc7e532b23e2f820c6b73d352ec7c41fefa45b5.tar.gz
st-2fc7e532b23e2f820c6b73d352ec7c41fefa45b5.zip
Don't scroll selection on the other screen
Fixes garbage selections when switching to/from the alternate screen. How to reproduce: - Be in primary screen. - Select something. - Run this (switches to alternate screen, positions the cursor at the bottom, triggers selscroll(), and then goes back to primary screen): tput smcup; tput cup $(tput lines) 0; echo foo; tput rmcup - Notice how the (visual) selection now covers a different line. The reason is that selscroll() calls selnormalize() and that cannot find the original range anymore. It's all empty lines now, so it snaps to "select the whole line".
-rw-r--r--st.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/st.c b/st.c
index 623376e..3d250dd 100644
--- a/st.c
+++ b/st.c
@@ -1097,7 +1097,7 @@ tscrollup(int orig, int n)
1097void 1097void
1098selscroll(int orig, int n) 1098selscroll(int orig, int n)
1099{ 1099{
1100 if (sel.ob.x == -1) 1100 if (sel.ob.x == -1 || sel.alt != IS_SET(MODE_ALTSCREEN))
1101 return; 1101 return;
1102 1102
1103 if (BETWEEN(sel.nb.y, orig, term.bot) != BETWEEN(sel.ne.y, orig, term.bot)) { 1103 if (BETWEEN(sel.nb.y, orig, term.bot) != BETWEEN(sel.ne.y, orig, term.bot)) {