]> Sergey Matveev's repositories - st.git/commitdiff
Don't scroll selection on the other screen
authorPeter Hofmann <scm@uninformativ.de>
Sat, 7 Oct 2023 05:40:07 +0000 (07:40 +0200)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Sat, 7 Oct 2023 10:16:59 +0000 (12:16 +0200)
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".

st.c

diff --git a/st.c b/st.c
index 623376e1b172781f66dd21ef220e165a8146eaad..3d250ddcdb95707453254d3f717dd8022d122fb9 100644 (file)
--- 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)) {