shithub: sam

Download patch

ref: 5b59ed3cd1d11cfc5333cac628ab4e12628b0c8b
parent: e35c28fbc9d40494cbda9a2687924090231181ce
author: Aidan K. Wiggins <akw@oneiri.one>
date: Fri Jan 24 16:09:08 EST 2025

Further refinements.

--- a/samterm/flayer.c
+++ b/samterm/flayer.c
@@ -284,8 +284,7 @@
 		else
 			flsetselect(l, sel, l->origin+f->p1);
 	}
-	inscroll = 1;
-	center(l, l->origin, n);
+	center(l, l->origin, n, 1);
 }
 
 int
@@ -329,10 +328,6 @@
 void
 flsetselect(Flayer *l, long p0, long p1)
 {
-	int fd = open("/usr/glenda/samlog", OWRITE);
-	fprint(fd, "p0 == %ld p1 == %ld\n", p0, p1);
-	close(fd);
-
 	ulong fp0, fp1;
 
 	if(l->visible==None || !flprepare(l)){
@@ -434,7 +429,6 @@
 			f->b = 0;
 			if(l->visible!=None)
 				frclear(f, 0);
-			l->width = (f->r.max.x - f->r.min.x)/f->font->width;
 		}
 		if(!rectclip(&r, dr))
 			panic("flresize");
@@ -449,6 +443,8 @@
 		if(!move)
 			l->visible = None;
 		frsetrects(f, insetrect(flrect(l, r), FLMARGIN), f->b);
+		if(!move)
+			l->width = (f->r.max.x - f->r.min.x)/f->font->width;
 		if(!move && f->b)
 			scrdraw(l, scrtotal(l));
 	}
--- a/samterm/io.c
+++ b/samterm/io.c
@@ -165,12 +165,6 @@
 	got = 0;
 }
 
-void
-setblock0(void)
-{
-	block = ~(1 << RHost);
-}
-
 int
 rcvchar(void)
 {
--- a/samterm/main.c
+++ b/samterm/main.c
@@ -28,8 +28,6 @@
 int	autoindent;
 int	spacesindent;
 
-void setblock0(void);
-
 void
 threadmain(int argc, char *argv[])
 {
@@ -64,7 +62,7 @@
 		if(got & (1 << RHost))
 			rcv();
 		if(got & (1 << RPlumb)){
-			for(i = 0; cmd.l[i].textfn == 0; i++)
+			for(i = 0; !cmd.l[i].textfn; i++)
 				;
 			current(&cmd.l[i]);
 			flsetselect(which, cmd.rasp.nrunes, cmd.rasp.nrunes);
@@ -226,8 +224,8 @@
 		flsetselect(nl, l->p0, l->p1);
 		if(close){
 			flclose(l);
-			if(l==which)
-				which = 0;
+			if(l == which)
+				which = nil;
 		}else
 			t->nwin++;
 		current(nl);
@@ -385,55 +383,75 @@
 void
 request(Text *t, int n, int m)
 {
+	Rasp *r;
 	int len;
 
-	while(n < m){
+	r = &t->rasp;
+	if(rcontig(r, n, m, 1) == (m-n))
+		return;
+
+	do{
 		len = m - n;
 		if(len > TBLOCKSIZE)
 			len = TBLOCKSIZE;
+		if(rcontig(r, n, n+len, 1) == len)
+			continue;
 		outTsls(Trequest, t->tag, n, len);
 		t->lock++;
-		waitforio(1);
-		rcv();
-		n += len;
-	}
+		if(waitforio(1) & (1 << RHost))
+			rcv();
+	}while((n += len) < m);
 }
 
-int inscroll;
+long
+bound(Text *t, long a)
+{
+	if(a > t->rasp.nrunes)
+		a = t->rasp.nrunes-1;
+	if(a < 0)
+		a = 0;
+	return a;
+}
 
+/* todo: cleanup. */
 void
-center(Flayer *l, long a, long nl)
+center(Flayer *l, long a, long nl, int req)
 {
 	Frame *f = &l->f;
 	Text *t = l->user1;
+	Rune r;
 	int n;
 
-	if(a > t->rasp.nrunes)
-		a = t->rasp.nrunes-1;
-	if(a < 0)
-		a = 0;
-
-	if(nl == 0)
-		n = a + (--nl)*l->width;
-	else
-		n = a + nl*l->width;
-	if(n > t->rasp.nrunes)
-		n = t->rasp.nrunes-1;
-	if(n < 0)
-		n = 0;
-	if(inscroll && n != a){
-		request(t, n < a? n: a, n < a? a: n);
-		inscroll = 0;
+	a = bound(t, a);
+	if(req){
+		if(nl > 0)
+			a += f->nchars;
+		n = bound(t, a + nl * l->width);
+		if(n != a)
+			request(t, n < a? n: a, n < a? a: n);
 	}
 
-	if(nl < 0){
+	if(nl <= 0){
 		while(nl++ <= 0 && a > 0)
-			for(n = 0; n < l->width && a > 0; n++)
-				if(raspc(&t->rasp, --a) == '\n')
+			for(n = 0; n < l->width && a > 0; n++){
+				r = raspc(&t->rasp, --a);
+				if(r == '\n')
 					break;
+				if(r == '\t')
+					n += maxtab - (n % maxtab) - 1;
+			}
 		a += a != 0;
-	}else if(nl > 0)
-		a += frcharofpt(f, Pt(f->r.min.x, 1+f->r.min.y+nl*f->font->height));
+	}else{
+		a -= f->nchars;
+		while(nl-- > 0 && a < t->rasp.nrunes)
+			for(n = 0; n < l->width && a < t->rasp.nrunes; n++){
+				r = raspc(&t->rasp, a++);
+				if(r == '\n')
+					break;
+				if(r == '\t')
+					n += maxtab - (n % maxtab) - 1;
+			}
+	}
 	horigin(t->tag, a);
 }
 
@@ -444,7 +462,7 @@
 	ulong n;
 
 	if(clearesc)
-		typeesc = -1;	
+		typeesc = -1;
 	if(typestart == typeend) {
 		modified = 0;
 		return;
@@ -490,9 +508,9 @@
 	Text *t = l->user1;
 	Rune buf[100];
 	Rune *p = buf;
+	int scrollkey;
 	int c, i;
 	long a, a0;
-	int scrollkey;
 
 	scrollkey = 0;
 	if(res == RKeyboard)
@@ -553,32 +571,28 @@
 		l->p0 = a;
 		l->p1 = a;
 		typeend = a;
-		if(c=='\n' || typeend-typestart>100)
+		if(c == '\n' || typeend-typestart > 100)
 			flushtyping(0);
 		if(a < l->origin || a > l->origin+l->f.nchars)
-			center(l, a, -(l->f.maxlines/3));
+			center(l, a, -(l->f.maxlines/3), 0);
 	}
 
 	switch(c){
 	case Kdown:
 		flushtyping(0);
-		inscroll = 1;
-		center(l, l->origin, 1);
+		center(l, l->origin, 1, 1);
 		break;
 	case Kpgdown:
 		flushtyping(0);
-		inscroll = 1;
-		center(l, l->origin, l->f.maxlines);
+		center(l, l->origin, l->f.maxlines, 1);
 		break;
 	case Kup:
 		flushtyping(0);
-		inscroll = 1;
-		center(l, l->origin, -1);
+		center(l, l->origin, -1, 1);
 		break;
 	case Kpgup:
 		flushtyping(0);
-		inscroll = 1;
-		center(l, l->origin, -l->f.maxlines);
+		center(l, l->origin, -l->f.maxlines, 1);
 		break;
 	/* these two need a second */
 	case Kleft:
@@ -586,30 +600,24 @@
 		a0 = l->p0;
 		a0 -= (l->p0 > 0);
 		flsetselect(l, a0, a0);
-		if(a0-l->origin >= l->f.nchars){
-			inscroll = 1;
-			center(l, a0, -(l->f.maxlines/3));
-		}
+		if(a0 - l->origin < 0)
+			center(l, l->origin, -1, 1);
 		break;
 	case Kright:
 		flushtyping(0);
 		a0 = l->p1;
-		a0 += (a < t->rasp.nrunes);
+		a0 += a < t->rasp.nrunes;
 		flsetselect(l, a0, a0);
-		if(a0-l->origin >= l->f.nchars){
-			inscroll = 1;
-			center(l, a0, -(l->f.maxlines/3));
-		}
+		if(a0-l->origin >= l->f.nchars)
+			center(l, l->origin, 1, 1);
 		break;
 	case Khome:
 		flushtyping(0);
-		inscroll = 1;
-		center(l, 0, 0);
+		center(l, 0, 0, 1);
 		break;
 	case Kend:
 		flushtyping(0);
-		inscroll = 1;
-		center(l, t->rasp.nrunes, 0);
+		center(l, t->rasp.nrunes, 0, 1);
 		break;
 	case Ksoh:
 	case Kenq:
@@ -681,8 +689,7 @@
 		flushtyping(0);
 		a = t->rasp.nrunes;
 		flsetselect(l, a, a);
-		inscroll = 1;
-		center(l, a, 0);
+		center(l, a, 0, 1);
 		break;
 	case Kbel:
  		if(work == nil)
--- a/samterm/mesg.c
+++ b/samterm/mesg.c
@@ -224,7 +224,7 @@
 			for(i = 0; i < NL; i++){
 				lp = &cmd.l[i];
 				if(lp->textfn)
-					center(lp, l >= 0? l: lp->p1, 0);
+					center(lp, l >= 0? l: lp->p1, 0, 0);
 			}
 		}
 		break;
@@ -373,14 +373,6 @@
 }
 
 void
-outTl(Tmesg type, long l)
-{
-	outstart(type);
-	outlong(l);
-	outsend();
-}
-
-void
 outTs(Tmesg type, int s)
 {
 	outstart(type);
@@ -479,8 +471,8 @@
 {
 	uchar buf[2];
 
-	buf[0]=s;
-	buf[1]=s>>8;
+	buf[0] = s;
+	buf[1] = s >> 8;
 	outcopy(2, buf);
 }
 
@@ -506,7 +498,6 @@
 		buf[i] = v;
 		v >>= 8;
 	}
-
 	outcopy(8, buf);
 }
 
@@ -525,10 +516,6 @@
 void
 hsetdot(int m, long p0, long p1)
 {
-	int fd = open("/usr/glenda/samlog", OWRITE);
-	fprint(fd, "hsetdot\n");
-	close(fd);
-
 	Text *t = whichtext(m);
 	Flayer *l = &t->l[t->front];
 
@@ -546,10 +533,7 @@
 	ulong n;
 	Rune *r;
 
-	if(p > t->rasp.nrunes)
-		p = t->rasp.nrunes-1;
-	if(p < 0)
-		p = 0;
+	p = bound(t, p);
 
 	if(!flprepare(l)){
 		l->origin = p;
@@ -575,10 +559,9 @@
 
 	/* riskyhack: If we have scrolled too far at the end, retrace our steps. */
 	if(p + f->nchars == t->rasp.nrunes && f->nlines < f->maxlines/3 && l->origin > 0)
-		center(l, t->rasp.nrunes, -(f->maxlines/3));
+		center(l, t->rasp.nrunes, -(f->maxlines/3), 0);
 }
 
-/* todo: investigate, remove Torigin in cmd/sam. */
 void
 hmoveto(int m, long p0)
 {
@@ -585,20 +568,13 @@
 	Text *t = whichtext(m);
 	Flayer *l = &t->l[t->front];
 
-	if(p0 < l->origin || p0-l->origin > l->f.nchars*9/10){
-	//	inscroll = 1;
-	//	center(l, p0, 0);
-		outTsll(Torigin, m, p0, 2L);
-	}
+	if(p0 < l->origin || p0-l->origin > l->f.nchars*9/10)
+		outTsls(Torigin, m, p0, l->width);
 }
 
-void request(Text*, int, int);
-
 void
 hcheck(int m)
 {
-	int fd = open("/usr/glenda/samlog", OWRITE);
-
 	Flayer *l;
 	Text *t;
 	int reqd = 0, i;
@@ -608,7 +584,7 @@
 	if(m == Untagged)
 		return;
 	t = whichtext(m);
-	if(t == 0)		/* possible in a half-built window */
+	if(!t)		/* possible in a half-built window */
 		return;
 	for(l = &t->l[0], i = 0; i<NL; i++, l++){
 		if(l->textfn==0 || !flprepare(l))	/* BUG: don't
@@ -617,7 +593,6 @@
 			continue;
 		a = t->l[i].origin;
 		n = rcontig(&t->rasp, a, a+l->f.nchars, 1);
-		fprint(fd, "n == %ld\nl->f.nchars == %ud\n", n, l->f.nchars);
 		if(n<l->f.nchars)	/* text missing in middle of screen */
 			a += n;
 		else{			/* text missing at end of screen? */
@@ -631,7 +606,7 @@
 			if(n>TBLOCKSIZE)
 				n = TBLOCKSIZE;
 			n = rcontig(&t->rasp, a, a+n, 1);
-			if(n>0){
+			if(n > 0){
 				rload(&t->rasp, a, a+n, 0);
 				nl = l->f.nchars;
 				r = scratch;
@@ -652,11 +627,8 @@
 			reqd++;
 		}
 	    Checksel:
-		fprint(fd, "Checksel\n");
 		flsetselect(l, l->p0, l->p1);
 	}
-	fprint(fd, "out hcheck()\n");
-	close(fd);
 }
 
 void
@@ -683,7 +655,7 @@
 		if(!s1)
 			n = 0;
 		s1 = realloc(s1, n+1);
-		if (!s1)
+		if(!s1)
 			panic("realloc");
 		s1[n] = 0;
 		snarflen = n;
--- a/samterm/samterm.h
+++ b/samterm/samterm.h
@@ -89,7 +89,6 @@
 extern int	exiting;
 extern int	autoindent;
 extern int	spacesindent;
-extern int	inscroll;
 
 Rune	*gettext(Flayer*, long, ulong*);
 void	*alloc(ulong n);
@@ -114,7 +113,7 @@
 int	kbdchar(void);
 int	qpeekc(void);
 void	cut(Text*, int, int, int);
-void	center(Flayer*, long, long);
+void	center(Flayer*, long, long, int);
 void	paste(Text*, int);
 void	snarf(Text*, int);
 Rune	raspc(Rasp*, long);
@@ -128,10 +127,8 @@
 void	panic1(Display*, char*);
 void	closeup(Flayer*);
 void	Strgrow(Rune**, long*, int);
-void	center(Flayer*, long, long);
 int	RESIZED(void);
 void	resize(void);
-void	rcvhost(void);
 void	rcv(void);
 void	type(Flayer*, int);
 void	menu2hit(void);
@@ -144,7 +141,7 @@
 void	horigin(int, long);
 void	hgrow(int, long, long, int);
 int	hdata(int, long, Rune*, int);
-Rune	*rload(Rasp*, ulong, ulong, ulong*);
+Rune*	rload(Rasp*, ulong, ulong, ulong*);
 void	menuins(int, uchar*, Text*, int, int);
 void	menudel(int);
 Text	*sweeptext(int, int);
@@ -153,22 +150,20 @@
 void	scrdraw(Flayer*, long tot);
 int	rcontig(Rasp*, ulong, ulong, int);
 int	rmissing(Rasp*, ulong, ulong);
-void	rresize(Rasp *, long, long, long);
+void	rresize(Rasp*, long, long, long);
 void	rdata(Rasp*, long, long, Rune*);
 void	rclean(Rasp*);
-void	scrorigin(Flayer*, int, long);
 long	scrtotal(Flayer*);
 void	flnewlyvisible(Flayer*);
-char	*rcvstring(void);
+char*	rcvstring(void);
 void	flushtyping(int);
 void	dumperrmsg(int, int, int, int);
-int	screensize(int*,int*);
-void	clrlock(void);
+int	screensize(int*, int*);
+long	bound(Text*, long);
 #include "mesg.h"
 
 void	outT0(Tmesg);
 void	outTs(Tmesg, int);
-void	outTl(Tmesg, long);
 void	outTv(Tmesg, vlong);
 void	outTsl(Tmesg, int, long);
 void	outTsv(Tmesg, int, vlong);
--- a/samterm/scroll.c
+++ b/samterm/scroll.c
@@ -166,7 +166,6 @@
 
 		}
 		mouseunblock();
-		inscroll = 1;
-		center(l, o, p0);
+		center(l, o, p0, 1);
 	}
 }
--