ref: e04a6eb36e0507363924445f9d0a179e8a75d33d
parent: 69f08756bd8874e3c5bcd216f47af0d00e0164aa
author: cinap_lenrek <cinap_lenrek@rei2.9hal>
date: Wed Jan 18 17:17:04 EST 2012
vncv: add /dev/kbd support
--- a/sys/src/cmd/vnc/kbdv.c
+++ b/sys/src/cmd/vnc/kbdv.c
@@ -41,6 +41,11 @@
{KF|10, 0xffc7}, {KF|11, 0xffc8}, {KF|12, 0xffc9},+
+ {Kshift, Xshift},+ {Kalt, Xalt},+ {Kaltgr, Xmeta},+ {Kctl, Xctl},};
static char shiftkey[128] = {@@ -85,8 +90,8 @@
vncunlock(v);
}
-void
-readkbd(Vnc *v)
+static void
+readcons(Vnc *v)
{char buf[256], k[10];
ulong ks;
@@ -173,6 +178,66 @@
}
break;
}
+ }
+}
+
+ulong
+runetovnc(Rune r)
+{+ ulong k;
+
+ k = runetoksym(r);
+ if((k & 0xff00) && k < nelem(utf2ksym) && utf2ksym[k] != 0)
+ k = utf2ksym[k];
+ return k;
+}
+
+void
+readkbd(Vnc *v)
+{+ char buf[128], buf2[128], *s;
+ int fd, n;
+ Rune r;
+
+ if((fd = open("/dev/kbd", OREAD)) < 0){+ readcons(v);
+ return;
+ }
+ buf2[0] = 0;
+ buf2[1] = 0;
+ while((n = read(fd, buf, sizeof(buf))) > 0){+ buf[n-1] = 0;
+ switch(buf[0]){+ case 'k':
+ s = buf+1;
+ while(*s){+ s += chartorune(&r, s);
+ if(utfrune(buf2+1, r) == nil)
+ if((r == Kshift) ||
+ utfrune(buf+1, Kctl) ||
+ utfrune(buf+1, Kalt) ||
+ utfrune(buf+1, Kaltgr))
+ keyevent(v, runetovnc(r), 1);
+ }
+ break;
+ case 'K':
+ s = buf2+1;
+ while(*s){+ s += chartorune(&r, s);
+ if(utfrune(buf+1, r) == nil)
+ keyevent(v, runetovnc(r), 0);
+ }
+ break;
+ case 'c':
+ chartorune(&r, buf+1);
+ if(utfrune(buf2+1, Kctl) || utfrune(buf2+1, Kalt) || utfrune(buf2+1, Kaltgr))
+ continue;
+ if(utfrune(buf2+1, r))
+ keyevent(v, runetovnc(r), 1);
+ default:
+ continue;
+ }
+ strcpy(buf2, buf);
}
}
--
⑨