Make vt ever-better. [jmk] --rw-rw-r-- M 551037 glenda sys 1776 Dec 1 14:00 sys/src/cmd/vt/cons.h /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/cons.h:47,53 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/cons.h:47,53 char *sequence; }; extern struct funckey *fk; - extern struct funckey vt100fk[], vt220fk[], ansifk[]; + extern struct funckey vt100fk[], vt220fk[], ansifk[], xtermfk[]; extern int x, y, xmax, ymax, olines; extern int peekc, attribute; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/cons.h:71,79 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/cons.h:71,84 extern int debug; extern int yscrmin, yscrmax; extern int attribute; + extern int attdefault; extern int frgcolor; extern int bckcolor; + extern int frgdefault; + extern int bckdefault; extern int cursoron; + extern Font *fnt; + extern int wflag; extern void curson(int); extern void cursoff(void); [jmk] --rw-rw-r-- M 551037 glenda sys 1245 Dec 1 14:00 sys/src/cmd/vt/event.c /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/event.c:7,12 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/event.c:7,13 #define BUFSIZ 4000 extern int outfd; + extern int wctlout; int hostpid; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/event.c:31,38 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/event.c:32,46 exits("consctl"); } + if(wflag){ + bind("#|", "/mnt/temp", MREPL); + wctlout = open("/mnt/temp/data", OWRITE); + } + switch((hostpid = rfork(RFPROC|RFNAMEG|RFFDG|RFNOTEG))) { case 0: + if(wflag) + bind("/mnt/temp/data1", "/dev/wctl", MREPL); fd = open("/dev/cons", OREAD); dup(fd,0); if(fd != 0) [jmk] --rw-rw-r-- M 551037 glenda sys 3361 Dec 1 14:00 sys/src/cmd/vt/hp.c /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/hp.c:199,205 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/hp.c:199,205 Rpt(pt(x, y), pt(xmax-n+1, y+1)), S); } xtipple(Rpt(pt(x,y), pt(x+n, y+1))); - string(&screen, pt(x, y), font, buf, DxorS); + string(&screen, pt(x, y), fnt, buf, DxorS); if (standout) rectf(&screen, Rpt(pt(x,y),pt(x+n,y+1)), [jmk] --rw-rw-r-- M 551037 glenda sys 16737 Dec 1 14:00 sys/src/cmd/vt/main.c /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:48,68 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:48,78 char *histp; char hist[HISTSIZ]; int yscrmin, yscrmax; - int bckcolor, frgcolor; - int attribute; + int bckcolor, frgcolor, bckdefault, frgdefault; + int attribute, attdefault; + int wctlout; + int wflag; Image *bordercol; Image *cursback; Image *black; - Image *white; Image *red; Image *green; Image *blue; Image *cyan; - Image *magenta; - Image *yellow; + Image *purple; + Image *brown; Image *grey; + Image *hiblack; + Image *hired; + Image *higreen; + Image *hiblue; + Image *hicyan; + Image *hipurple; + Image *hibrown; + Image *higrey; Image *colortab[8]; + Image *hicolortab[8]; /* terminal control */ struct ttystate ttystate[2] = { {0, 1}, {0, 1} }; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:75,80 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:85,91 int outfd = -1; Biobuf *snarffp = 0; + Font *fnt; char *host_buf; char *hostp; /* input from host */ int host_bsize = 2*BSIZE; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:122,127 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:133,139 { int dayglo = 1; char *p; + char *fname = 0; rfork(RFENVG|RFNAMEG|RFNOTEG); /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:128,133 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:140,148 term = "vt100"; fk = vt100fk; ARGBEGIN{ + case 'f': + fname = EARGF(useage()); + break; case 'a': term = "ansi"; fk = ansifk; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:136,141 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:151,160 term = "vt220"; fk = vt220fk; break; + case 'x': + fk = xtermfk; + term = "xterm"; + break; case 's': /* for sape */ dayglo = 0; break; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:147,152 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:166,174 if(logfd < 0) sysfatal("could not create log file: %s: %r", p); break; + case 'w': + wflag = 1; + break; }ARGEND; host_buf = malloc(host_bsize); /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:159,200 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:181,257 } ebegin(Ehost); + if(fname) + fnt = openfont(display, fname); + if(fnt == nil) + fnt = font; + histp = hist; menu2.item = menutext2; menu3.item = menutext3; pagemode = 0; blocked = 0; - NS = font->height ; - CW = stringwidth(font, "m"); + NS = fnt->height; + CW = stringwidth(fnt, "m"); + bordercol = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xCCCCCCCC); cursback = allocimage(display, Rect(0, 0, CW+1, NS+1), screen->chan, 0, DNofill); - black = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DBlack); - white = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DWhite); - red = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DRed); - green = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DGreen); - yellow = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DYellow); - blue = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DBlue); - magenta = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DMagenta); - cyan = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DCyan); - grey = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DPalegreygreen); - colortab[0] = black; - colortab[1] = red; - colortab[2] = green; - colortab[3] = yellow; - colortab[4] = blue; - colortab[5] = magenta; - colortab[6] = cyan; - colortab[7] = grey; + black = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x000000FF); + red = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0xAA0000FF); + green = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x00AA00FF); + blue = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x0000FFFF); + cyan = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x00AAAAFF); + purple = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0xAA00AAFF); + brown = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0xFF5500FF); + grey = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x7F7F7FFF); - if(dayglo) { - bckcolor = 0; - frgcolor = 7; + hiblack = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x555555FF); + hired = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0xff5555FF); + higreen = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x55ff55FF); + hiblue = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x5555ffFF); + hicyan = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x55ffffFF); + hipurple = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0xff55ffFF); + hibrown = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0xffff55FF); + higrey = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0xffffffFF); + + bckdefault = bckcolor = 0; + frgdefault = frgcolor = 7; + if(dayglo){ + colortab[0] = black; + colortab[1] = red; + colortab[2] = green; + colortab[3] = brown; + colortab[4] = blue; + colortab[5] = purple; + colortab[6] = cyan; + colortab[7] = grey; + hicolortab[0] = hiblack; + hicolortab[1] = hired; + hicolortab[2] = higreen; + hicolortab[3] = hibrown; + hicolortab[4] = hiblue; + hicolortab[5] = hipurple; + hicolortab[6] = hicyan; + hicolortab[7] = higrey; } else { - bckcolor = 7; - frgcolor = 0; - colortab[7] = white; - } + hicolortab[0] = grey; + hicolortab[1] = red; + hicolortab[2] = green; + hicolortab[3] = brown; + hicolortab[4] = blue; + hicolortab[5] = purple; + hicolortab[6] = cyan; + hicolortab[7] = black; + colortab[0] = higrey; + colortab[1] = hired; + colortab[2] = higreen; + colortab[3] = hibrown; + colortab[4] = hiblue; + colortab[5] = hipurple; + colortab[6] = hicyan; + colortab[7] = hiblack; + } eresized(0); /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:229,236 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:286,292 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 /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:238,249 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:294,304 { Image *col; - if(!cursoron){ - cursoff(); + draw(cursback, cursback->r, screen, nil, pt(x, y)); + + if(!cursoron) return; - } - draw(cursback, cursback->r, screen, nil, pt(x, y)); if(bl) col = red; else /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:421,426 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:476,487 case Kright: sendfk("right key"); break; + case Kpgup: + sendfk("page up"); + break; + case Kpgdown: + sendfk("page down"); + break; case KF|1: sendfk("F1"); break; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:540,545 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:601,608 void resize(void) { + static int oldwt; + static int oldht; if(resize_flag > 1 && getwindow(display, Refnone) < 0){ fprint(2, "can't reattach to window: %r\n"); exits("can't reattach to window"); /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:555,560 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:618,628 olines = 0; exportsize(); clear(screen->r); + fprint(wctlout, " %11d %11d %11d %11d", + screen->r.min.x, screen->r.min.y, + screen->r.max.x, screen->r.max.y); + oldwt = Dx(screen->r); + oldht = Dy(screen->r); resize_flag = 0; } /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:690,695 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:758,764 { draw(screen, Rpt(pt(0, dy), pt(xmax+1, dy+ly-sy)), screen, nil, pt(0, sy)); clear(Rpt(pt(0, cy), pt(xmax+1, cy+1))); + flushimage(display,1); } void /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:709,714 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:778,784 y -= half; if(olines) olines -= half; + flushimage(display, 1); } int /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/main.c:827,843 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/main.c:897,931 drawstring(Point p, char *str, int attribute) { Image *txt, *bg; + Rune *rstr; + int i, n; if(!(attribute & TReverse)) { - txt = colortab[frgcolor]; - bg = colortab[bckcolor]; + if(attribute & THighIntensity || bckcolor){ + txt = hicolortab[frgcolor]; + bg = colortab[bckcolor]; + }else{ + txt = colortab[frgcolor]; + bg = colortab[bckcolor]; + } } else { - txt = colortab[bckcolor]; - bg = colortab[frgcolor]; + if(attribute & THighIntensity || bckcolor){ + txt = colortab[bckcolor]; + bg = colortab[frgcolor]; + }else{ + txt = colortab[bckcolor]; + bg = colortab[frgcolor]; + } } - if(attribute & THighIntensity) - txt = white; - draw(screen, Rpt(p, addpt(p, stringsize(font, str))), bg, nil, p); - string(screen, p, txt, ZP, font, str); + n = strlen(str) + 1; + rstr = malloc(n * sizeof(rstr[0])); + + for(i = 0; i < n; ++i) + rstr[i] = (uchar)str[i]; + + draw(screen, Rpt(p, addpt(p, runestringsize(fnt, rstr))), bg, nil, p); + runestring(screen, p, txt, ZP, fnt, rstr); + + free(rstr); } [jmk] --rw-rw-r-- M 551037 glenda sys 20180 Dec 1 14:00 sys/src/cmd/vt/vt.c /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:65,70 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:65,91 { "right key", "\033[C", }, }; + struct funckey xtermfk[NKEYS] = { + { "page up", "\033[5~", }, + { "page down", "\033[6~", }, + { "up key", "\033[A", }, + { "down key", "\033[B", }, + { "left key", "\033[D", }, + { "right key", "\033[C", }, + { "F1", "\033[11~", }, + { "F2", "\033[12~", }, + { "F3", "\033[13~", }, + { "F4", "\033[14~", }, + { "F5", "\033[15~", }, + { "F6", "\033[17~", }, + { "F7", "\033[18~", }, + { "F8", "\033[19~", }, + { "F9", "\033[20~", }, + { "F10", "\033[21~", }, + { "F11", "\033[22~", }, + { "F12", "\033[23~", }, + }; + char gmap[256] = { ['_'] ' ', /* blank */ ['\\'] '*', /* diamond */ /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:103,111 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:124,140 static void setattr(int argc, int *argv); void + fixops(int *operand) + { + if(operand[0] < 1) + operand[0] = 1; + } + + void emulate(void) { char buf[BUFS+1]; + int i; int n; int c; int operand[10]; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:113,118 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:142,148 int savex, savey, saveattribute, saveisgraphics; int isgraphics; int g0set, g1set; + int dch; isgraphics = 0; g0set = 'B'; /* US ASCII */ /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:166,172 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:196,202 case '\013': case '\014': newline(); - attribute = 0; + //attribute = attdefault; if (ttystate[cs->raw].nlcr) x = 0; break; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:173,179 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:203,209 case '\015': /* carriage return */ x = 0; - attribute = 0; + //attribute = attdefault; if (ttystate[cs->raw].crnl) newline(); break; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:208,214 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:238,244 break; case '\033': - switch(get_next_char()){ + switch(dch = get_next_char()){ /* * 1 - graphic processor option on (no-op; not installed) */ /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:225,230 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:255,261 * 7 - save cursor position. */ case '7': + //print("save\n"); savex = x; savey = y; saveattribute = attribute; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:235,240 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:266,272 * 8 - restore cursor position. */ case '8': + //print("restore\n"); x = savex; y = savey; attribute = saveattribute; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:245,252 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:277,284 * c - Reset terminal. */ case 'c': + print("resetterminal\n"); cursoron = 1; - curson(0); ttystate[cs->raw].nlcr = 0; break; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:357,366 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:389,398 * A semi-colon or ? delimits arguments. */ memset(operand, 0, sizeof(operand)); - operand[0] = number(buf, nil); + operand[0] = number(buf, &i); noperand = 1; while(buf[0] == ';' || buf[0] == '?'){ - if(noperand < nelem(operand)) { + if(noperand < nelem(operand)){ noperand++; operand[noperand-1] = number(buf, nil); } else /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:370,376 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:402,408 /* * do escape2 stuff */ - switch(buf[0]){ + switch(dch = buf[0]){ /* * c - same as ESC Z: what are you? */ /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:399,405 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:431,438 if(noperand == 1){ switch(operand[0]){ case 20: /* set line feed mode */ - ttystate[cs->raw].nlcr = 0; + print("linefeedmode\n"); + ttystate[cs->raw].nlcr = 1; break; case 30: /* screen invisible (? not supported through VT220) */ break; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:418,424 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:451,457 case 5: /* set normal video on screen */ break; case 6: /* set origin to absolute */ - print("OL\n"); + //print("OL\n"); originrelative = 0; x = y = 0; break; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:431,437 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:464,469 break; case 25: /* text cursor off (VT220) */ cursoron = 0; - cursoff(); break; } } /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:438,451 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:470,493 break; /* + * s - some dec private stuff. actually [ ? num s, but we can't detect it. + */ + case 's': + break; + + /* * h - set various options. */ case 'h': //print("h%d:%d,%d\n", noperand, operand[0], operand[1]); if(noperand == 1){ - switch(operand[0]){ + switch(operand[0]){ + default: + //print("escape2 'h' unknown operand %d (n:%d)\n", operand[0], noperand-1); + break; case 20: /* set newline mode */ - ttystate[cs->raw].nlcr = 1; + print("newlinemode\n"); + ttystate[cs->raw].nlcr = 0; break; case 30: /* screen visible (? not supported through VT220) */ break; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:452,457 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:494,502 } }else while(--noperand > 0){ switch(operand[noperand]){ + default: + //print("escape2 'h' operand: %d (n:%d)\n", operand[noperand], noperand); + break; case 1: /* set cursor keys to send application function: ESC O A..D */ break; case 2: /* set ANSI */ /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:458,469 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:503,515 break; case 3: /* set 132 columns */ setdim(-1, 132); - break; + break; case 4: /* set smooth scrolling */ break; case 5: /* set screen to reverse video (not implemented) */ break; case 6: /* set origin to relative */ + //print("origin relative\n"); originrelative = 1; x = 0; y = yscrmin; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:477,483 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:523,528 break; case 25: /* text cursor on (VT220) */ cursoron = 1; - curson(0); break; } } /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:499,504 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:544,550 sendnchars2(4, "\033[0n"); /* terminal ok */ break; case 6: /* cursor position */ + //print("cursor pos\n"); sendnchars2(sprint(buf, "\033[%d;%dR", originrelative ? y+1 - yscrmin : y+1, x+1), buf); break; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:509,515 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:555,561 * q - turn on list of LEDs; turn off others. */ case 'q': - // print("LED\n"); + //print("LED\n"); break; /* /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:518,523 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:564,570 * scrolling region. */ case 'r': + //print("scrolling region: n:%d %d %d\n", noperand, operand[1], operand[0]); yscrmin = 0; yscrmax = ymax; switch(noperand){ /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:550,558 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:597,605 /* * A - cursor up. */ + case 'e': case 'A': - if(operand[0] == 0) - operand[0] = 1; + fixops(operand); y -= operand[0]; if(y < yscrmin) y = yscrmin; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:565,572 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:612,618 * B - cursor down */ case 'B': - if(operand[0] == 0) - operand[0] = 1; + fixops(operand); y += operand[0]; if(y > yscrmax) y=yscrmax; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:575,583 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:621,629 /* * C - cursor right */ + case 'a': case 'C': - if(operand[0] == 0) - operand[0] = 1; + fixops(operand); x += operand[0]; /* * VT-100-UG says not to go past the /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:584,590 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:630,636 * right margin. */ if(x > xmax) - x=xmax; + x = xmax; break; /* /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:591,598 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:637,643 * D - cursor left */ case 'D': - if(operand[0] == 0) - operand[0] = 1; + fixops(operand); x -= operand[0]; if(x < 0) x = 0; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:599,624 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:644,685 break; /* + * G - cursor to column + */ + case '\'': + case 'G': + fixops(operand); + x = operand[0] - 1; + if(x > xmax) + x = xmax; + break; + + /* * H and f - cursor motion. operand[0] is row and * operand[1] is column, origin 1. */ case 'H': case 'f': + fixops(operand+1); x = operand[1] - 1; - if(x < 0) - x = 0; if(x > xmax) x = xmax; + + /* fallthrough */ + + /* + * d - cursor to line n (xterm) + */ + case 'd': + fixops(operand); y = operand[0] - 1; - if(y < 0) - y = 0; if(originrelative){ y += yscrmin; if(y > yscrmax) - y = ymax; - }else{ - if(y > yscrmax) y = yscrmax; + }else{ + if(y > ymax) + y = ymax; } break; /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:677,686 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:738,779 break; /* + * P - delete character(s) from right of cursor (xterm) + */ + case 'P': + fixops(operand); + i = x + operand[0]; + draw(screen, Rpt(pt(x, y), pt(xmax+1, y+1)), screen, nil, pt(i, y)); + clear(Rpt(pt(xmax-operand[0], y), pt(xmax+1, y+1))); + break; + + /* + * @ - insert blank(s) to right of cursor (xterm) + */ + case '@': + fixops(operand); + i = x + operand[0]; + draw(screen, Rpt(pt(i, y), pt(xmax+1, y+1)), screen, nil, pt(x, y)); + clear(Rpt(pt(x, y), pt(i, y+1))); + break; + + + /* + * X - erase character(s) at cursor and to the right (xterm) + */ + case 'X': + fixops(operand); + i = x + operand[0]; + clear(Rpt(pt(x, y), pt(i, y+1))); + break; + + /* * L - insert a line at cursor position (VT102 and later) */ case 'L': - scroll(y, yscrmax, y+1, y); + fixops(operand); + for(i = 0; i < operand[0]; ++i) + scroll(y, yscrmax, y+1, y); break; /* /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:687,695 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:780,805 * M - delete a line at cursor position (VT102 and later) */ case 'M': - scroll(y+1, yscrmax+1, y, yscrmax); + fixops(operand); + for(i = 0; i < operand[0]; ++i) + scroll(y+1, yscrmax+1, y, yscrmax); break; + /* + * S,T - scroll up/down (xterm) + */ + case 'T': + fixops(operand); + for(i = 0; i < operand[0]; ++i) + scroll(yscrmin, yscrmax, yscrmin+1, yscrmin); + break; + + case 'S': + fixops(operand); + for(i = 0; i < operand[0]; ++i) + scroll(yscrmin+1, yscrmax+1, yscrmin, yscrmin); + break; + case '=': /* ? not supported through VT220 */ number(buf, nil); switch(buf[0]) { /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:703,708 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:813,819 * Anything else we ignore for now... */ default: + print("unknown escape2 '%c' (0x%x)\n", dch, dch); break; } /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:715,724 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:826,851 peekc = '\033'; break; + /* set title */ + case ']': /* it's actually ] num ; title */ + { + int ch, fd; + number(buf, nil); + i = 0; + while((ch = get_next_char()) != '\a') + if(i < sizeof buf) + buf[i++] = ch; + fd = open("/dev/label", OWRITE); + write(fd, buf, i); + close(fd); + } + break; + /* * Ignore other commands. */ default: + print("unknown command '%c' (0x%x)\n", dch, dch); break; } /n/sourcesdump/2005/1201/plan9/sys/src/cmd/vt/vt.c:763,769 - /n/sourcesdump/2005/1202/plan9/sys/src/cmd/vt/vt.c:890,898 for(i=0; i