aboutsummaryrefslogtreecommitdiff
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
parenta6bbc0c96b0a1db804061b0db79101c6b26aec57 (diff)
downloadst-2fc7e532b23e2f820c6b73d352ec7c41fefa45b5.tar.gz
st-2fc7e532b23e2f820c6b73d352ec7c41fefa45b5.tar.bz2
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)
void
selscroll(int orig, int n)
{
- if (sel.ob.x == -1)
+ if (sel.ob.x == -1 || sel.alt != IS_SET(MODE_ALTSCREEN))
return;
if (BETWEEN(sel.nb.y, orig, term.bot) != BETWEEN(sel.ne.y, orig, term.bot)) {