diff options
-rw-r--r-- | src/cmd/9term/9term.c | 174 | ||||
-rw-r--r-- | src/cmd/9term/9term.h | 109 | ||||
-rw-r--r-- | src/cmd/9term/Linux.c | 1 |
3 files changed, 152 insertions, 132 deletions
diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c index 41a0a2f7..f2d15aca 100644 --- a/src/cmd/9term/9term.c +++ b/src/cmd/9term/9term.c @@ -1,5 +1,113 @@ #include "9term.h" +#define fatal sysfatal + +typedef struct Text Text; +typedef struct Readbuf Readbuf; + +enum +{ + /* these are chosen to use malloc()'s properties well */ + HiWater = 640000, /* max size of history */ + LoWater = 330000, /* min size of history after max'ed */ +}; + +/* various geometric paramters */ +enum +{ + Scrollwid = 12, /* width of scroll bar */ + Scrollgap = 4, /* gap right of scroll bar */ + Maxtab = 4, +}; + +enum +{ + Cut, + Paste, + Snarf, + Send, + Plumb, + Scroll, +}; + + +#define SCROLLKEY Kdown +#define ESC 0x1B +#define CUT 0x18 /* ctrl-x */ +#define COPY 0x03 /* crtl-c */ +#define PASTE 0x16 /* crtl-v */ +#define BACKSCROLLKEY Kup + +#define READBUFSIZE 8192 + +struct Text +{ + Frame *f; /* frame ofr terminal */ + Mouse m; + uint nr; /* num of runes in term */ + Rune *r; /* runes for term */ + uint nraw; /* num of runes in raw buffer */ + Rune *raw; /* raw buffer */ + uint org; /* first rune on the screen */ + uint q0; /* start of selection region */ + uint q1; /* end of selection region */ + uint qh; /* unix point */ + int npart; /* partial runes read from console */ + char part[UTFmax]; + int nsnarf; /* snarf buffer */ + Rune *snarf; +}; + +struct Readbuf +{ + short n; /* # bytes in buf */ + uchar data[READBUFSIZE]; /* data bytes */ +}; + +void mouse(void); +void domenu2(int); +void loop(void); +void geom(void); +void fill(void); +void tcheck(void); +void updatesel(void); +void doreshape(void); +void rcstart(int fd[2], int, char**); +void runewrite(Rune*, int); +void consread(void); +void conswrite(char*, int); +int bswidth(Rune c); +void cut(void); +void paste(Rune*, int, int); +void snarfupdate(void); +void snarf(void); +void show(uint); +void key(Rune); +void setorigin(uint org, int exact); +uint line2q(uint); +uint backnl(uint, uint); +int cansee(uint); +uint backnl(uint, uint); +void addraw(Rune*, int); +void mselect(void); +void doubleclick(uint *q0, uint *q1); +int clickmatch(int cl, int cr, int dir, uint *q); +Rune *strrune(Rune *s, Rune c); +int consready(void); +Rectangle scrpos(Rectangle r, ulong p0, ulong p1, ulong tot); +void scrdraw(void); +void scroll(int); +void hostproc(void *arg); +void hoststart(void); +int getchildwd(int, char*, int); +void plumbstart(void); +void plumb(uint, uint); +void plumbclick(uint*, uint*); +int getpts(int fd[], char *slave); + +#define runemalloc(n) malloc((n)*sizeof(Rune)) +#define runerealloc(a, n) realloc(a, (n)*sizeof(Rune)) +#define runemove(a, b, n) memmove(a, b, (n)*sizeof(Rune)) Rectangle scrollr; /* scroll bar rectangle */ Rectangle lastsr; /* used for scroll bar */ int holdon; /* hold mode */ @@ -10,11 +118,13 @@ uint clickq0; /* point of last click */ int rcfd[2]; int rcpid; int maxtab; +int use9wm; Mousectl* mc; Keyboardctl* kc; Channel* hostc; Readbuf rcbuf[2]; int mainpid; +int acmecolors; int plumbfd; int button2exec; int label(Rune*, int); @@ -27,8 +137,8 @@ char *menu2str[] = { "paste", "snarf", "send", - "scroll", "plumb", + "scroll", 0 }; @@ -83,6 +193,9 @@ threadmain(int argc, char *argv[]) case 's': scrolling++; break; + case 'w': /* started from "rio" window manager */ + use9wm = 1; + break; }ARGEND p = getenv("tabstop"); @@ -104,15 +217,21 @@ threadmain(int argc, char *argv[]) t.f = mallocz(sizeof(Frame), 1); - cols[BACK] = allocimagemix(display, DPaleyellow, DWhite); - cols[HIGH] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DDarkyellow); - cols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DYellowgreen); + if(acmecolors){ + cols[BACK] = allocimagemix(display, DPaleyellow, DWhite); + cols[HIGH] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DDarkyellow); + cols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DYellowgreen); + }else{ + cols[BACK] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DWhite); + cols[HIGH] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0xCCCCCCFF); + cols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x999999FF); + } cols[TEXT] = display->black; cols[HTEXT] = display->black; hcols[BACK] = cols[BACK]; hcols[HIGH] = cols[HIGH]; - hcols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x006600FF); + hcols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DMedblue); hcols[TEXT] = hcols[BORD]; hcols[HTEXT] = hcols[TEXT]; @@ -469,7 +588,6 @@ domenu2(int but) snarf(); t.q0 = t.q1 = t.nr; updatesel(); - snarfupdate(); paste(t.snarf, t.nsnarf, 1); if(t.nsnarf == 0 || t.snarf[t.nsnarf-1] != '\n') paste(newline, 1, 1); @@ -536,7 +654,7 @@ key(Rune r) drawhold(holdon); if(!holdon) consread(); - if(r == 0x1B) + if(r==ESC) return; } @@ -546,9 +664,15 @@ key(Rune r) case 0x7F: /* DEL: send interrupt */ t.qh = t.q0 = t.q1 = t.nr; show(t.q0); + goto Default; +fprint(2, "send interrupt to %d group\n", rcpid); +#ifdef TIOCSIG sig = 2; /* SIGINT */ if(ioctl(rcfd[0], TIOCSIG, &sig) < 0) fprint(2, "sending interrupt: %r\n"); +#else + postnote(PNGROUP, rcpid, "interrupt"); +#endif break; case 0x08: /* ^H: erase character */ case 0x15: /* ^U: erase line */ @@ -558,6 +682,7 @@ key(Rune r) cut(); break; default: + Default: paste(&r, 1, 1); break; } @@ -613,7 +738,7 @@ consready(void) /* look to see if there is a complete line */ for(i=t.qh; i<t.nr; i++){ c = t.r[i]; - if(c=='\n' || c=='\004') + if(c=='\n' || c=='\004' || c=='\x7F') return 1; } return 0; @@ -643,7 +768,7 @@ consread(void) c = *p; p += width; n -= width; - if(!rawon && (c == '\n' || c == '\004')) + if(!rawon && (c == '\n' || c == '\004' || c == '\x7F')) break; } /* take out control-d when not doing a zero length write */ @@ -899,6 +1024,17 @@ paste(Rune *r, int n, int advance) cut(); if(n == 0) return; + /* + * if this is a button2 execute then we might have been passed + * runes inside the buffer. must save them before realloc. + */ + rbuf = nil; + if(t.r <= r && r < t.r+n){ + rbuf = runemalloc(n); + runemove(rbuf, r, n); + r = rbuf; + } + if(t.nr>HiWater && t.q0>=t.org && t.q0>=t.qh){ m = HiWater-LoWater; if(m > t.org) @@ -913,16 +1049,6 @@ paste(Rune *r, int n, int advance) runemove(t.r, t.r+m, t.nr); } - /* - * if this is a button2 execute then we might have been passed - * runes inside the buffer. must save them before realloc. - */ - rbuf = nil; - if(t.r <= r && r < t.r+n){ - rbuf = runemalloc(n); - runemove(rbuf, r, n); - r = rbuf; - } t.r = runerealloc(t.r, t.nr+n); q0 = t.q0; runemove(t.r+q0+n, t.r+q0, t.nr-q0); @@ -1219,23 +1345,23 @@ rcstart(int fd[2], int argc, char **argv) if(getpts(fd, slave) < 0) fprint(2, "getpts: %r\n"); - switch(pid = fork()) { + switch(pid = fork()) { case 0: putenv("TERM", "9term"); close(fd[1]); setsid(); - // tcsetpgrp(0, pid); +// tcsetpgrp(0, pid); sfd = open(slave, ORDWR); if(sfd < 0) fprint(2, "open %s: %r\n", slave); if(ioctl(sfd, TIOCSCTTY, 0) < 0) fprint(2, "ioctl TIOCSCTTY: %r\n"); - // ioctl(sfd, I_PUSH, "ptem"); - // ioctl(sfd, I_PUSH, "ldterm"); +// ioctl(sfd, I_PUSH, "ptem"); +// ioctl(sfd, I_PUSH, "ldterm"); dup(sfd, 0); dup(sfd, 1); dup(sfd, 2); - system("stty tabs -onlcr -echo"); + system("stty tabs -onlcr -echo erase ^h intr ^?"); execvp(argv[0], argv); fprint(2, "exec %s failed: %r\n", argv[0]); _exits("oops"); diff --git a/src/cmd/9term/9term.h b/src/cmd/9term/9term.h index 705648aa..4e8d61f3 100644 --- a/src/cmd/9term/9term.h +++ b/src/cmd/9term/9term.h @@ -14,111 +14,6 @@ #include <pty.h> #endif -#define fatal sysfatal +extern int getchildwd(int, char*, int); +extern int getpts(int[], char*); -typedef struct Text Text; -typedef struct Readbuf Readbuf; - -enum -{ - /* these are chosen to use malloc()'s properties well */ - HiWater = 640000, /* max size of history */ - LoWater = 330000, /* min size of history after max'ed */ -}; - -/* various geometric paramters */ -enum -{ - Scrollwid = 12, /* width of scroll bar */ - Scrollgap = 4, /* gap right of scroll bar */ - Maxtab = 4, -}; - -enum -{ - Cut, - Paste, - Snarf, - Send, - Scroll, - Plumb, -}; - - -#define SCROLLKEY Kdown -#define ESC 0x1B -#define CUT 0x18 /* ctrl-x */ -#define COPY 0x03 /* crtl-c */ -#define PASTE 0x16 /* crtl-v */ -#define BACKSCROLLKEY Kup - -#define READBUFSIZE 8192 - -struct Text -{ - Frame *f; /* frame ofr terminal */ - Mouse m; - uint nr; /* num of runes in term */ - Rune *r; /* runes for term */ - uint nraw; /* num of runes in raw buffer */ - Rune *raw; /* raw buffer */ - uint org; /* first rune on the screen */ - uint q0; /* start of selection region */ - uint q1; /* end of selection region */ - uint qh; /* unix point */ - int npart; /* partial runes read from console */ - char part[UTFmax]; - int nsnarf; /* snarf buffer */ - Rune *snarf; -}; - -struct Readbuf -{ - short n; /* # bytes in buf */ - uchar data[READBUFSIZE]; /* data bytes */ -}; - -void mouse(void); -void domenu2(int); -void loop(void); -void geom(void); -void fill(void); -void tcheck(void); -void updatesel(void); -void doreshape(void); -void rcstart(int fd[2], int, char**); -void runewrite(Rune*, int); -void consread(void); -void conswrite(char*, int); -int bswidth(Rune c); -void cut(void); -void paste(Rune*, int, int); -void snarfupdate(void); -void snarf(void); -void show(uint); -void key(Rune); -void setorigin(uint org, int exact); -uint line2q(uint); -uint backnl(uint, uint); -int cansee(uint); -uint backnl(uint, uint); -void addraw(Rune*, int); -void mselect(void); -void doubleclick(uint *q0, uint *q1); -int clickmatch(int cl, int cr, int dir, uint *q); -Rune *strrune(Rune *s, Rune c); -int consready(void); -Rectangle scrpos(Rectangle r, ulong p0, ulong p1, ulong tot); -void scrdraw(void); -void scroll(int); -void hostproc(void *arg); -void hoststart(void); -int getchildwd(int, char*, int); -void plumbstart(void); -void plumb(uint, uint); -void plumbclick(uint*, uint*); -int getpts(int fd[], char *slave); - -#define runemalloc(n) malloc((n)*sizeof(Rune)) -#define runerealloc(a, n) realloc(a, (n)*sizeof(Rune)) -#define runemove(a, b, n) memmove(a, b, (n)*sizeof(Rune)) diff --git a/src/cmd/9term/Linux.c b/src/cmd/9term/Linux.c index 23f9fbd5..7dd22371 100644 --- a/src/cmd/9term/Linux.c +++ b/src/cmd/9term/Linux.c @@ -17,7 +17,6 @@ getchildwd(int pid, char *wdir, int bufn) int getpts(int fd[], char *slave) { - openpty(&fd[1], &fd[0], slave, 0, 0); return 0; } |