]> Sergey Matveev's repositories - st.git/commitdiff
Fix empty selection highlighting bug.
authornoname <noname@inventati.org>
Sun, 3 May 2015 19:28:10 +0000 (19:28 +0000)
committerRoberto E. Vargas Caballero <k0ga@shike2.com>
Mon, 4 May 2015 10:06:43 +0000 (12:06 +0200)
When user clicks LMB, one character is selected, but will not be copied
to selection until the user moves cursor a bit. Therefore, the character
should not be highlighted as selected yet.

Before the patch, the trick was not to mark line as dirty to avoid
highlighting it. However, if user has already selected something and
clicks in line that contains selection, selclear sets the line as dirty
and one character is highlighted when it should not.

This patch replaces dirty trick with explicit check for sel.mode inside
selected().

st.c

diff --git a/st.c b/st.c
index cf6556a2168c50cd0c15def4fc55c4a82b58b1f1..3eb66fa92ca1df7b593437f3a6e9a14b13adbb5c 100644 (file)
--- a/st.c
+++ b/st.c
@@ -716,6 +716,9 @@ selnormalize(void) {
 
 bool
 selected(int x, int y) {
+       if(sel.mode == SEL_EMPTY)
+               return false;
+
        if(sel.type == SEL_RECTANGULAR)
                return BETWEEN(y, sel.nb.y, sel.ne.y)
                    && BETWEEN(x, sel.nb.x, sel.ne.x);
@@ -921,14 +924,9 @@ bpress(XEvent *e) {
                }
                selnormalize();
 
-               /*
-                * Draw selection, unless it's regular and we don't want to
-                * make clicks visible
-                */
-               if(sel.snap != 0) {
+               if(sel.snap != 0)
                        sel.mode = SEL_READY;
-                       tsetdirt(sel.nb.y, sel.ne.y);
-               }
+               tsetdirt(sel.nb.y, sel.ne.y);
                sel.tclick2 = sel.tclick1;
                sel.tclick1 = now;
        }