diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-13 01:46:00 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-13 01:46:00 +0000 |
commit | a07596935340d512b243ea1337ea874da0a0fb07 (patch) | |
tree | 153e8032420475d56f297f51146a598fbd48e646 | |
parent | 59aaec97ca3fbceeb03477df4f80bf53243f1f6b (diff) |
kbdfs: fix line killing, handle old modifier codes. cga/vga: properly handle unicode
-rw-r--r-- | sys/src/9/pc/cga.c | 61 | ||||
-rw-r--r-- | sys/src/9/pc/vga.c | 2 | ||||
-rw-r--r-- | sys/src/cmd/aux/kbdfs.c | 71 |
3 files changed, 117 insertions, 17 deletions
diff --git a/sys/src/9/pc/cga.c b/sys/src/9/pc/cga.c index 6365d44cc..66b49b5eb 100644 --- a/sys/src/9/pc/cga.c +++ b/sys/src/9/pc/cga.c @@ -36,6 +36,41 @@ enum { static int cgapos; static Lock cgascreenlock; +static Rune cp437[256] = { + 0x2007,0x263A,0x263B,0x2665,0x2666,0x2663,0x2660,0x2022, + 0x25D8,0x25CB,0x25D9,0x2642,0x2640,0x266A,0x266B,0x263C, + 0x25BA,0x25C4,0x2195,0x203C,0x00B6,0x00A7,0x25AC,0x21A8, + 0x2191,0x2193,0x2192,0x2190,0x221F,0x2194,0x25B2,0x25BC, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x2302, + 0x00C7,0x00FC,0x00E9,0x00E2,0x00E4,0x00E0,0x00E5,0x00E7, + 0x00EA,0x00EB,0x00E8,0x00EF,0x00EE,0x00EC,0x00C4,0x00C5, + 0x00C9,0x00E6,0x00C6,0x00F4,0x00F6,0x00F2,0x00FB,0x00F9, + 0x00FF,0x00D6,0x00DC,0x00A2,0x00A3,0x00A5,0x20A7,0x0192, + 0x00E1,0x00ED,0x00F3,0x00FA,0x00F1,0x00D1,0x00AA,0x00BA, + 0x00BF,0x2310,0x00AC,0x00BD,0x00BC,0x00A1,0x00AB,0x00BB, + 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556, + 0x2555,0x2563,0x2551,0x2557,0x255D,0x255C,0x255B,0x2510, + 0x2514,0x2534,0x252C,0x251C,0x2500,0x253C,0x255E,0x255F, + 0x255A,0x2554,0x2569,0x2566,0x2560,0x2550,0x256C,0x2567, + 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256B, + 0x256A,0x2518,0x250C,0x2588,0x2584,0x258C,0x2590,0x2580, + 0x03B1,0x00DF,0x0393,0x03C0,0x03A3,0x03C3,0x00B5,0x03C4, + 0x03A6,0x0398,0x03A9,0x03B4,0x221E,0x03C6,0x03B5,0x2229, + 0x2261,0x00B1,0x2265,0x2264,0x2320,0x2321,0x00F7,0x2248, + 0x00B0,0x2219,0x00B7,0x221A,0x207F,0x00B2,0x25A0,0x00A0, +}; + static uchar cgaregr(int index) { @@ -59,7 +94,7 @@ movecursor(void) } static void -cgascreenputc(int c) +cgascreenputc(Rune c) { int i; uchar *p; @@ -80,7 +115,12 @@ cgascreenputc(int c) cgapos -= 2; } else{ - CGASCREENBASE[cgapos++] = c; + for(i=0; i<nelem(cp437); i++) + if(cp437[i] == c) + break; + if(i == nelem(cp437)) + i = 0xfe; /* peter */ + CGASCREENBASE[cgapos++] = i; CGASCREENBASE[cgapos++] = Attr; } if(cgapos >= Width*Height){ @@ -98,6 +138,9 @@ cgascreenputc(int c) static void cgascreenputs(char* s, int n) { + Rune r; + int i; + if(!islo()){ /* * Don't deadlock trying to @@ -109,8 +152,17 @@ cgascreenputs(char* s, int n) else lock(&cgascreenlock); - while(n-- > 0) - cgascreenputc(*s++); + while(n > 0){ + i = chartorune(&r, s); + if(i <= 0){ + s++; + --n; + continue; + } + cgascreenputc(r); + s += i; + n -= i; + } unlock(&cgascreenlock); } @@ -125,3 +177,4 @@ screeninit(void) screenputs = cgascreenputs; } + diff --git a/sys/src/9/pc/vga.c b/sys/src/9/pc/vga.c index 265b8455e..30c207d24 100644 --- a/sys/src/9/pc/vga.c +++ b/sys/src/9/pc/vga.c @@ -148,7 +148,7 @@ vgascreenputs(char* s, int n) while(n > 0){ i = chartorune(&r, s); - if(i == 0){ + if(i <= 0){ s++; --n; continue; diff --git a/sys/src/cmd/aux/kbdfs.c b/sys/src/cmd/aux/kbdfs.c index a346cee8e..b9287719d 100644 --- a/sys/src/cmd/aux/kbdfs.c +++ b/sys/src/cmd/aux/kbdfs.c @@ -209,6 +209,15 @@ Rune kbtabctrl[Nscan] = [0x78] 0, '', 0, '\b', 0, 0, 0, 0, }; +Rune +mapold(Rune r) +{ + switch(r){ + default: + return r; + } +} + void reboot(void); /* @@ -248,6 +257,18 @@ kbdputsc(Scan *scan, int c) else key.r = kbtab[key.c]; + switch(key.r){ + case Spec|0x60: + key.r = Kshift; + break; + case Spec|0x62: + key.r = Kctl; + break; + case Spec|0x63: + key.r = Kalt; + break; + } + if(scan->caps && key.r<='z' && key.r>='a') key.r += 'A' - 'a'; @@ -389,8 +410,8 @@ void consproc(void *) { char *p, *e, *x, buf[64]; + int n, i; Rune r; - int n; threadsetname("consproc"); @@ -399,7 +420,12 @@ consproc(void *) while((n = read(consfd, p, e - p)) > 0){ x = buf + n; while(p < x && fullrune(p, x - p)){ - p += chartorune(&r, p); + i = chartorune(&r, p); + if(i <= 0){ + p++; + continue; + } + p += i; if(r) send(rawchan, &r); } @@ -428,7 +454,7 @@ lineproc(void *aux) for(;;){ l = emalloc9p(1024); - p = s = l; + p = l; e = l + 1024-(UTFmax+1); done = 0; do { @@ -438,24 +464,45 @@ lineproc(void *aux) p = l; continue; case '\b': /* backspace */ - while(p > l){ - --p; - if(fullrune(p, s - p)) - break; + case Knack: /* ^U */ + s = l; + while(s < p){ + Rune x; + int i; + + i = chartorune(&x, s); + if(i <= 0){ + s++; + continue; + } + s += i; + if(r == '\b'){ + if(s >= p){ + write(echofd, "\b", 1); + s -= i; + break; + } + } else + write(echofd, "\b", 1); } - write(echofd, "\b", 1); + if(r == '\b') + p = s; + else + p = l; continue; - case Keof: - p = l; + case Keof: /* ^D */ done = 1; break; case '\r': continue; case '\n': done = 1; + /* no break */ default: - p += runetochar(s = p, &r); - write(echofd, s, p - s); + s = p; + p += runetochar(p, &r); + if(p > s) + write(echofd, s, p - s); } } while(!done && p < e); *p = 0; |