aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/samterm/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/samterm/main.c')
-rw-r--r--src/cmd/samterm/main.c78
1 files changed, 69 insertions, 9 deletions
diff --git a/src/cmd/samterm/main.c b/src/cmd/samterm/main.c
index 5b645e84..a47aa521 100644
--- a/src/cmd/samterm/main.c
+++ b/src/cmd/samterm/main.c
@@ -108,19 +108,21 @@ threadmain(int argc, char *argv[])
continue;
}
nwhich = flwhich(mousep->xy);
- scr = which && ptinrect(mousep->xy, which->scroll);
+ //scr = which && ptinrect(mousep->xy, which->scroll);
+ scr = which && (ptinrect(mousep->xy, which->scroll) || mousep->buttons&(8|16));
if(mousep->buttons)
flushtyping(1);
if(chording && chord==1 && !mousep->buttons)
chord = 0;
if(chording && chord)
chord |= mousep->buttons;
- else if(mousep->buttons&1){
+ else if(mousep->buttons&(1|8)){
if(nwhich){
if(nwhich!=which)
current(nwhich);
else if(scr)
- scroll(which, 1);
+ //scroll(which, 1);
+ scroll(which, (mousep->buttons&8) ? 4 : 1);
else{
t=(Text *)which->user1;
if(flselect(which)){
@@ -137,9 +139,10 @@ threadmain(int argc, char *argv[])
scroll(which, 2);
else
menu2hit();
- }else if((mousep->buttons&4)){
+ }else if((mousep->buttons&(4|16))){
if(scr)
- scroll(which, 3);
+ //scroll(which, 3);
+ scroll(which, (mousep->buttons&16) ? 5 : 3);
else
menu3hit();
}
@@ -483,6 +486,48 @@ flushtyping(int clearesc)
typeend = -1;
}
+void
+sendcmd(char *c, int n, Text *t) {
+ Text *to = t;
+ Rune buf[100];
+ Rune *p = buf;
+ Flayer *l;
+ long a;
+
+ t = &cmd;
+ for(l=t->l; l->textfn==0; l++)
+ ;
+ current(l);
+ flushtyping(0);
+ a = t->rasp.nrunes;
+ flsetselect(l, a, a);
+ center(l, a);
+
+ for(int x = 0; x < n; x++){
+ chartorune(p++,c++);
+ }
+ *p++ = '\n';
+ if(typestart < 0)
+ typestart = a;
+ if(typeesc < 0)
+ typeesc = a;
+ hgrow(t->tag, a, p-buf, 0);
+ t->lock++; /* pretend we Trequest'ed for hdatarune*/
+ hdatarune(t->tag, a, buf, p-buf);
+ a += p-buf;
+ l->p0 = a;
+ l->p1 = a;
+ typeend = a;
+ flushtyping(0);
+ onethird(l, a);
+
+ t = to;
+ for(l=t->l; l->textfn==0; l++)
+ ;
+ current(l);
+ flushtyping(1);
+}
+
#define BACKSCROLLKEY Kup
#define ENDKEY Kend
#define ESC 0x1B
@@ -497,6 +542,8 @@ flushtyping(int clearesc)
#define CUT (Kcmd+'x')
#define COPY (Kcmd+'c')
#define PASTE (Kcmd+'v')
+#define UNDO (Kcmd+'z')
+#define REDO (Kcmd+'Z')
int
nontypingkey(int c)
@@ -618,16 +665,29 @@ type(Flayer *l, int res) /* what a bloody mess this is */
center(l, t->rasp.nrunes);
}else if(c == LINESTART || c == LINEEND){
flushtyping(1);
- if(c == LINESTART)
- while(a > 0 && raspc(&t->rasp, a-1)!='\n')
+ if(c == LINESTART){
+ if (a > 0 && raspc(&t->rasp, a-1)=='\n')
a--;
- else
- while(a < t->rasp.nrunes && raspc(&t->rasp, a)!='\n')
+ else{
+ while(a > 0 && raspc(&t->rasp, a-1)!='\n')
+ a--;
+ }
+ }else{
+ if(a < t->rasp.nrunes && raspc(&t->rasp, a)=='\n')
a++;
+ else{
+ while(a < t->rasp.nrunes && raspc(&t->rasp, a)!='\n')
+ a++;
+ }
+ }
l->p0 = l->p1 = a;
for(l=t->l; l<&t->l[NL]; l++)
if(l->textfn)
flsetselect(l, l->p0, l->p1);
+ }else if(c == UNDO) {
+ sendcmd("u", 1, t);
+ }else if(c == REDO) {
+ sendcmd("u-1", 3, t);
}else if(backspacing && !hostlock){
/* backspacing immediately after outcmd(): sorry */
if(l->f.p0>0 && a>0){