51 static char shiftkey[128] = {
52 0, 0, 0, 0, 0, 0, 0, 0, /* nul soh stx etx eot enq ack bel */
53 0, 0, 0, 0, 0, 0, 0, 0, /* bs ht nl vt np cr so si */
54 0, 0, 0, 0, 0, 0, 0, 0, /* dle dc1 dc2 dc3 dc4 nak syn etb */
55 0, 0, 0, 0, 0, 0, 0, 0, /* can em sub esc fs gs rs us */
56 0, 1, 1, 1, 1, 1, 1, 0, /* sp ! " # $ % & ' */
57 1, 1, 1, 1, 0, 0, 0, 0, /* ( ) * + , - . / */
58 0, 0, 0, 0, 0, 0, 0, 0, /* 0 1 2 3 4 5 6 7 */
59 0, 0, 1, 0, 1, 0, 1, 1, /* 8 9 : ; < = > ? */
60 1, 1, 1, 1, 1, 1, 1, 1, /* @ A B C D E F G */
61 1, 1, 1, 1, 1, 1, 1, 1, /* H I J K L M N O */
62 1, 1, 1, 1, 1, 1, 1, 1, /* P Q R S T U V W */
63 1, 1, 1, 0, 0, 0, 1, 1, /* X Y Z [ \ ] ^ _ */
64 0, 0, 0, 0, 0, 0, 0, 0, /* ` a b c d e f g */
65 0, 0, 0, 0, 0, 0, 0, 0, /* h i j k l m n o */
66 0, 0, 0, 0, 0, 0, 0, 0, /* p q r s t u v w */
67 0, 0, 0, 1, 1, 1, 1, 0, /* x y z { | } ~ del */
75 for(i=0; i<nelem(ktab); i++)
77 return ktab[i].keysym;
82 keyevent(Vnc *v, ulong ksym, int down)
98 int ctlfd, fd, kr, kn, w, shift, ctl, alt;
101 snprint(buf, sizeof buf, "%s/cons", display->devdir);
102 if((fd = open(buf, OREAD)) < 0)
103 sysfatal("open %s: %r", buf);
105 snprint(buf, sizeof buf, "%s/consctl", display->devdir);
106 if((ctlfd = open(buf, OWRITE)) < 0)
107 sysfatal("open %s: %r", buf);
108 write(ctlfd, "rawon", 5);
111 shift = alt = ctl = 0;
113 while(!fullrune(k, kn)){
114 kr = read(fd, k+kn, sizeof k - kn);
116 sysfatal("bad read from kbd");
119 w = chartorune(&r, k);
121 memmove(k, &k[w], kn);
127 keyevent(v, Xalt, alt);
131 keyevent(v, Xctl, ctl);
135 keyevent(v, Xshift, shift);
138 if(r == ks && r < 0x1A){ /* control key */
139 keyevent(v, Xctl, 1);
140 keyevent(v, r+0x60, 1); /* 0x60: make capital letter */
141 keyevent(v, r+0x60, 0);
142 keyevent(v, Xctl, 0);
145 * to send an upper case letter or shifted
146 * punctuation, mac os x vnc server,
147 * at least, needs a `shift' sent first.
149 if(!shift && r == ks && r < sizeof shiftkey && shiftkey[r]){
151 keyevent(v, Xshift, 1);
154 * map an xkeysym onto a utf-8 char.
155 * allows Xvnc to read us, see utf2ksym.h
157 if((ks & 0xff00) && ks < nelem(utf2ksym) && utf2ksym[ks] != 0)
161 * up event needed by vmware inside linux vnc server,
168 keyevent(v, Xalt, 0);
172 keyevent(v, Xctl, 0);
176 keyevent(v, Xshift, 0);
190 if((k & 0xff00) && k < nelem(utf2ksym) && utf2ksym[k] != 0)
198 char buf[128], buf2[128], *s;
202 if((fd = open("/dev/kbd", OREAD)) < 0){
213 memmove(buf, buf+n, sizeof(buf)-n);
216 n = read(fd, buf, sizeof(buf)-1);
226 s += chartorune(&r, s);
227 if(utfrune(buf2+1, r) == nil)
229 utfrune(buf+1, Kctl) ||
230 utfrune(buf+1, Kalt) ||
231 utfrune(buf+1, Kaltgr))
232 keyevent(v, runetovnc(r), 1);
238 s += chartorune(&r, s);
239 if(utfrune(buf+1, r) == nil)
240 keyevent(v, runetovnc(r), 0);
244 if(utfrune(buf2+1, Kctl) || utfrune(buf2+1, Kalt) || utfrune(buf2+1, Kaltgr))
246 chartorune(&r, buf+1);
247 keyevent(v, runetovnc(r), 1);
248 if(utfrune(buf2+1, r) == nil)
249 keyevent(v, runetovnc(r), 0);