summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/cmd/vt/cons.h2
-rw-r--r--sys/src/cmd/vt/event.c70
-rw-r--r--sys/src/cmd/vt/event.h13
-rw-r--r--sys/src/cmd/vt/main.c349
-rw-r--r--sys/src/cmd/vt/mkfile1
5 files changed, 191 insertions, 244 deletions
diff --git a/sys/src/cmd/vt/cons.h b/sys/src/cmd/vt/cons.h
index fbf022953..f415e4d3b 100644
--- a/sys/src/cmd/vt/cons.h
+++ b/sys/src/cmd/vt/cons.h
@@ -81,7 +81,7 @@ extern Image *fgdefault;
extern int cursoron;
extern int nocolor;
-extern void curson(int);
+extern void curson(void);
extern void cursoff(void);
extern void setdim(int, int);
diff --git a/sys/src/cmd/vt/event.c b/sys/src/cmd/vt/event.c
deleted file mode 100644
index 44d100fd1..000000000
--- a/sys/src/cmd/vt/event.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <u.h>
-#include <libc.h>
-#include <draw.h>
-#include <event.h>
-#include "cons.h"
-
-#define BUFSIZ 4000
-
-extern int outfd;
-
-int hostpid;
-
-void
-edie(void)
-{
- static int dead = 0;
-
- if(dead++ > 0) return;
- close(outfd);
- postnote(PNGROUP, getpid(), "exit");
-}
-
-static int
-start_host(void)
-{
- int fd;
-
- cs = consctl();
-
- switch((hostpid = rfork(RFPROC|RFNAMEG|RFFDG|RFNOTEG))) {
- case 0:
- fd = open("/dev/cons", OREAD);
- dup(fd,0);
- if(fd != 0)
- close(fd);
- fd = open("/dev/cons", OWRITE);
- dup(fd,1);
- dup(fd,2);
- if(fd != 1 && fd !=2)
- close(fd);
- execl("/bin/rc","rcX",nil);
- fprint(2,"failed to start up rc\n");
- _exits("rc");
- case -1:
- fprint(2,"rc startup: fork error\n");
- _exits("rc_fork");
- }
-
- return open("/mnt/cons/data", ORDWR);
-}
-
-void
-ebegin(int Ehost)
-{
-
- atexit(edie);
-
- einit(Emouse|Ekeyboard);
-
- outfd = start_host();
- if( estart(Ehost, outfd, BUFSIZ) != Ehost) {
- exits("event init error");
- }
-}
-
-void
-send_interrupt(void)
-{
- postnote(PNGROUP, hostpid,"interrupt");
-}
diff --git a/sys/src/cmd/vt/event.h b/sys/src/cmd/vt/event.h
deleted file mode 100644
index baa108623..000000000
--- a/sys/src/cmd/vt/event.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#define BSIZE 4000
-#define MOUSE 0
-#define KBD 1
-#define HOST 2
-#define HOST_BLOCKED 1
-#define KBD_BLOCKED 2
-
-typedef struct IOEvent {
- short key;
- short size;
- uchar data[BSIZE];
-} IOEvent;
-
diff --git a/sys/src/cmd/vt/main.c b/sys/src/cmd/vt/main.c
index ebbc63d98..6bea55e9d 100644
--- a/sys/src/cmd/vt/main.c
+++ b/sys/src/cmd/vt/main.c
@@ -1,21 +1,18 @@
#include <u.h>
#include <libc.h>
#include <draw.h>
-#include <event.h>
-#include <bio.h>
+#include <thread.h>
+#include <mouse.h>
#include <keyboard.h>
+#include <bio.h>
#include "cons.h"
-enum{
- Ehost = 4,
-};
-
char *menutext2[] = {
"backup",
"forward",
"reset",
"clear",
- "send",
+ "paste",
"page",
0
};
@@ -93,48 +90,117 @@ int NS;
int CW;
int XMARGIN;
int YMARGIN;
-Consstate *cs;
+
Mouse mouse;
+Rune kbdchar;
+
+Mousectl *mc;
+Keyboardctl *kc;
+Channel *hc;
+Consstate *cs;
int debug;
int nocolor;
int logfd = -1;
-int outfd = -1;
+int hostfd = -1;
+int hostpid;
Biobuf *snarffp = 0;
-
-char *host_buf;
-char *hostp; /* input from host */
-
-int host_bsize = 2*BSIZE;
-int hostlength; /* amount of input from host */
+Rune *hostbuf, *hostbufp;
char echo_input[BSIZE];
char *echop = echo_input; /* characters to echo, after canon */
char sendbuf[BSIZE]; /* hope you can't type ahead more than BSIZE chars */
-char *sendp = sendbuf;
+char *sendbufp = sendbuf;
char *term;
struct funckey *fk;
/* functions */
void initialize(int, char **);
-void ebegin(int);
int waitchar(void);
+void waitio(void);
int rcvchar(void);
-void set_input(char *);
-void set_host(Event *);
void bigscroll(void);
void readmenu(void);
void selection(void);
-void eresized(int);
void resize(void);
void send_interrupt(void);
int alnum(int);
void escapedump(int,uchar *,int);
Rune* onscreenp(int, int);
+int
+start_host(void)
+{
+ int fd;
+
+ switch((hostpid = rfork(RFPROC|RFNAMEG|RFFDG|RFNOTEG))) {
+ case 0:
+ fd = open("/dev/cons", OREAD);
+ dup(fd,0);
+ if(fd != 0)
+ close(fd);
+ fd = open("/dev/cons", OWRITE);
+ dup(fd,1);
+ dup(fd,2);
+ if(fd != 1 && fd !=2)
+ close(fd);
+ execl("/bin/rc","rcX",nil);
+ fprint(2,"failed to start up rc\n");
+ _exits("rc");
+ case -1:
+ fprint(2,"rc startup: fork error\n");
+ _exits("rc_fork");
+ }
+ return open("/mnt/cons/data", ORDWR);
+}
+
+void
+send_interrupt(void)
+{
+ postnote(PNGROUP, hostpid, "interrupt");
+}
+
void
-main(int argc, char **argv)
+hostreader(void*)
{
+ char cb[BSIZE+1], *cp;
+ Rune *rb, *rp;
+ int n, r;
+
+ n = 0;
+ while((r = read(hostfd, cb+n, BSIZE-n)) > 0){
+ n += r;
+ rb = mallocz((n+1)*sizeof(Rune), 0);
+ for(rp = rb, cp = cb; n > 0; n -= r, cp += r){
+ if(!fullrune(cp, n))
+ break;
+ r = chartorune(rp, cp);
+ if(*rp != 0)
+ rp++;
+ }
+ if(rp > rb){
+ *rp = 0;
+ sendp(hc, rb);
+ } else {
+ free(rb);
+ }
+ if(n > 0) memmove(cb, cp, n);
+ }
+ sendp(hc, nil);
+}
+
+static void
+shutdown(void)
+{
+ postnote(PNGROUP, getpid(), "exit");
+ threadexitsall(nil);
+}
+
+void
+threadmain(int argc, char **argv)
+{
+ rfork(RFNAMEG|RFNOTEG|RFENVG);
+ atexit(shutdown);
initialize(argc, argv);
emulate();
}
@@ -153,8 +219,6 @@ initialize(int argc, char **argv)
int i, blkbg;
char *fontname, *p;
- rfork(RFNAMEG|RFNOTEG|RFENVG);
-
fontname = nil;
term = "vt100";
fk = vt100fk;
@@ -196,18 +260,19 @@ initialize(int argc, char **argv)
break;
}ARGEND;
- host_buf = mallocz(host_bsize, 1);
- hostp = host_buf;
- hostlength = 0;
-
- if(initdraw(0, fontname, term) < 0){
- fprint(2, "%s: initdraw failed: %r\n", term);
- exits("initdraw");
- }
- werrstr(""); /* clear spurious error messages */
- ebegin(Ehost);
-
+ if(initdraw(0, fontname, term) < 0)
+ sysfatal("inidraw failed: %r");
+ if((mc = initmouse("/dev/mouse", screen)) == nil)
+ sysfatal("initmouse failed: %r");
+ if((kc = initkeyboard("/dev/cons")) == nil)
+ sysfatal("initkeyboard failed: %r");
+ if((cs = consctl()) == nil)
+ sysfatal("consctl failed: %r");
cs->raw = rflag;
+ hc = chancreate(sizeof(Rune*), 0);
+ if((hostfd = start_host()) >= 0)
+ proccreate(hostreader, nil, BSIZE+1024);
+
histp = hist;
menu2.item = menutext2;
menu3.item = menutext3;
@@ -276,25 +341,19 @@ newline(void)
void
cursoff(void)
{
- draw(screen, Rpt(pt(x, y), addpt(pt(x, y), Pt(CW,NS))),
- cursback, nil, cursback->r.min);
+ draw(screen, Rpt(pt(x, y), addpt(pt(x, y), Pt(CW,NS))), cursback, nil, cursback->r.min);
}
void
-curson(int bl)
+curson(void)
{
- Image *col;
+ Image *col = (blocked || hostfd < 0) ? red : bordercol;
if(!cursoron){
cursoff();
return;
}
-
draw(cursback, cursback->r, screen, nil, pt(x, y));
- if(bl)
- col = red;
- else
- col = bordercol;
border(screen, Rpt(pt(x, y), addpt(pt(x, y), Pt(CW,NS))), 2, col, ZP);
}
@@ -357,58 +416,58 @@ canon(char *ep, Rune c)
case Kpgdown:
return SCROLL;
case '\b':
- if(sendp > sendbuf){
- sendp = backrune(sendbuf, sendp);
+ if(sendbufp > sendbuf){
+ sendbufp = backrune(sendbuf, sendbufp);
*ep++ = '\b';
*ep++ = ' ';
*ep++ = '\b';
}
break;
case 0x15: /* ^U line kill */
- sendp = sendbuf;
+ sendbufp = sendbuf;
*ep++ = '^';
*ep++ = 'U';
*ep++ = '\n';
break;
case 0x17: /* ^W word kill */
- while(sendp > sendbuf && !alnum(*sendp)) {
- sendp = backrune(sendbuf, sendp);
+ while(sendbufp > sendbuf && !alnum(*sendbufp)) {
+ sendbufp = backrune(sendbuf, sendbufp);
*ep++ = '\b';
*ep++ = ' ';
*ep++ = '\b';
}
- while(sendp > sendbuf && alnum(*sendp)) {
- sendp = backrune(sendbuf, sendp);
+ while(sendbufp > sendbuf && alnum(*sendbufp)) {
+ sendbufp = backrune(sendbuf, sendbufp);
*ep++ = '\b';
*ep++ = ' ';
*ep++ = '\b';
}
break;
case '\177': /* interrupt */
- sendp = sendbuf;
+ sendbufp = sendbuf;
send_interrupt();
return(NEWLINE);
case '\021': /* quit */
case '\r':
case '\n':
- if(sendp < &sendbuf[BSIZE])
- *sendp++ = '\n';
- sendnchars((int)(sendp-sendbuf), sendbuf);
- sendp = sendbuf;
+ if(sendbufp < &sendbuf[BSIZE])
+ *sendbufp++ = '\n';
+ sendnchars((int)(sendbufp-sendbuf), sendbuf);
+ sendbufp = sendbuf;
if(c == '\n' || c == '\r')
*ep++ = '\n';
*ep = 0;
return(NEWLINE);
case '\004': /* EOT */
- if(sendp == sendbuf) {
+ if(sendbufp == sendbuf) {
sendnchars(0,sendbuf);
*ep = 0;
return(NEWLINE);
}
/* fall through */
default:
- if(sendp < &sendbuf[BSIZE-UTFmax])
- sendp += runetochar(sendp, &c);
+ if(sendbufp < &sendbuf[BSIZE-UTFmax])
+ sendbufp += runetochar(sendbufp, &c);
ep += runetochar(ep, &c);
break;
}
@@ -432,53 +491,30 @@ sendfk(char *name)
int
waitchar(void)
{
- Event e;
- int c;
- int newmouse;
- int wasblocked;
- Rune kbdchar = 0;
- char echobuf[4*BSIZE];
+ static char echobuf[4*BSIZE];
for(;;) {
if(resize_flag)
resize();
- wasblocked = blocked;
if(backp)
return(0);
- if(ecanmouse()){
- if(button1())
- selection();
- else if(button2() || button3())
- readmenu();
- }
if(snarffp) {
- static Rune lastc = ~0;
+ int c;
if((c = Bgetrune(snarffp)) < 0) {
- if(lastc != '\n')
- write(outfd,"\n",1);
Bterm(snarffp);
- snarffp = 0;
- if(lastc != '\n') {
- lastc = ~0;
- return('\n');
- }
- lastc = ~0;
+ snarffp = nil;
continue;
}
- lastc = c;
- write(outfd, echobuf, runetochar(echobuf, &lastc));
- return(c);
+ kbdchar = c;
}
- if(!blocked && host_avail())
- return(rcvchar());
- if(kbdchar > 0) {
+ if(kbdchar) {
if(backc){
backc = 0;
backup(backc);
}
if(blocked)
- resize();
+ resize_flag = 1;
if(cs->raw) {
switch(kbdchar){
case Kup:
@@ -547,51 +583,65 @@ waitchar(void)
sendnchars(runetochar(echobuf, &kbdchar), echobuf);
break;
}
- } else if(canon(echobuf,kbdchar) == SCROLL) {
- if(!blocked)
- bigscroll();
- } else
- strcat(echo_input,echobuf);
+ } else {
+ switch(canon(echobuf, kbdchar)){
+ case SCROLL:
+ if(!blocked)
+ bigscroll();
+ break;
+ default:
+ strcat(echo_input,echobuf);
+ }
+ }
blocked = 0;
kbdchar = 0;
continue;
}
- curson(wasblocked); /* turn on cursor while we're waiting */
- flushimage(display, 1);
- do {
- newmouse = 0;
- switch(eread(blocked ? Emouse|Ekeyboard :
- Emouse|Ekeyboard|Ehost, &e)) {
- case Emouse:
- mouse = e.mouse;
- if(button1())
- selection();
- else if(button2() || button3())
- readmenu();
- else if(resize_flag == 0) {
- /* eresized() is triggered by special mouse event */
- newmouse = 1;
- }
- break;
- case Ekeyboard:
- kbdchar = e.kbdc;
- break;
- case Ehost:
- set_host(&e);
- break;
- default:
- perror("protocol violation");
- exits("protocol violation");
- }
- } while(newmouse == 1);
- cursoff(); /* turn cursor back off */
+ if(!blocked){
+ if(host_avail())
+ return(rcvchar());
+ free(hostbuf);
+ hostbuf = hostbufp = nil;
+ }
+ waitio();
}
}
void
-eresized(int new)
+waitio(void)
{
- resize_flag = 1+new;
+ enum { AMOUSE, ARESIZE, AKBD, AHOST, AEND, };
+ Alt a[AEND+1] = {
+ { mc->c, &mouse, CHANRCV },
+ { mc->resizec, nil, CHANRCV },
+ { kc->c, &kbdchar, CHANRCV },
+ { hc, &hostbuf, CHANNOP },
+ { nil, nil, CHANEND },
+ };
+
+ if(hostbuf == nil) a[AHOST].op = CHANRCV;
+
+ curson(); /* turn on cursor while we're waiting */
+ flushimage(display, 1);
+ switch(alt(a)){
+ case AMOUSE:
+ if(button1())
+ selection();
+ else if(button2() || button3())
+ readmenu();
+ break;
+ case ARESIZE:
+ resize_flag = 2;
+ break;
+ case AHOST:
+ hostbufp = hostbuf;
+ if(hostbufp == nil){
+ close(hostfd);
+ hostfd = -1;
+ }
+ break;
+ }
+ cursoff(); /* turn cursor back off */
}
void
@@ -620,7 +670,6 @@ resize(void)
fprint(2, "can't reattach to window: %r\n");
exits("can't reattach to window");
}
- draw(screen, screen->r, bgcolor, nil, ZP);
xmax = (Dx(screen->r) - 2*INSET)/CW-1;
ymax = (Dy(screen->r) - 2*INSET)/NS-1;
XMARGIN = (Dx(screen->r) - (xmax+1)*CW) / 2;
@@ -629,10 +678,11 @@ resize(void)
y = 0;
yscrmin = 0;
yscrmax = ymax;
- free(onscreen);
- onscreen = mallocz((ymax+1)*(xmax+2)*sizeof(Rune), 1);
olines = 0;
exportsize();
+ free(onscreen);
+ onscreen = mallocz((ymax+1)*(xmax+2)*sizeof(Rune), 1);
+ border(screen, screen->r, XMARGIN+YMARGIN, bgcolor, ZP);
clear(0,0,xmax+1,ymax+1);
if(resize_flag > 1)
backup(backc);
@@ -732,7 +782,8 @@ selection(void)
r.max.x = 0;
d = drawselection(r, ZR, red);
flushimage(display, 1);
- mouse = emouse();
+ readmouse(mc);
+ mouse = mc->Mouse;
draw(screen, d, backup, nil, d.min);
} while(button1());
if((mouse.buttons & 07) == 5)
@@ -754,7 +805,7 @@ readmenu(void)
menu3.item[2] = ttystate[cs->raw].nlcr ? "nl" : "nlcr";
menu3.item[3] = cs->raw ? "cooked" : "raw";
- switch(emenuhit(3, &mouse, &menu3)) {
+ switch(menuhit(3, mc, &menu3, nil)) {
case 0: /* 24x80 */
setdim(24, 80);
return;
@@ -775,7 +826,7 @@ readmenu(void)
menu2.item[5] = pagemode? "scroll": "page";
- switch(emenuhit(2, &mouse, &menu2)) {
+ switch(menuhit(2, mc, &menu2, nil)) {
case 0: /* back up */
if(atend == 0) {
@@ -798,7 +849,7 @@ readmenu(void)
return;
case 3: /* clear screen */
- eresized(0);
+ resize_flag = 1;
return;
case 4: /* send the snarf buffer */
@@ -808,7 +859,7 @@ readmenu(void)
case 5: /* pause and clear at end of screen */
pagemode = 1-pagemode;
if(blocked && !pagemode) {
- eresized(0);
+ resize_flag = 1;
blocked = 0;
}
return;
@@ -821,7 +872,7 @@ backup(int count)
Rune *cp;
int n;
- eresized(0);
+ resize_flag = 1;
if(count == 0 && !pagemode) {
n = ymax;
nbacklines = HISTSIZ; /* make sure we scroll to the very end */
@@ -927,12 +978,11 @@ number(Rune *p, int *got)
void
sendnchars(int n,char *p)
{
- if(write(outfd,p,n) < 0) {
- close(outfd);
- close(0);
- close(1);
- close(2);
- exits("write");
+ if(hostfd < 0)
+ return;
+ if(write(hostfd,p,n) < 0){
+ close(hostfd);
+ hostfd = -1;
}
}
@@ -941,9 +991,7 @@ host_avail(void)
{
if(*echop != 0 && fullrune(echop, strlen(echop)))
return 1;
- if((hostp - host_buf) < hostlength)
- return fullrune(hostp, hostlength - (hostp - host_buf));
- return 0;
+ return hostbufp != nil && *hostbufp != 0;
}
int
@@ -959,24 +1007,7 @@ rcvchar(void)
}
return r;
}
- hostp += chartorune(&r, hostp);
- return r;
-}
-
-void
-set_host(Event *e)
-{
- hostlength -= (hostp - host_buf);
- if(hostlength > 0)
- memmove(host_buf, hostp, hostlength);
- hostlength += e->n;
- if(hostlength >= host_bsize) {
- host_bsize = BSIZE*((hostlength + BSIZE)/BSIZE);
- host_buf = realloc(host_buf, host_bsize);
- }
- memmove(host_buf + hostlength - e->n, e->data, e->n);
- host_buf[hostlength] = 0;
- hostp = host_buf;
+ return *hostbufp++;
}
void
diff --git a/sys/src/cmd/vt/mkfile b/sys/src/cmd/vt/mkfile
index 98001569c..b3a4174e2 100644
--- a/sys/src/cmd/vt/mkfile
+++ b/sys/src/cmd/vt/mkfile
@@ -4,7 +4,6 @@ TARG=vt
OFILES=\
consctl.$O\
- event.$O\
main.$O\
vt.$O\