git: 9front

Download patch

ref: 6e9301e0ed6c1ac1391c2b9e8d46ed59af75eb2e
parent: 1815cc52e202fc77263e25e4f26e1d89e87aed84
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Apr 25 11:18:04 EDT 2020

tweak selection criteria

grow selection from point of click, not start of selection region.
starting at the beginning of the selection region causes the match
logic to kick in, which is confusing.

--- a/sys/src/cmd/acme/dat.h
+++ b/sys/src/cmd/acme/dat.h
@@ -203,7 +203,7 @@
 void		textcommit(Text*, int);
 void		textconstrain(Text*, uint, uint, uint*, uint*);
 void		textdelete(Text*, uint, uint, int);
-void		textstretchsel(Text*, uint*, uint*, int);
+void		textstretchsel(Text*, uint, uint*, uint*, int);
 void		textfill(Text*);
 void		textframescroll(Text*, int);
 void		textinit(Text*, File*, Rectangle, Reffont*, Image**);
--- a/sys/src/cmd/acme/text.c
+++ b/sys/src/cmd/acme/text.c
@@ -932,7 +932,7 @@
 	if(mouse->msec-clickmsec >= 500 || selecttext != t || clickcount > 3)
 		clickcount = 0;
 	if(clickcount >= 1 && selecttext==t && mouse->msec-clickmsec < 500){
-		textstretchsel(t, &q0, &q1, clickcount);
+		textstretchsel(t, selectq, &q0, &q1, clickcount);
 		textsetselect(t, q0, q1);
 		flushimage(display, 1);
 		x = mouse->xy.x;
@@ -951,7 +951,7 @@
 		mouse->xy.y = y;
 		q0 = t->q0;	/* may have changed */
 		q1 = t->q1;
-		selectq = q0;
+		selectq = t->org+frcharofpt(t, mouse->xy);;
 	}
 	if(mouse->buttons == b && clickcount == 0){
 		t->Frame.scroll = framescroll;
@@ -971,7 +971,7 @@
 	}
 	if(q0 == q1){
 		if(q0==t->q0 && mouse->msec-clickmsec<500)
-			textstretchsel(t, &q0, &q1, clickcount);
+			textstretchsel(t, selectq, &q0, &q1, clickcount);
 		else
 			clicktext = t;
 		clickmsec = mouse->msec;
@@ -1304,12 +1304,14 @@
 }
 
 void
-textstretchsel(Text *t, uint *q0, uint *q1, int mode)
+textstretchsel(Text *t, uint mp, uint *q0, uint *q1, int mode)
 {
 	int c, i;
 	Rune *r, *l, *p;
 	uint q;
 
+	*q0 = mp;
+	*q1 = mp;
 	for(i=0; left[i]!=nil; i++){
 		q = *q0;
 		l = left[i];
--- a/sys/src/cmd/rio/dat.h
+++ b/sys/src/cmd/rio/dat.h
@@ -195,7 +195,7 @@
 void		wcurrent(Window*);
 void		wcut(Window*);
 void		wdelete(Window*, uint, uint);
-void		wstretchsel(Window*, uint*, uint*, int);
+void		wstretchsel(Window*, uint, uint*, uint*, int);
 void		wfill(Window*);
 void		wframescroll(Window*, int);
 void		wkeyctl(Window*, Rune);
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -1024,7 +1024,7 @@
 		clickcount = 0;
 	if(clickwin == w && clickcount >= 1 && w->mc.msec-clickmsec < 500){
 		mode = (clickcount > 2) ? 2 : clickcount;
-		wstretchsel(w, &q0, &q1, mode);
+		wstretchsel(w, selectq, &q0, &q1, mode);
 		wsetselect(w, q0, q1);
 		x = w->mc.xy.x;
 		y = w->mc.xy.y;
@@ -1042,7 +1042,7 @@
 		w->mc.xy.y = y;
 		q0 = w->q0;	/* may have changed */
 		q1 = w->q1;
-		selectq = q0;
+		selectq = w->org+frcharofpt(w, w->mc.xy);
 	}
 	if(w->mc.buttons == b && clickcount == 0){
 		w->scroll = framescroll;
@@ -1063,7 +1063,7 @@
 	if(q0 == q1){
 		mode = (clickcount > 2) ? 2 : clickcount;
 		if(q0==w->q0 && clickwin==w && w->mc.msec-clickmsec<500)
-			wstretchsel(w, &q0, &q1, mode);
+			wstretchsel(w, selectq, &q0, &q1, mode);
 		else
 			clickwin = w;
 		clickmsec = w->mc.msec;
@@ -1499,12 +1499,14 @@
 }
 
 void
-wstretchsel(Window *w, uint *q0, uint *q1, int mode)
+wstretchsel(Window *w, uint pt, uint *q0, uint *q1, int mode)
 {
 	int c, i;
 	Rune *r, *l, *p;
 	uint q;
 
+	*q0 = pt;
+	*q1 = pt;
 	for(i=0; left[i]!=nil; i++){
 		q = *q0;
 		l = left[i];
--- a/sys/src/cmd/samterm/flayer.c
+++ b/sys/src/cmd/samterm/flayer.c
@@ -250,7 +250,7 @@
 }
 
 int
-flselect(Flayer *l)
+flselect(Flayer *l, ulong *p)
 {
 	static int clickcount;
 	static Point clickpt = {-10, -10};
@@ -261,6 +261,7 @@
 	dt = mousep->msec - l->click;
 	dx = abs(mousep->xy.x - clickpt.x);
 	dy = abs(mousep->xy.y - clickpt.y);
+	*p = frcharofpt(&l->f, mousep->xy) + l->origin;
 
 	l->click = mousep->msec;
 	clickpt = mousep->xy;
@@ -270,7 +271,8 @@
 	clickcount = 0;
 
 	frselect(&l->f, mousectl);
-	l->p0 = l->f.p0+l->origin, l->p1 = l->f.p1+l->origin;
+	l->p0 = l->f.p0+l->origin;
+	l->p1 = l->f.p1+l->origin;
 	return 0;
 }
 
--- a/sys/src/cmd/samterm/flayer.h
+++ b/sys/src/cmd/samterm/flayer.h
@@ -36,7 +36,7 @@
 Rectangle flrect(Flayer*, Rectangle);
 void	flrefresh(Flayer*, Rectangle, int);
 void	flresize(Rectangle);
-int	flselect(Flayer*);
+int	flselect(Flayer*, ulong*);
 void	flsetselect(Flayer*, long, long);
 void	flstart(Rectangle);
 void	flupfront(Flayer*);
--- a/sys/src/cmd/samterm/main.c
+++ b/sys/src/cmd/samterm/main.c
@@ -35,6 +35,7 @@
 	Text *t;
 	Rectangle r;
 	Flayer *nwhich;
+	ulong p;
 
 	getscreen(argc, argv);
 	iconinit();
@@ -105,12 +106,12 @@
 					current(nwhich);
 				else{
 					t=(Text *)which->user1;
-					nclick = flselect(which);
+					nclick = flselect(which, &p);
 					if(nclick > 0){
 						if(nclick > 1)
-							outTsl(Ttclick, t->tag, which->p0);
+							outTsl(Ttclick, t->tag, p);
 						else
-							outTsl(Tdclick, t->tag, which->p0);
+							outTsl(Tdclick, t->tag, p);
 						t->lock++;
 					}else if(t!=&cmd)
 						outcmd();
--