summaryrefslogtreecommitdiff
path: root/sys/src/cmd/spred/cmdw.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2014-07-31 11:36:24 +0200
committeraiju <devnull@localhost>2014-07-31 11:36:24 +0200
commit709e78b9f9a76658cc6c704176ebf8f5821ee9d2 (patch)
tree89b0e66fd11d691dbef6c5fed98f3b62d157bd5a /sys/src/cmd/spred/cmdw.c
parent98d518cc8c1ff7d1440ebffb9f546d3e0e149d60 (diff)
spred: scrolling and other bugfixes
Diffstat (limited to 'sys/src/cmd/spred/cmdw.c')
-rw-r--r--sys/src/cmd/spred/cmdw.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/sys/src/cmd/spred/cmdw.c b/sys/src/cmd/spred/cmdw.c
index 0c838d9aa..0f2bff7a3 100644
--- a/sys/src/cmd/spred/cmdw.c
+++ b/sys/src/cmd/spred/cmdw.c
@@ -4,6 +4,7 @@
#include <thread.h>
#include <draw.h>
#include <mouse.h>
+#include <keyboard.h>
#include <frame.h>
#include "dat.h"
#include "fns.h"
@@ -57,15 +58,18 @@ cmdscroll(Win *w, int l)
for(r = w->toprune; r < w->nrunes && l != 0; r++)
if(w->runes[r] == '\n')
l--;
- frdelete(&w->fr, 0, r - w->toprune);
w->toprune = r;
}else{
for(r = w->toprune; r > 0; r--)
- if(w->runes[r] == '\n' && --l == 0)
+ if(w->runes[r] == '\n' && ++l == 0){
+ r++;
break;
- frinsert(&w->fr, w->runes + r, w->runes + w->toprune, 0);
+ }
w->toprune = r;
+
}
+ frdelete(&w->fr, 0, w->fr.nchars);
+ frinsert(&w->fr, w->runes + w->toprune, w->runes + w->nrunes, 0);
scrollbar(w);
}
@@ -88,7 +92,7 @@ cmdrmb(Win *w, Mousectl *mc)
return 0;
}
-void
+int
cmdinsert(Win *w, Rune *r, int nr, int rp)
{
Rune *s;
@@ -116,6 +120,7 @@ cmdinsert(Win *w, Rune *r, int nr, int rp)
cmdscroll(w, 1);
}
}
+ return nr;
}
static void
@@ -148,24 +153,27 @@ cmdkey(Win *w, Rune r)
case 0x1b:
break;
case '\b':
- if(w->fr.p0 > 0)
+ if(w->fr.p0 > 0 && w->toprune + w->fr.p0 != w->opoint)
cmddel(w, w->toprune + w->fr.p0 - 1, w->toprune + w->fr.p0);
break;
case '\n':
cmdinsert(w, &r, 1, w->fr.p0 + w->toprune);
if(w->toprune + w->fr.p0 == w->nrunes){
- q = w->runes + w->toprune + w->fr.p0 - 1;
+ q = w->runes + w->opoint;
p = buf;
- while(*--q != 0xa && q > w->runes)
- ;
- if(*q == 0xa)
- q++;
- while(q < w->runes + w->nrunes && p < buf + nelem(buf) + 1 && *q != 0xa)
+ while(q < w->runes + w->nrunes && p < buf + nelem(buf) + 1)
p += runetochar(p, q++);
*p = 0;
+ w->opoint = w->nrunes;
docmd(buf);
}
break;
+ case Kview:
+ cmdscroll(w, 3);
+ break;
+ case Kup:
+ cmdscroll(w, -3);
+ break;
default:
cmdinsert(w, &r, 1, w->fr.p0 + w->toprune);
}
@@ -181,7 +189,7 @@ cmdprint(char *fmt, ...)
r = runevsmprint(fmt, va);
va_end(va);
if(r != nil)
- cmdinsert(cmdw, r, -1, -1);
+ cmdw->opoint += cmdinsert(cmdw, r, -1, cmdw->opoint);
}
Wintab cmdtab = {