summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vnc/kbds.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@rei2.9hal>2012-02-25 23:47:09 +0100
committercinap_lenrek <cinap_lenrek@rei2.9hal>2012-02-25 23:47:09 +0100
commitce6b942ff12cbb7fe7da634004b8f7eed76eee3d (patch)
treeba230e02aae16a07ce7fa8d8b066876ec742d902 /sys/src/cmd/vnc/kbds.c
parentf2b6ec3140935d88d065359619c04992939a1ddc (diff)
vncs: /dev/kbd support by running kbdfs and forwarding keycodes thru kbdin
Diffstat (limited to 'sys/src/cmd/vnc/kbds.c')
-rw-r--r--sys/src/cmd/vnc/kbds.c181
1 files changed, 41 insertions, 140 deletions
diff --git a/sys/src/cmd/vnc/kbds.c b/sys/src/cmd/vnc/kbds.c
index 89f7c80aa..867e0e2f2 100644
--- a/sys/src/cmd/vnc/kbds.c
+++ b/sys/src/cmd/vnc/kbds.c
@@ -1,81 +1,48 @@
#include <u.h>
#include <libc.h>
+#include <keyboard.h>
#include "compat.h"
#include "kbd.h"
#include "ksym2utf.h"
-enum
-{
+enum {
VKSpecial = 0xff00,
-
- /*
- * plan 9 key mappings
- */
- Spec= 0xF800,
-
- PF= Spec|0x20, /* num pad function key */
- View= Spec|0x00, /* view (shift window up) */
- KF= 0xF000, /* function key (begin Unicode private space) */
- Shift= Spec|0x60,
- Break= Spec|0x61,
- Ctrl= Spec|0x62,
- Latin= Spec|0x63,
- Caps= Spec|0x64,
- Num= Spec|0x65,
- Middle= Spec|0x66,
- No= 0x00, /* peter */
-
- Home= KF|13,
- Up= KF|14,
- Pgup= KF|15,
- Print= KF|16,
- Left= KF|17,
- Right= KF|18,
- End= '\r',
- Down= View,
- Pgdown= KF|19,
- Ins= KF|20,
- Del= 0x7F,
- Scroll= KF|21,
-
- Esc = 0x1b,
- Delete = 0x7f,
};
static Rune vnckeys[] =
{
-[0x00] No, No, No, No, No, No, No, No,
-[0x08] '\b', '\t', '\r', No, No, '\n', No, No,
-[0x10] No, No, No, No, Scroll, No, No, No,
-[0x18] No, No, No, Esc, No, No, No, No,
-[0x20] No, No, No, No, No, No, No, No,
-[0x28] No, No, No, No, No, No, No, No,
-[0x30] No, No, No, No, No, No, No, No,
-[0x38] No, No, No, No, No, No, No, No,
-[0x40] No, No, No, No, No, No, No, No,
-[0x48] No, No, No, No, No, No, No, No,
-[0x50] Home, Left, Up, Right, Down, Pgup, Pgdown, No,
-[0x58] No, No, No, No, No, No, No, No,
-[0x60] No, Print, No, Ins, No, No, No, No,
-[0x68] No, No, No, Break, No, No, No, No,
-[0x70] No, No, No, No, No, No, No, No,
-[0x78] No, No, No, No, No, No, No, Num,
-[0x80] No, No, No, No, No, No, No, No,
-[0x88] No, No, No, No, No, No, No, No,
-[0x90] No, No, No, No, No, No, No, No,
-[0x98] No, No, No, No, No, No, No, No,
-[0xa0] No, No, No, No, No, No, No, No,
-[0xa8] No, No, '*', '+', No, '-', '.', '/',
+[0x00] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x08] '\b', '\t', '\r', 0, 0, '\n', 0, 0,
+[0x10] 0, 0, 0, 0, Kscroll,0, 0, 0,
+[0x18] 0, 0, 0, Kesc, 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] Khome, Kleft, Kup, Kright, Kdown, Kpgup, Kpgdown,0,
+[0x58] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x60] 0, Kprint, 0, Kins, 0, 0, 0, 0,
+[0x68] 0, 0, 0, Kbreak, 0, 0, 0, 0,
+[0x70] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x78] 0, 0, 0, 0, 0, 0, 0, Knum,
+[0x80] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x88] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x90] 0, 0, 0, 0, 0, 0, 0, 0,
+[0x98] 0, 0, 0, 0, 0, 0, 0, 0,
+[0xa0] 0, 0, 0, 0, 0, 0, 0, 0,
+[0xa8] 0, 0, '*', '+', 0, '-', '.', '/',
[0xb0] '0', '1', '2', '3', '4', '5', '6', '7',
-[0xb8] '8', '9', No, No, No, '=', No, No,
-[0xc0] No, No, No, No, No, No, No, No,
-[0xc8] No, No, No, No, No, No, No, No,
-[0xd0] No, No, No, No, No, No, No, No,
-[0xd8] No, No, No, No, No, No, No, No,
-[0xe0] No, Shift, Shift, Ctrl, Ctrl, Caps, Caps, No,
-[0xe8] No, Latin, Latin, No, No, No, No, No,
-[0xf0] No, No, No, No, No, No, No, No,
-[0xf8] No, No, No, No, No, No, No, Delete,
+[0xb8] '8', '9', 0, 0, 0, '=', 0, 0,
+[0xc0] 0, 0, 0, 0, 0, 0, 0, 0,
+[0xc8] 0, 0, 0, 0, 0, 0, 0, 0,
+[0xd0] 0, 0, 0, 0, 0, 0, 0, 0,
+[0xd8] 0, 0, 0, 0, 0, 0, 0, 0,
+[0xe0] 0, Kshift, Kshift, Kctl, Kctl, Kcaps, Kcaps, 0,
+[0xe8] 0, Kalt, Kalt, 0, 0, 0, 0, 0,
+[0xf0] 0, 0, 0, 0, 0, 0, 0, 0,
+[0xf8] 0, 0, 0, 0, 0, 0, 0, Kdel,
};
/*
@@ -84,90 +51,24 @@ static Rune vnckeys[] =
void
vncputc(int keyup, int c)
{
- int i;
- static int esc1, esc2;
- static int alt, caps, ctl, num, shift;
- static int collecting, nk;
- static Rune kc[5];
-
- if(caps && c<='z' && c>='a')
- c += 'A' - 'a';
+ char buf[16];
/*
* character mapping
*/
if((c & VKSpecial) == VKSpecial){
c = vnckeys[c & 0xff];
- if(c == No)
+ if(c == 0)
return;
}
/*
* map an xkeysym onto a utf-8 char
*/
if((c & 0xff00) && c < nelem(ksym2utf) && ksym2utf[c] != 0)
- c = ksym2utf[c];
-
- /*
- * keyup only important for shifts
- */
- if(keyup){
- switch(c){
- case Latin:
- alt = 0;
- break;
- case Shift:
- shift = 0;
- break;
- case Ctrl:
- ctl = 0;
- break;
- }
- return;
- }
-
- /*
- * normal character
- */
- if(!(c & (Spec|KF))){
- if(ctl){
- c &= 0x1f;
- }
- if(!collecting){
- kbdputc(c);
- return;
- }
- kc[nk++] = c;
- c = latin1(kc, nk);
- if(c < -1) /* need more keystrokes */
- return;
- if(c != -1) /* valid sequence */
- kbdputc(c);
- else /* dump characters */
- for(i=0; i<nk; i++)
- kbdputc(kc[i]);
- nk = 0;
- collecting = 0;
- return;
- }else{
- switch(c){
- case Caps:
- caps ^= 1;
- return;
- case Num:
- num ^= 1;
- return;
- case Shift:
- shift = 1;
- return;
- case Latin:
- alt = 1;
- collecting = 1;
- nk = 0;
- return;
- case Ctrl:
- ctl = 1;
- return;
- }
- }
- kbdputc(c);
+ c = ksym2utf[c];
+ snprint(buf, sizeof(buf), "r%C", c);
+ if(keyup)
+ buf[0] = 'R';
+ if(kbdin >= 0)
+ write(kbdin, buf, strlen(buf)+1);
}