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, @@ -331,6 +343,21 @@ [0x78] 0, 0, 0, 0, 0, 0, 0, 0, }; +/* /sys/lib/kbmap/ascii defaults */ +Rune *ascii[Nlayers] = { + [Lnone] kbtab, + [Lshift] kbtabshift, + [Lesc1] kbtabesc1, + [Laltgr] kbtabaltgr, + [Lctl] kbtabctl, + [Lctrlesc1] kbtabctrlesc1, + [Lshiftesc1] kbtabshiftesc1, + [Lshiftaltgr] kbtabshiftaltgr, + [Lmod4] kbtabmod4, + [Laltgrmod4] kbtabaltgrmod4, +}; +Rune kbtabs[Nlayers][Nscan]; + char* dev(char *file) { @@ -415,31 +442,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 +545,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 +1170,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 +1383,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 +1590,7 @@ { killfd = procopen(getpid(), "notepg", OWRITE); elevate(); + resetmap(); proccreate(ctlproc, nil, STACK); }