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);
}
}
--
⑨