ref: a07596935340d512b243ea1337ea874da0a0fb07
parent: 59aaec97ca3fbceeb03477df4f80bf53243f1f6b
author: cinap_lenrek <cinap_lenrek@localhost>
date: Thu May 12 21:46:00 EDT 2011
kbdfs: fix line killing, handle old modifier codes. cga/vga: properly handle unicode
--- a/sys/src/9/pc/cga.c
+++ b/sys/src/9/pc/cga.c
@@ -36,6 +36,41 @@
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 @@
}
static void
-cgascreenputc(int c)
+cgascreenputc(Rune c)
{
int i;
uchar *p;
@@ -80,7 +115,12 @@
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 @@
static void
cgascreenputs(char* s, int n)
{
+ Rune r;
+ int i;
+
if(!islo()){
/*
* Don't deadlock trying to
@@ -109,8 +152,17 @@
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 @@
screenputs = cgascreenputs;
}
+
--- a/sys/src/9/pc/vga.c
+++ b/sys/src/9/pc/vga.c
@@ -148,7 +148,7 @@
while(n > 0){
i = chartorune(&r, s);
- if(i == 0){
+ if(i <= 0){
s++;
--n;
continue;
--- a/sys/src/cmd/aux/kbdfs.c
+++ b/sys/src/cmd/aux/kbdfs.c
@@ -209,6 +209,15 @@
[0x78] 0, '', 0, '\b', 0, 0, 0, 0,
};
+Rune
+mapold(Rune r)
+{
+ switch(r){
+ default:
+ return r;
+ }
+}
+
void reboot(void);
/*
@@ -248,6 +257,18 @@
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 @@
consproc(void *)
{
char *p, *e, *x, buf[64];
+ int n, i;
Rune r;
- int n;
threadsetname("consproc");
@@ -399,7 +420,12 @@
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 @@
for(;;){
l = emalloc9p(1024);
- p = s = l;
+ p = l;
e = l + 1024-(UTFmax+1);
done = 0;
do {
@@ -438,15 +464,33 @@
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':
@@ -453,9 +497,12 @@
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;