summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/cmd/aux/kbdfs/kbdfs.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/kbdfs/kbdfs.c b/sys/src/cmd/aux/kbdfs/kbdfs.c
index 172c91258..8a57b52fc 100644
--- a/sys/src/cmd/aux/kbdfs/kbdfs.c
+++ b/sys/src/cmd/aux/kbdfs/kbdfs.c
@@ -42,6 +42,7 @@ struct Scan {
int ctl;
int alt;
int altgr;
+ int mod4;
int leds;
};
@@ -285,6 +286,46 @@ Rune kbtabshiftaltgr[Nscan] =
[0x78] 0, 0, 0, 0, 0, 0, 0, 0,
};
+Rune kbtabmod4[Nscan] =
+{
+[0x00] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x08] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x10] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x18] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x20] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x28] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x30] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x38] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x40] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x48] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x50] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x58] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x60] 0, 0, 0, 0, 0, 0, 0, 0,
+[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] =
+{
+[0x00] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x08] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x10] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x18] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x20] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x28] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x30] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x38] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x40] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x48] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x50] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x58] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x60] 0, 0, 0, 0, 0, 0, 0, 0,
+[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,
+};
+
char*
dev(char *file)
{
@@ -368,6 +409,10 @@ kbdputsc(Scan *scan, int c)
key.r = kbtabshiftesc1[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];
else if(scan->shift)
@@ -403,6 +448,9 @@ kbdputsc(Scan *scan, int c)
case Kaltgr:
scan->altgr = key.down;
break;
+ case Kmod4:
+ scan->mod4 = key.down;
+ break;
case Kalt:
scan->alt = key.down;
break;
@@ -470,6 +518,8 @@ Nextmsg:
a->shift = k.down;
else if(k.r == Kaltgr)
a->altgr = k.down;
+ else if(k.r == Kmod4)
+ a->mod4 = k.down;
else if(k.r == Kctl)
a->ctl = k.down;
send(keychan, &k);
@@ -664,6 +714,7 @@ nextrune(Channel *ch, Rune *r)
case Knum:
case Kshift:
case Kaltgr:
+ case Kmod4:
/* ignore modifiers */
continue;
@@ -1081,6 +1132,8 @@ kbmapent(int t, int sc)
/* 5 */ kbtabctrlesc1,
/* 6 */ kbtabshiftesc1,
/* 7 */ kbtabshiftaltgr,
+ /* 8 */ kbtabmod4,
+ /* 9 */ kbtabaltgrmod4,
};
if(t >= 0 && t < nelem(tabs) && sc >= 0 && sc < Nscan)
return &tabs[t][sc];
@@ -1116,6 +1169,7 @@ kbcompat(Rune r)
static Rune o = Spec|0x60, tab[] = {
Kshift, Kbreak, Kctl, Kalt,
Kcaps, Knum, Kmiddle, Kaltgr,
+ Kmod4,
};
if(r >= o && r < o+nelem(tab))
return tab[r - o];