Make scrolling actions to work with zeroxed layers. - sam - An updated version … | |
git clone git://vernunftzentrum.de/sam.git | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit 29ec8916b4867f462599605a00dc1f04c4619b5b | |
parent 2be8dae9931102b0e46c8c065d84684540147438 | |
Author: Rob King <[email protected]> | |
Date: Thu, 1 Sep 2016 16:36:52 -0500 | |
Make scrolling actions to work with zeroxed layers. | |
Diffstat: | |
doc/sam.1 | 9 --------- | |
samterm/main.c | 25 ++++++++++++++++++------- | |
samterm/mesg.c | 23 +++++++++++++---------- | |
samterm/samterm.h | 3 ++- | |
4 files changed, 33 insertions(+), 27 deletions(-) | |
--- | |
diff --git a/doc/sam.1 b/doc/sam.1 | |
@@ -1029,15 +1029,6 @@ Stores output of shell commands executed by | |
.Xr ed 1 | |
.Sh BUGS | |
.Pp | |
-Mouse chords can be directed to either the front layer, | |
-or to the layer containing the mouse pointer. | |
-In the latter case, | |
-this allows a background layer to be scrolled using the mouse wheel. | |
-However, | |
-this does not always work if the layer in question has multiple duplicate fram… | |
-This is because the scrolling code identifies which layer to scroll by tag, | |
-which is common to all views open on that file. | |
-.Pp | |
The only human language in which colors may be specified is English. | |
.Pp | |
The only human language in which output is generated is English. | |
diff --git a/samterm/main.c b/samterm/main.c | |
@@ -9,7 +9,7 @@ | |
#include <commands.h> | |
extern unsigned long _bgpixel; | |
-extern void hmoveto(int, long); | |
+extern void hmoveto(int, long, Flayer *); | |
Text cmd; | |
Rune *scratch; | |
@@ -322,8 +322,8 @@ scrorigin(Flayer *l, int but, long p0) | |
case 2: | |
outTsll(Torigin, t->tag, p0, 1L); | |
break; | |
- case 3: case 5: | |
- horigin(t->tag,p0); | |
+ case 3: | |
+ horigin(t->tag, p0, NULL); | |
} | |
} | |
@@ -526,8 +526,19 @@ cmdbol(Flayer *l, long a, Text *t) | |
static long | |
cmdscrollupline(Flayer *l, long a, Text *t) | |
{ | |
- if (l->origin > 0) | |
- hmoveto(t->tag, l->origin - 1); | |
+ if (l->origin > 0){ | |
+ long x = l->origin - 1; | |
+ while (x > 0 && raspc(&t->rasp, x - 1) != '\n') | |
+ x--; | |
+ | |
+ /* if (x > 0){ | |
+ //x--; | |
+ while (x > 0 && raspc(&t->rasp, x) != '\n') | |
+ x--; | |
+ } */ | |
+ | |
+ horigin(t->tag, x, l); | |
+ } | |
return a; | |
} | |
@@ -539,7 +550,7 @@ cmdscrolldownline(Flayer *l, long a, Text *t) | |
long p1 = l->origin + frcharofpt(&l->f, Pt(l->f.r.min.x, l->f.r.max.y - l-… | |
if (p0 < tot && p1 < tot) | |
- horigin(t->tag, p0); | |
+ horigin(t->tag, p0, l); | |
return a; | |
} | |
@@ -707,7 +718,7 @@ cmddel(Flayer *l, long a, Text *t) | |
return a; | |
} | |
-static inline int | |
+int | |
getlayer(const Flayer *l, const Text *t) | |
{ | |
int i; | |
diff --git a/samterm/mesg.c b/samterm/mesg.c | |
@@ -22,7 +22,7 @@ int inshort(int); | |
long inlong(int); | |
long invlong(int); | |
void hsetdot(int, long, long); | |
-void hmoveto(int, long); | |
+void hmoveto(int, long, Flayer *); | |
void hsetsnarf(int); | |
void clrlock(void); | |
int snarfswap(char*, int, char**); | |
@@ -215,7 +215,7 @@ inmesg(Hmesg type, int count) | |
case Horigin: | |
if(whichmenu(m) >= 0) | |
- horigin(m, l); | |
+ horigin(m, l, NULL); | |
break; | |
case Hunlockfile: | |
@@ -241,7 +241,7 @@ inmesg(Hmesg type, int count) | |
case Hmoveto: | |
if(whichmenu(m)>=0) | |
- hmoveto(m, l); | |
+ hmoveto(m, l, NULL); | |
break; | |
case Hclean: | |
@@ -537,14 +537,17 @@ hsetdot(int m, long p0, long p1) | |
} | |
void | |
-horigin(int m, long p0) | |
+horigin(int m, long p0, Flayer *l) | |
{ | |
Text *t = whichtext(m); | |
- Flayer *l = &t->l[t->front]; | |
+ l = l ? l : &t->l[t->front]; | |
long a; | |
ulong n; | |
Rune *r; | |
+ if (getlayer(l, t) < 0) | |
+ return; /* the user managed to close the layer during the round trip w… | |
+ | |
if(!flprepare(l)){ | |
l->origin = p0; | |
return; | |
@@ -565,13 +568,13 @@ horigin(int m, long p0) | |
} | |
void | |
-hmoveto(int m, long p0) | |
+hmoveto(int m, long p0, Flayer *l) | |
{ | |
- Text *t = whichtext(m); | |
- Flayer *l = &t->l[t->front]; | |
+ Text *t = whichtext(m); | |
+ l = l ? l : &t->l[t->front]; | |
- if(p0<l->origin || p0-l->origin>l->f.nchars*9/10) | |
- outTsll(Torigin, m, p0, 2L); | |
+ if (p0 < l->origin || p0 - l->origin > l->f.nchars * 9/10) | |
+ outTsll(Torigin, m, p0, 2L); | |
} | |
void | |
diff --git a/samterm/samterm.h b/samterm/samterm.h | |
@@ -117,7 +117,7 @@ void hcheck(int); | |
void rclear(Rasp*); | |
int whichmenu(int); | |
void hcut(int, long, long); | |
-void horigin(int, long); | |
+void horigin(int, long, Flayer *); | |
void hgrow(int, long, long, int); | |
int hdata(int, long, uchar*, int); | |
int hdatarune(int, long, Rune*, int); | |
@@ -158,3 +158,4 @@ void outshort(int); | |
void outlong(long); | |
void outvlong(void*); | |
void outsend(void); | |
+int getlayer(const Flayer *l, const Text *t); |