Support scrolling even for zeroxed layers. - sam - An updated version of the sam text editor.
(HTM) git clone git://vernunftzentrum.de/sam.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
(DIR) commit 6aef2cc353e5ab781a6a36761fb8518f1296e163
(DIR) parent 9e3cf08d5206503fa620136bd8b89528f5ca882c
(HTM) Author: Rob King <jking@deadpixi.com>
Date: Thu, 1 Sep 2016 22:03:26 -0500
Support scrolling even for zeroxed layers.
The scrolling code worked without any (obvious) issues for all cases,
except when the scrolled layer was a background layer which was a
duplicate of another layer.
The reason is that to scroll upwards, we have to send a Torigin message
to the host (to get us to move up a line; we might not be able to do so
simply by checking character-by-character because above us might be a
hole in the rasp). The Horigin response did not include a mechanism to
indicate which layer we wanted to scroll; it always assumed the first
layer for the tag is the one we wanted.
Note that this breaks the protocol between sam and samterm. Other sam
implementations will no longer work with this samterm and vice-versa.
This was going to happen sooner or later anyway (to support UTF outside
of the Basic Multilingual Plane), so...
Diffstat:
sam/mesg.c | 12 +++++++-----
sam/moveto.c | 4 ++--
sam/sam.h | 2 +-
samterm/flayer.h | 3 +--
samterm/main.c | 26 +++++++++++---------------
samterm/mesg.c | 23 +++++++++++++++++++----
samterm/samterm.h | 1 +
7 files changed, 42 insertions(+), 29 deletions(-)
---
(DIR) diff --git a/sam/mesg.c b/sam/mesg.c
@@ -172,7 +172,7 @@ inmesg(Tmesg type)
Rune buf[1025];
int i, m;
short s;
- long l, l1;
+ long l, l1, l2;
File *f;
Posn p0, p1;
Range r;
@@ -248,11 +248,13 @@ inmesg(Tmesg type)
break;
case Torigin:
- s = inshort();
- l = inlong();
- l1 = inlong();
+ s = inshort(); /* tag */
+ l = inlong(); /* position */
+ l1 = inlong(); /* lines to seek past position */
+ l2 = inlong(); /* cookie to return (identifies layer) */
journaln(0, l1);
- lookorigin(whichfile(s), l, l1);
+ journaln(0, l2);
+ lookorigin(whichfile(s), l, l1, l2);
break;
case Tstartfile:
(DIR) diff --git a/sam/moveto.c b/sam/moveto.c
@@ -35,7 +35,7 @@ tellpat(void)
#define CHARSHIFT 128
void
-lookorigin(File *f, Posn p0, Posn ls)
+lookorigin(File *f, Posn p0, Posn ls, long rl)
{
int nl, nc, c;
Posn oldp0;
@@ -58,7 +58,7 @@ lookorigin(File *f, Posn p0, Posn ls)
p0 = 0;
}else
p0 = oldp0;
- outTsl(Horigin, f->tag, p0);
+ outTsll(Horigin, f->tag, p0, rl);
}
int
(DIR) diff --git a/sam/sam.h b/sam/sam.h
@@ -275,7 +275,7 @@ Address lineaddr(Posn, Address, int);
void listfree(List*);
void load(File*);
File *lookfile(String*, int);
-void lookorigin(File*, Posn, Posn);
+void lookorigin(File*, Posn, Posn, long);
int lookup(int);
void move(File*, Address);
void moveto(File*, Range);
(DIR) diff --git a/samterm/flayer.h b/samterm/flayer.h
@@ -13,8 +13,7 @@ enum{
typedef struct Flayer Flayer;
/* note that we track background color, but not foreground
- * all layers have the same foreground color, but they may have different
- * background colors.
+ * all layers have the same foreground color
*/
struct Flayer
{
(DIR) diff --git a/samterm/main.c b/samterm/main.c
@@ -316,11 +316,11 @@ scrorigin(Flayer *l, int but, long p0)
Text *t=(Text *)l->user1;
switch(but){
- case 1: case 4:
- outTsll(Torigin, t->tag, l->origin, p0);
+ case 1:
+ outTslll(Torigin, t->tag, l->origin, p0, t->front);
break;
case 2:
- outTsll(Torigin, t->tag, p0, 1L);
+ outTslll(Torigin, t->tag, p0, 1L, t->front);
break;
case 3:
horigin(t->tag, p0, NULL);
@@ -386,7 +386,7 @@ center(Flayer *l, long a)
if (!t->lock && (a < l->origin || l->origin + l->f.nchars < a)){
a = (a > t->rasp.nrunes) ? t->rasp.nrunes : a;
- outTsll(Torigin, t->tag, a, 2L);
+ outTslll(Torigin, t->tag, a, 2L, getlayer(l, t));
return 1;
}
@@ -408,7 +408,7 @@ onethird(Flayer *l, long a)
lines = ((s.max.y-s.min.y)/l->f.fheight+1)/3;
if (lines < 2)
lines = 2;
- outTsll(Torigin, t->tag, a, lines);
+ outTslll(Torigin, t->tag, a, lines, t->front);
return 1;
}
return 0;
@@ -459,7 +459,7 @@ static long
cmdscrollup(Flayer *l, long a, Text *t)
{
flushtyping(0);
- outTsll(Torigin, t->tag, l->origin, l->f.maxlines + 1);
+ outTslll(Torigin, t->tag, l->origin, l->f.maxlines + 1, getlayer(l, t));
return a;
}
@@ -511,11 +511,12 @@ cmdbol(Flayer *l, long a, Text *t)
{
flsetselect(l, a, a);
flushtyping(1);
- while(a > 0)
- if(raspc(&t->rasp, --a) == '\n') {
+ while (a > 0){
+ if (raspc(&t->rasp, --a) == '\n'){
a++;
break;
}
+ }
flsetselect(l, a, a);
center(l, a);
@@ -526,13 +527,8 @@ cmdbol(Flayer *l, long a, Text *t)
static long
cmdscrollupline(Flayer *l, long a, Text *t)
{
- if (l->origin > 0){
- long x = l->origin - 1;
- while (x > 0 && raspc(&t->rasp, x - 1) != '\n')
- x--;
-
- horigin(t->tag, x, l);
- }
+ if (l->origin > 0)
+ hmoveto(t->tag, l->origin - 1, l);
return a;
}
(DIR) diff --git a/samterm/mesg.c b/samterm/mesg.c
@@ -96,7 +96,7 @@ inmesg(Hmesg type, int count)
{
Text *t;
int i, m;
- long l;
+ long l, l2;
Flayer *lp;
char syscmd[512];
@@ -214,8 +214,12 @@ inmesg(Hmesg type, int count)
break;
case Horigin:
- if(whichmenu(m) >= 0)
- horigin(m, l, NULL);
+ l2 = inlong(6);
+ if(whichmenu(m) >= 0){
+ Text *t = whichtext(m);
+ Flayer *rl = &t->l[l2];
+ horigin(m, l, rl);
+ }
break;
case Hunlockfile:
@@ -402,6 +406,17 @@ outTss(Tmesg type, int s1, int s2)
}
void
+outTslll(Tmesg type, int s1, long l1, long l2, long l3)
+{
+ outstart(type);
+ outshort(s1);
+ outlong(l1);
+ outlong(l2);
+ outlong(l3);
+ outsend();
+}
+
+void
outTsll(Tmesg type, int s1, long l1, long l2)
{
outstart(type);
@@ -574,7 +589,7 @@ hmoveto(int m, long p0, Flayer *l)
l = l ? l : &t->l[t->front];
if (p0 < l->origin || p0 - l->origin > l->f.nchars * 9/10)
- outTsll(Torigin, m, p0, 2L);
+ outTslll(Torigin, m, p0, 2L, getlayer(l, t));
}
void
(DIR) diff --git a/samterm/samterm.h b/samterm/samterm.h
@@ -148,6 +148,7 @@ void outTs(Tmesg, int);
void outT0(Tmesg);
void outTl(Tmesg, long);
void outTslS(Tmesg, int, long, Rune*);
+void outTslll(Tmesg, int, long, long, long);
void outTsll(Tmesg, int, long, long);
void outTsl(Tmesg, int, long);
void outTsv(Tmesg, int, void*);