diff c33588da6fc879d6c355cd1df29b4c1a8f75f854 uncommitted --- a/sys/src/cmd/aux/kbdfs/kbdfs.c +++ b/sys/src/cmd/aux/kbdfs/kbdfs.c @@ -18,6 +18,18 @@ Qconsctl, Nqid, + Lnone = 0, + Lshift, + Lesc1, + Laltgr, + Lctl, + Lctrlesc1, + Lshiftesc1, + Lshiftaltgr, + Lmod4, + Laltgrmod4, + Nlayers, + Rawon= 0, Rawoff, @@ -123,6 +135,9 @@ Channel *kbdchan; /* chan(char*) */ Channel *intchan; /* chan(int) */ +/* /sys/lib/kbmap/ascii defaults */ +Rune ascii[Nlayers][Nscan] = { + /* * The codes at 0x79 and 0x7b are for the (無)変換 "(Mu)henkan" keys * used by OADG 109(A) keyboards. The PFU Happy Hacking keyboard @@ -131,7 +146,7 @@ * these to Kdown and Kup. The jp kbmap will instead map these * (along with 0x70) to control characters that ktrans understands. */ -Rune kbtab[Nscan] = +[Lnone] { [0x00] 0, Kesc, '1', '2', '3', '4', '5', '6', [0x08] '7', '8', '9', '0', '-', '=', '\b', '\t', @@ -149,9 +164,9 @@ [0x68] 0, 0, 0, 0, 0, 0, 0, 0, [0x70] 0, 0, 0, 0, 0, 0, 0, 0, [0x78] 0, Kdown, 0, Kup, 0, 0, 0, 0, -}; +}, -Rune kbtabshift[Nscan] = +[Lshift] { [0x00] 0, Kesc, '!', '@', '#', '$', '%', '^', [0x08] '&', '*', '(', ')', '_', '+', '\b', '\t', @@ -169,9 +184,9 @@ [0x68] 0, 0, 0, 0, 0, 0, 0, 0, [0x70] 0, 0, 0, 0, 0, 0, 0, 0, [0x78] 0, Kdown, 0, Kup, 0, 0, 0, 0, -}; +}, -Rune kbtabesc1[Nscan] = +[Lesc1] { [0x00] 0, 0, 0, 0, 0, 0, 0, 0, [0x08] 0, 0, 0, 0, 0, 0, 0, 0, @@ -189,9 +204,9 @@ [0x68] 0, 0, 0, 0, 0, 0, 0, 0, [0x70] 0, 0, 0, 0, 0, 0, 0, 0, [0x78] 0, Kup, 0, 0, 0, 0, 0, 0, -}; +}, -Rune kbtabshiftesc1[Nscan] = +[Lshiftesc1] { [0x00] 0, 0, 0, 0, 0, 0, 0, 0, [0x08] 0, 0, 0, 0, 0, 0, 0, 0, @@ -209,9 +224,9 @@ [0x68] 0, 0, 0, 0, 0, 0, 0, 0, [0x70] 0, 0, 0, 0, 0, 0, 0, 0, [0x78] 0, Kup, 0, 0, 0, 0, 0, 0, -}; +}, -Rune kbtabctrlesc1[Nscan] = +[Lctrlesc1] { [0x00] 0, 0, 0, 0, 0, 0, 0, 0, [0x08] 0, 0, 0, 0, 0, 0, 0, 0, @@ -229,9 +244,9 @@ [0x68] 0, 0, 0, 0, 0, 0, 0, 0, [0x70] 0, 0, 0, 0, 0, 0, 0, 0, [0x78] 0, Kup, 0, 0, 0, 0, 0, 0, -}; +}, -Rune kbtabaltgr[Nscan] = +[Laltgr] { [0x00] 0, 0, 0, 0, 0, 0, 0, 0, [0x08] 0, 0, 0, 0, 0, 0, 0, 0, @@ -249,9 +264,9 @@ [0x68] 0, 0, 0, 0, 0, 0, 0, 0, [0x70] 0, 0, 0, 0, 0, 0, 0, 0, [0x78] 0, Kup, 0, 0, 0, 0, 0, 0, -}; +}, -Rune kbtabctl[Nscan] = +[Lctl] { [0x00] 0, '', '', '', '', '', '', '', [0x08] '', '', '', '', '', '', '\b', '\t', @@ -269,9 +284,9 @@ [0x68] 0, 0, 0, 0, 0, 0, 0, 0, [0x70] 0, 0, 0, 0, 0, 0, 0, 0, [0x78] 0, '', 0, '\b', 0, 0, 0, 0, -}; +}, -Rune kbtabshiftaltgr[Nscan] = +[Lshiftaltgr] { [0x00] 0, 0, 0, 0, 0, 0, 0, 0, [0x08] 0, 0, 0, 0, 0, 0, 0, 0, @@ -289,9 +304,9 @@ [0x68] 0, 0, 0, 0, 0, 0, 0, 0, [0x70] 0, 0, 0, 0, 0, 0, 0, 0, [0x78] 0, 0, 0, 0, 0, 0, 0, 0, -}; +}, -Rune kbtabmod4[Nscan] = +[Lmod4] { [0x00] 0, 0, 0, 0, 0, 0, 0, 0, [0x08] 0, 0, 0, 0, 0, 0, 0, 0, @@ -309,9 +324,9 @@ [0x68] 0, 0, 0, 0, 0, 0, 0, 0, [0x70] 0, 0, 0, 0, 0, 0, 0, 0, [0x78] 0, 0, 0, 0, 0, 0, 0, 0, -}; +}, -Rune kbtabaltgrmod4[Nscan] = +[Laltgrmod4] { [0x00] 0, 0, 0, 0, 0, 0, 0, 0, [0x08] 0, 0, 0, 0, 0, 0, 0, 0, @@ -329,8 +344,12 @@ [0x68] 0, 0, 0, 0, 0, 0, 0, 0, [0x70] 0, 0, 0, 0, 0, 0, 0, 0, [0x78] 0, 0, 0, 0, 0, 0, 0, 0, +}, + }; +Rune kbtabs[Nlayers][Nscan]; + char* dev(char *file) { @@ -415,31 +434,31 @@ if(c != 0 && strchr("GHIKMOPQRS", c) != nil) scan->esc1 |= !scan->num; - if(scan->esc1 && scan->ctl && kbtabctrlesc1[c] != 0) - key.r = kbtabctrlesc1[c]; - else if(scan->esc1 && scan->shift && kbtabshiftesc1[c] != 0) - key.r = kbtabshiftesc1[c]; + if(scan->esc1 && scan->ctl && kbtabs[Lctrlesc1][c] != 0) + key.r = kbtabs[Lctrlesc1][c]; + else if(scan->esc1 && scan->shift && kbtabs[Lshiftesc1][c] != 0) + key.r = kbtabs[Lshiftesc1][c]; else if(scan->esc1) - key.r = kbtabesc1[c]; - else if(scan->altgr && scan->mod4 && kbtabaltgrmod4[c] != 0) - key.r = kbtabaltgrmod4[c]; - else if(scan->mod4 && kbtabmod4[c] != 0) - key.r = kbtabmod4[c]; - else if(scan->shift && scan->altgr && kbtabshiftaltgr[c] != 0) - key.r = kbtabshiftaltgr[c]; + key.r = kbtabs[Lesc1][c]; + else if(scan->altgr && scan->mod4 && kbtabs[Laltgrmod4][c] != 0) + key.r = kbtabs[Laltgrmod4][c]; + else if(scan->mod4 && kbtabs[Lmod4][c] != 0) + key.r = kbtabs[Lmod4][c]; + else if(scan->shift && scan->altgr && kbtabs[Lshiftaltgr][c] != 0) + key.r = kbtabs[Lshiftaltgr][c]; else if(scan->shift) - key.r = kbtabshift[c]; + key.r = kbtabs[Lshift][c]; else if(scan->altgr) - key.r = kbtabaltgr[c]; + key.r = kbtabs[Laltgr][c]; else if(scan->ctl) - key.r = kbtabctl[c]; + key.r = kbtabs[Lctl][c]; else - key.r = kbtab[c]; + key.r = kbtabs[Lnone][c]; - if(scan->esc1 || kbtab[c] == 0) + if(scan->esc1 || kbtabs[Lnone][c] == 0) key.b = key.r; else - key.b = kbtab[c]; + key.b = kbtabs[Lnone][c]; if(scan->caps && key.r<='z' && key.r>='a') key.r += 'A' - 'a'; @@ -518,12 +537,12 @@ k.b = 0; k.down = (p[0] == 'r'); for(i=0; i= 16 && kbtabctl[i] == k.r)){ + if(kbtabs[Lnone][i] == k.r || kbtabs[Lshift][i] == k.r || (i >= 16 && kbtabs[Lctl][i] == k.r)){ /* assign button from kbtab */ - k.b = kbtab[i]; + k.b = kbtabs[Lnone][i]; /* handle ^X forms */ - if(k.r == kbtab[i] && kbtabctl[i] && !a->shift && !a->altgr && a->ctl) - k.r = kbtabctl[i]; + if(k.r == kbtabs[Lnone][i] && kbtabs[Lctl][i] && !a->shift && !a->altgr && a->ctl) + k.r = kbtabs[Lctl][i]; break; } } @@ -1143,23 +1162,20 @@ * Keyboard layout maps */ +void +resetmap(void) +{ + int i; + + for(i = 0; i < nelem(ascii); i++) + memcpy(kbtabs[i], ascii[i], sizeof kbtabs[i]); +} + Rune* kbmapent(int t, int sc) { - static Rune *tabs[] = { - /* 0 */ kbtab, - /* 1 */ kbtabshift, - /* 2 */ kbtabesc1, - /* 3 */ kbtabaltgr, - /* 4 */ kbtabctl, - /* 5 */ kbtabctrlesc1, - /* 6 */ kbtabshiftesc1, - /* 7 */ kbtabshiftaltgr, - /* 8 */ kbtabmod4, - /* 9 */ kbtabaltgrmod4, - }; - if(t >= 0 && t < nelem(tabs) && sc >= 0 && sc < Nscan) - return &tabs[t][sc]; + if(t >= 0 && t < nelem(kbtabs) && sc >= 0 && sc < Nscan) + return &kbtabs[t][sc]; return nil; } @@ -1359,6 +1375,10 @@ else{ f->aux = nil; switch((ulong)f->qid.path){ + case Qkbmap: + if(r->ifcall.mode & OTRUNC) + resetmap(); + break; case Qkbd: if(kbdopen){ respond(r, Einuse); @@ -1562,6 +1582,7 @@ { killfd = procopen(getpid(), "notepg", OWRITE); elevate(); + resetmap(); proccreate(ctlproc, nil, STACK); }