From: Christoph Lohmann <20h@r-36.net>
Date: Thu, 25 Apr 2013 04:28:11 +0000 (+0200)
Subject: Fixing the selection handling to allow one char selection.
X-Git-Url: https://git.xinqibao.xyz/st.git/commitdiff_plain/1b2751f5c24ca06afbb68e41e73fc9fce6c6b521?hp=0851f2be2ab48ee3a67ef2287c09bd67622dcd8e

Fixing the selection handling to allow one char selection.

Thanks Alexander Sedov <alex0player@gmail.com> for suggesting the fix!
---

diff --git a/st.c b/st.c
index c0a4780..8d27c94 100644
--- a/st.c
+++ b/st.c
@@ -785,11 +785,8 @@ bpress(XEvent *e) {
 		sel.ey = sel.by = y2row(e->xbutton.y);
 
 		/*
-		 * Snap handling.
-		 * If user clicks are fasst enough (e.g. below timeouts),
-		 * we ignore if his hand slipped left or down and accidentally
-		 * selected more; we are just snapping to whatever we're
-		 * snapping.
+		 * If the user clicks below predefined timeouts specific
+		 * snapping behaviour is exposed.
 		 */
 		if(TIMEDIFF(now, sel.tclick2) <= tripleclicktimeout) {
 			sel.snap = SNAP_LINE;
@@ -809,7 +806,8 @@ bpress(XEvent *e) {
 		 * 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++;
 			tsetdirt(sel.b.y, sel.e.y);
 			draw();
 		}
@@ -987,14 +985,14 @@ brelease(XEvent *e) {
 	if(e->xbutton.button == Button2) {
 		selpaste(NULL);
 	} else if(e->xbutton.button == Button1) {
-		sel.mode = 0;
-		getbuttoninfo(e);
-		term.dirty[sel.ey] = 1;
-		if(sel.bx == sel.ex && sel.by == sel.ey) {
+		if(sel.mode < 2) {
 			sel.bx = -1;
 		} else {
+			getbuttoninfo(e);
 			selcopy();
 		}
+		sel.mode = 0;
+		term.dirty[sel.ey] = 1;
 	}
 }
 
@@ -1010,6 +1008,7 @@ bmotion(XEvent *e) {
 	if(!sel.mode)
 		return;
 
+	sel.mode++;
 	oldey = sel.ey;
 	oldex = sel.ex;
 	oldsby = sel.b.y;