diff options
author | cinap_lenrek <cinap_lenrek@rei2.9hal> | 2012-02-25 23:47:09 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@rei2.9hal> | 2012-02-25 23:47:09 +0100 |
commit | ce6b942ff12cbb7fe7da634004b8f7eed76eee3d (patch) | |
tree | ba230e02aae16a07ce7fa8d8b066876ec742d902 /sys/src/cmd/vnc/kbds.c | |
parent | f2b6ec3140935d88d065359619c04992939a1ddc (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.c | 181 |
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); } |