[libvirt] [PATCH 1/3 V3] lib: add virtkey

Lai Jiangshan laijs at cn.fujitsu.com
Fri Jun 24 06:33:29 UTC 2011


Add virtkey lib for usage-improvment and keycode translating.
Add 4 internal API for the aim

const char *virKeycodeSetName(virKeycodeSet codeset);
virKeycodeSet virParseKeycodeSet(const char *name);
int virParseKeyName(virKeycodeSet codeset, const char *keyname);
int virTranslateKeyCode(virKeycodeSet from_codeset,
                        virKeycodeSet to_offset,
                        int key_value);

Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>
---
 include/libvirt/libvirt.h.in |    6 +
 src/Makefile.am              |    3 +-
 src/libvirt_private.syms     |    5 +
 src/util/virtkey.c           |  633 ++++++++++++++++++++++++++++++++++++++++++
 src/util/virtkey.h           |   21 ++
 tools/virsh.c                |    1 +
 6 files changed, 668 insertions(+), 1 deletions(-)
 create mode 100644 src/util/virtkey.c
 create mode 100644 src/util/virtkey.h

diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 3f634e6..2f2efe7 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -1815,6 +1815,12 @@ typedef enum {
     VIR_KEYCODE_SET_ATSET1         = 2,
     VIR_KEYCODE_SET_ATSET2         = 3,
     VIR_KEYCODE_SET_ATSET3         = 4,
+    VIR_KEYCODE_SET_OSX            = 5,
+    VIR_KEYCODE_SET_XT_KBD         = 6,
+    VIR_KEYCODE_SET_USB            = 7,
+    VIR_KEYCODE_SET_WIN32          = 8,
+    VIR_KEYCODE_SET_XWIN_XT        = 9,
+    VIR_KEYCODE_SET_XFREE86_KBD_XT = 10,
 } virKeycodeSet;
 
 /**
diff --git a/src/Makefile.am b/src/Makefile.am
index 4f9bfc9..e34ea74 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -81,7 +81,8 @@ UTIL_SOURCES =							\
 		util/util.c util/util.h				\
 		util/xml.c util/xml.h				\
 		util/virtaudit.c util/virtaudit.h               \
-		util/virterror.c util/virterror_internal.h
+		util/virterror.c util/virterror_internal.hi	\
+		util/virtkey.c util/virtkey.h
 
 EXTRA_DIST += util/threads-pthread.c util/threads-win32.c
 
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 09b0159..151e256 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1059,6 +1059,11 @@ virSetError;
 virSetErrorLogPriorityFunc;
 virStrerror;
 
+# virtkey.h
+virKeycodeSetName;
+virParseKeycodeSet;
+virParseKeyName;
+virTranslateKeyCode;
 
 # xml.h
 virXMLParseFileHelper;
diff --git a/src/util/virtkey.c b/src/util/virtkey.c
new file mode 100644
index 0000000..48fbfcc
--- /dev/null
+++ b/src/util/virtkey.c
@@ -0,0 +1,633 @@
+
+/*
+ * Copyright (c) 2011 Lai Jiangshan
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+#include <config.h>
+#include <string.h>
+#include <stddef.h>
+#include <libvirt/libvirt.h>
+#include "virtkey.h"
+
+#define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
+#define getfield(object, field_type, field_offset) \
+    (*(typeof(field_type) *)((char *)(object) + field_offset))
+
+struct keycode {
+    const char *linux_name;
+    const char *os_x_name;
+    const char *win32_name;
+    unsigned short linux_keycode;
+    unsigned short xt;
+    unsigned short atset1;
+    unsigned short atset2;
+    unsigned short atset3;
+    unsigned short os_x;
+    unsigned short xt_kbd;
+    unsigned short usb;
+    unsigned short win32;
+    unsigned short xwin_xt;
+    unsigned short xfree86_kbd_xt;
+};
+
+/*
+ * generated from http://git.gnome.org/browse/gtk-vnc/plain/src/keymaps.csv
+ * script:
+ *
+ * #!/bin/python
+ * import sys
+ * import re
+ *
+ * for line in sys.stdin.xreadlines():
+ *     a = re.match("([^,]*)," * 13 + "([^,]*)$", line[0:-1]).groups()
+ *     b = ""
+ *     for i in (0,2,10,1,7,4,5,6,3,8,9,11,12,13):
+ *         if i in (0, 2, 10):
+ *             b = b + (a[i] and ('"' + a[i] + '"') or 'NULL') + ','
+ *         else:
+ *             b = b + (a[i] or '0') + ','
+ *     print "    { " + b + "},"
+ */
+static struct keycode keycodes[] = {
+    { "KEY_RESERVED",NULL,NULL,0,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_ESC","Escape","VK_ESCAPE",1,1,1,118,8,0x35,1,41,0x1b,1,1,},
+    { "KEY_1","ANSI_1","VK_1",2,2,2,22,22,0x12,2,30,0x31,2,2,},
+    { "KEY_2","ANSI_2","VK_2",3,3,3,30,30,0x13,3,31,0x32,3,3,},
+    { "KEY_3","ANSI_3","VK_3",4,4,4,38,38,0x14,4,32,0x33,4,4,},
+    { "KEY_4","ANSI_4","VK_4",5,5,5,37,37,0x15,5,33,0x34,5,5,},
+    { "KEY_5","ANSI_5","VK_5",6,6,6,46,46,0x17,6,34,0x35,6,6,},
+    { "KEY_6","ANSI_6","VK_6",7,7,7,54,54,0x16,7,35,0x36,7,7,},
+    { "KEY_7","ANSI_7","VK_7",8,8,8,61,61,0x1a,8,36,0x37,8,8,},
+    { "KEY_8","ANSI_8","VK_8",9,9,9,62,62,0x1c,9,37,0x38,9,9,},
+    { "KEY_9","ANSI_9","VK_9",10,10,10,70,70,0x19,10,38,0x39,10,10,},
+    { "KEY_0","ANSI_0","VK_0",11,11,11,69,69,0x1d,11,39,0x30,11,11,},
+    { "KEY_MINUS","ANSI_Minus","VK_OEM_MINUS",12,12,12,78,78,0x1b,12,45,0xbd,12,12,},
+    { "KEY_EQUAL","ANSI_Equal","VK_OEM_PLUS",13,13,13,85,85,0x18,13,46,0xbb,13,13,},
+    { "KEY_BACKSPACE","Delete","VK_BACK",14,14,14,102,102,0x33,14,42,0x08,14,14,},
+    { "KEY_TAB","Tab","VK_TAB",15,15,15,13,13,0x30,15,43,0x09,15,15,},
+    { "KEY_Q","ANSI_Q","VK_Q",16,16,16,21,21,0xc,16,20,0x51,16,16,},
+    { "KEY_W","ANSI_W","VK_W",17,17,17,29,29,0xd,17,26,0x57,17,17,},
+    { "KEY_E","ANSI_E","VK_E",18,18,18,36,36,0xe,18,8,0x45,18,18,},
+    { "KEY_R","ANSI_R","VK_R",19,19,19,45,45,0xf,19,21,0x52,19,19,},
+    { "KEY_T","ANSI_T","VK_T",20,20,20,44,44,0x11,20,23,0x54,20,20,},
+    { "KEY_Y","ANSI_Y","VK_Y",21,21,21,53,53,0x10,21,28,0x59,21,21,},
+    { "KEY_U","ANSI_U","VK_U",22,22,22,60,60,0x20,22,24,0x55,22,22,},
+    { "KEY_I","ANSI_I","VK_I",23,23,23,67,67,0x22,23,12,0x49,23,23,},
+    { "KEY_O","ANSI_O","VK_O",24,24,24,68,68,0x1f,24,18,0x4f,24,24,},
+    { "KEY_P","ANSI_P","VK_P",25,25,25,77,77,0x23,25,19,0x50,25,25,},
+    { "KEY_LEFTBRACE","ANSI_LeftBracket","VK_OEM_4",26,26,26,84,84,0x21,26,47,0xdb,26,26,},
+    { "KEY_RIGHTBRACE","ANSI_RightBracket","VK_OEM_6",27,27,27,91,91,0x1e,27,48,0xdd,27,27,},
+    { "KEY_ENTER","Return","VK_RETURN",28,28,28,90,90,0x24,28,40,0x0d,28,28,},
+    { "KEY_LEFTCTRL","Control","VK_LCONTROL",29,29,29,20,17,0x3b,29,224,0xa2,29,29,},
+    { "KEY_A","ANSI_A","VK_A",30,30,30,28,28,0x0,30,4,0x41,30,30,},
+    { "KEY_S","ANSI_S","VK_S",31,31,31,27,27,0x1,31,22,0x53,31,31,},
+    { "KEY_D","ANSI_D","VK_D",32,32,32,35,35,0x2,32,7,0x44,32,32,},
+    { "KEY_F","ANSI_F","VK_F",33,33,33,43,43,0x3,33,9,0x46,33,33,},
+    { "KEY_G","ANSI_G","VK_G",34,34,34,52,52,0x5,34,10,0x47,34,34,},
+    { "KEY_H","ANSI_H","VK_H",35,35,35,51,51,0x4,35,11,0x48,35,35,},
+    { "KEY_J","ANSI_J","VK_J",36,36,36,59,59,0x26,36,13,0x4a,36,36,},
+    { "KEY_K","ANSI_K","VK_K",37,37,37,66,66,0x28,37,14,0x4b,37,37,},
+    { "KEY_L","ANSI_L","VK_L",38,38,38,75,75,0x25,38,15,0x4c,38,38,},
+    { "KEY_SEMICOLON","ANSI_Semicolon","VK_OEM_1",39,39,39,76,76,0x29,39,51,0xba,39,39,},
+    { "KEY_APOSTROPHE","ANSI_Quote","VK_OEM_2",40,40,40,82,82,0x27,40,52,0xbf,40,40,},
+    { "KEY_GRAVE","ANSI_Grave","VK_OEM_3",41,41,41,14,14,0x32,41,53,0xc0,41,41,},
+    { "KEY_LEFTSHIFT","Shift","VK_LSHIFT",42,42,42,18,18,0x38,42,225,0xa0,42,42,},
+    { "KEY_BACKSLASH","ANSI_Backslash","VK_OEM_5",43,43,43,93,93,0x2a,43,50,0xdc,43,43,},
+    { "KEY_Z","ANSI_Z","VK_Z",44,44,44,26,26,0x6,44,29,0x5a,44,44,},
+    { "KEY_X","ANSI_X","VK_X",45,45,45,34,34,0x7,45,27,0x58,45,45,},
+    { "KEY_C","ANSI_C","VK_C",46,46,46,33,33,0x8,46,6,0x43,46,46,},
+    { "KEY_V","ANSI_V","VK_V",47,47,47,42,42,0x9,47,25,0x56,47,47,},
+    { "KEY_B","ANSI_B","VK_B",48,48,48,50,50,0xb,48,5,0x42,48,48,},
+    { "KEY_N","ANSI_N","VK_N",49,49,49,49,49,0x2d,49,17,0x4e,49,49,},
+    { "KEY_M","ANSI_M","VK_M",50,50,50,58,58,0x2e,50,16,0x4d,50,50,},
+    { "KEY_COMMA","ANSI_Comma","VK_OEM_COMMA",51,51,51,65,65,0x2b,51,54,0xbc,51,51,},
+    { "KEY_DOT","ANSI_Period","VK_OEM_PERIOD",52,52,52,73,73,0x2f,52,55,0xbe,52,52,},
+    { "KEY_SLASH","ANSI_Slash","VK_OEM_2",53,53,53,74,74,0x2c,53,56,0xbf,53,53,},
+    { "KEY_RIGHTSHIFT","RightShift","VK_RSHIFT",54,54,54,89,89,0x3c,54,229,0xa1,54,54,},
+    { "KEY_KPASTERISK","ANSI_KeypadMultiply","VK_MULTIPLY",55,55,55,124,126,0x43,55,85,0x6a,55,55,},
+    { "KEY_LEFTALT","Option","VK_LMENU",56,56,56,17,25,0x3a,56,226,0xa4,56,56,},
+    { "KEY_SPACE","Space","VK_SPACE",57,57,57,41,41,0x31,57,44,0x20,57,57,},
+    { "KEY_CAPSLOCK","CapsLock","VK_CAPITAL",58,58,58,88,20,0x39,58,57,0x14,58,58,},
+    { "KEY_F1","F1","VK_F1",59,59,59,5,7,0x7a,59,58,0x70,59,59,},
+    { "KEY_F2","F2","VK_F2",60,60,60,6,15,0x78,60,59,0x71,60,60,},
+    { "KEY_F3","F3","VK_F3",61,61,61,4,23,0x63,61,60,0x72,61,61,},
+    { "KEY_F4","F4","VK_F4",62,62,62,12,31,0x76,62,61,0x73,62,62,},
+    { "KEY_F5","F5","VK_F5",63,63,63,3,39,0x60,63,62,0x74,63,63,},
+    { "KEY_F6","F6","VK_F6",64,64,64,11,47,0x61,64,63,0x75,64,64,},
+    { "KEY_F7","F7","VK_F7",65,65,65,259,55,0x62,65,64,0x76,65,65,},
+    { "KEY_F8","F8","VK_F8",66,66,66,10,63,0x64,66,65,0x77,66,66,},
+    { "KEY_F9","F9","VK_F9",67,67,67,1,71,0x65,67,66,0x78,67,67,},
+    { "KEY_F10","F10","VK_F10",68,68,68,9,79,0x6d,68,67,0x79,68,68,},
+    { "KEY_NUMLOCK",NULL,"VK_NUMLOCK",69,69,69,119,118,0,69,83,0x90,69,69,},
+    { "KEY_SCROLLLOCK",NULL,"VK_SCROLL",70,70,70,126,95,0,70,71,0x91,70,70,},
+    { "KEY_KP7","ANSI_Keypad7","VK_NUMPAD7",71,71,71,108,108,0x59,71,95,0x67,71,71,},
+    { "KEY_KP8","ANSI_Keypad8","VK_NUMPAD8",72,72,72,117,117,0x5b,72,96,0x68,72,72,},
+    { "KEY_KP9","ANSI_Keypad9","VK_NUMPAD9",73,73,73,125,125,0x5c,73,97,0x69,73,73,},
+    { "KEY_KPMINUS","ANSI_KeypadMinus","VK_SUBTRACT",74,74,74,123,132,0x4e,74,86,0x6d,74,74,},
+    { "KEY_KP4","ANSI_Keypad4","VK_NUMPAD4",75,75,75,107,107,0x56,75,92,0x64,75,75,},
+    { "KEY_KP5","ANSI_Keypad5","VK_NUMPAD5",76,76,76,115,115,0x57,76,93,0x65,76,76,},
+    { "KEY_KP6","ANSI_Keypad6","VK_NUMPAD6",77,77,77,116,116,0x58,77,94,0x66,77,77,},
+    { "KEY_KPPLUS","ANSI_KeypadPlus","VK_ADD",78,78,78,121,124,0x45,78,87,0x6b,78,78,},
+    { "KEY_KP1","ANSI_Keypad1","VK_NUMPAD1",79,79,79,105,105,0x53,79,89,0x61,79,79,},
+    { "KEY_KP2","ANSI_Keypad2","VK_NUMPAD2",80,80,80,114,114,0x54,80,90,0x62,80,80,},
+    { "KEY_KP3","ANSI_Keypad3","VK_NUMPAD3",81,81,81,122,122,0x55,81,91,0x63,81,81,},
+    { "KEY_KP0","ANSI_Keypad0","VK_NUMPAD0",82,82,82,112,112,0x52,82,98,0x60,82,82,},
+    { "KEY_KPDOT","ANSI_KeypadDecimal","VK_DECIMAL",83,83,83,113,113,0x41,83,99,0x6e,83,83,},
+    { NULL,NULL,NULL,84,0,0,0,0,0,84,0,0,0,0,},
+    { "KEY_ZENKAKUHANKAKU",NULL,NULL,85,0,118,95,0,0,118,148,0,0,0,},
+    { "KEY_102ND",NULL,"VK_OEM_102",86,0,86,97,19,0,86,100,0xe1,0,0,},
+    { "KEY_F11","F11","VK_F11",87,101,87,120,86,0x67,87,68,0x7a,0,0,},
+    { "KEY_F12","F12","VK_F12",88,102,88,7,94,0x6f,88,69,0x7b,0,0,},
+    { "KEY_RO",NULL,NULL,89,0,115,81,0,0,115,135,0,0,0,},
+    { "KEY_KATAKANA","JIS_Kana????","VK_KANA",90,0,120,99,0,0x68,120,146,0x15,0,0,},
+    { "KEY_HIRAGANA",NULL,NULL,91,0,119,98,0,0,119,147,0,0,0,},
+    { "KEY_HENKAN",NULL,NULL,92,0,121,100,134,0,121,138,0,0,0,},
+    { "KEY_KATAKANAHIRAGANA",NULL,NULL,93,0,112,19,135,0,112,136,0,0xc8,0xc8,},
+    { "KEY_MUHENKAN",NULL,NULL,94,0,123,103,133,0,123,139,0,0,0,},
+    { "KEY_KPJPCOMMA","JIS_KeypadComma",NULL,95,0,92,39,0,0x5f,92,140,0,0,0,},
+    { "KEY_KPENTER","ANSI_KeypadEnter",NULL,96,0,0,158,121,0x4c,284,88,0,0x64,0x64,},
+    { "KEY_RIGHTCTRL","RightControl","VK_RCONTROL",97,0,0,0,88,0x3e,285,228,0xa3,0x65,0x65,},
+    { "KEY_KPSLASH","ANSI_KeypadDivide","VK_DIVIDE",98,0,0,181,119,0x4b,309,84,0x6f,0x68,0x68,},
+    { "KEY_SYSRQ",NULL,"VK_SNAPSHOT ???",99,0,84,260,87,0,84,70,0x2c,0x67,0x67,},
+    { "KEY_RIGHTALT","RightOption","VK_RMENU",100,0,0,0,57,0x3d,312,230,0xa5,0x69,0x69,},
+    { "KEY_LINEFEED",NULL,NULL,101,0,0,0,0,0,91,0,0,0,0,},
+    { "KEY_HOME","Home","VK_HOME",102,0,0,224,110,0x73,327,74,0x24,0x59,0x59,},
+    { "KEY_UP","UpArrow","VK_UP",103,109,0,236,99,0x7e,328,82,0x26,0x5a,0x5a,},
+    { "KEY_PAGEUP","PageUp","VK_PRIOR",104,0,0,201,111,0x74,329,75,0x21,0x5b,0x5b,},
+    { "KEY_LEFT","LeftArrow","VK_LEFT",105,111,0,203,97,0x7b,331,80,0x25,0x5c,0x5c,},
+    { "KEY_RIGHT","RightArrow","VK_RIGHT",106,112,0,205,106,0x7c,333,79,0x27,0x5e,0x5e,},
+    { "KEY_END","End","VK_END",107,0,0,225,101,0x77,335,77,0x23,0x5f,0x5f,},
+    { "KEY_DOWN","DownArrow","VK_DOWN",108,110,0,254,96,0x7d,336,81,0x28,0x60,0x60,},
+    { "KEY_PAGEDOWN","PageDown","VK_NEXT",109,0,0,243,109,0x79,337,78,0x22,0x61,0x61,},
+    { "KEY_INSERT",NULL,"VK_INSERT",110,107,0,210,103,0,338,73,0x2d,0x62,0x62,},
+    { "KEY_DELETE","ForwardDelete","VK_DELETE",111,108,0,244,100,0x75,339,76,0x2e,0x63,0x63,},
+    { "KEY_MACRO",NULL,NULL,112,0,0,239,142,0,367,0,0,0,0,},
+    { "KEY_MUTE","Mute","VK_VOLUME_MUTE",113,0,0,251,156,0x4a,288,239,0xad,0,0,},
+    { "KEY_VOLUMEDOWN","VolumeDown","VK_VOLUME_DOWN",114,0,0,0,157,0x49,302,238,0xae,0,0,},
+    { "KEY_VOLUMEUP","VolumeUp","VK_VOLUME_UP",115,0,0,233,149,0x48,304,237,0xaf,0,0,},
+    { "KEY_POWER",NULL,NULL,116,0,0,0,0,0,350,102,0,0,0,},
+    { "KEY_KPEQUAL","ANSI_KeypadEquals",NULL,117,0,89,15,0,0x51,89,103,0,0x76,0x76,},
+    { "KEY_KPPLUSMINUS",NULL,NULL,118,0,0,206,0,0,334,0,0,0,0,},
+    { "KEY_PAUSE",NULL,"VK_PAUSE",119,0,0,198,98,0,326,72,0x013,0x66,0x66,},
+    { "KEY_SCALE",NULL,NULL,120,0,0,0,0,0,267,0,0,0,0,},
+    { "KEY_KPCOMMA","ANSI_KeypadClear????","VK_SEPARATOR??",121,0,126,109,0,0x47,126,133,0x6c,0,0,},
+    { "KEY_HANGEUL",NULL,"VK_HANGEUL",122,0,0,0,0,0,0,144,0x15,0,0,},
+    { "KEY_HANJA",NULL,"VK_HANJA",123,0,0,0,0,0,269,145,0x19,0,0,},
+    { "KEY_YEN","JIS_Yen",NULL,124,0,125,106,0,0x5d,125,137,0,0x7d,0x7d,},
+    { "KEY_LEFTMETA","Command","VK_LWIN",125,0,0,0,139,0x37,347,227,0x5b,0x6b,0x6b,},
+    { "KEY_RIGHTMETA",NULL,"VK_RWIN",126,0,0,0,140,0,348,231,0x5c,0x6c,0x6c,},
+    { "KEY_COMPOSE","Function","VK_APPS",127,0,0,0,141,0x3f,349,101,0x5d,0x6d,0x6d,},
+    { "KEY_STOP",NULL,"VK_BROWSER_STOP",128,0,0,0,10,0,360,243,0xa9,0,0,},
+    { "KEY_AGAIN",NULL,NULL,129,0,0,0,11,0,261,121,0,0,0,},
+    { "KEY_PROPS",NULL,NULL,130,0,0,0,12,0,262,118,0,0,0,},
+    { "KEY_UNDO",NULL,NULL,131,0,0,0,16,0,263,122,0,0,0,},
+    { "KEY_FRONT",NULL,NULL,132,0,0,0,0,0,268,119,0,0,0,},
+    { "KEY_COPY",NULL,NULL,133,0,0,0,24,0,376,124,0,0,0,},
+    { "KEY_OPEN",NULL,NULL,134,0,0,0,32,0,100,116,0,0,0,},
+    { "KEY_PASTE",NULL,NULL,135,0,0,0,40,0,101,125,0,0,0,},
+    { "KEY_FIND",NULL,NULL,136,0,0,0,48,0,321,244,0,0,0,},
+    { "KEY_CUT",NULL,NULL,137,0,0,0,56,0,316,123,0,0,0,},
+    { "KEY_HELP",NULL,"VK_HELP",138,0,0,0,9,0,373,117,0x2f,0,0,},
+    { "KEY_MENU",NULL,NULL,139,0,0,0,145,0,286,0,0,0,0,},
+    { "KEY_CALC",NULL,NULL,140,0,0,174,163,0,289,251,0,0,0,},
+    { "KEY_SETUP",NULL,NULL,141,0,0,0,0,0,102,0,0,0,0,},
+    { "KEY_SLEEP",NULL,"VK_SLEEP",142,0,0,0,0,0,351,248,0x5f,0,0,},
+    { "KEY_WAKEUP",NULL,NULL,143,0,0,0,0,0,355,0,0,0,0,},
+    { "KEY_FILE",NULL,NULL,144,0,0,0,0,0,103,0,0,0,0,},
+    { "KEY_SENDFILE",NULL,NULL,145,0,0,0,0,0,104,0,0,0,0,},
+    { "KEY_DELETEFILE",NULL,NULL,146,0,0,0,0,0,105,0,0,0,0,},
+    { "KEY_XFER",NULL,NULL,147,0,0,0,162,0,275,0,0,0,0,},
+    { "KEY_PROG1",NULL,NULL,148,0,0,0,160,0,287,0,0,0,0,},
+    { "KEY_PROG2",NULL,NULL,149,0,0,0,161,0,279,0,0,0,0,},
+    { "KEY_WWW",NULL,NULL,150,0,0,0,0,0,258,240,0,0,0,},
+    { "KEY_MSDOS",NULL,NULL,151,0,0,0,0,0,106,0,0,0,0,},
+    { "KEY_SCREENLOCK",NULL,NULL,152,0,0,0,150,0,274,249,0,0,0,},
+    { "KEY_DIRECTION",NULL,NULL,153,0,0,0,0,0,107,0,0,0,0,},
+    { "KEY_CYCLEWINDOWS",NULL,NULL,154,0,0,0,155,0,294,0,0,0,0,},
+    { "KEY_MAIL",NULL,NULL,155,0,0,0,0,0,364,0,0,0,0,},
+    { "KEY_BOOKMARKS",NULL,NULL,156,0,0,0,0,0,358,0,0,0,0,},
+    { "KEY_COMPUTER",NULL,NULL,157,0,0,0,0,0,363,0,0,0,0,},
+    { "KEY_BACK",NULL,"VK_BROWSER_BACK",158,0,0,0,0,0,362,241,0xa6,0,0,},
+    { "KEY_FORWARD",NULL,"VK_BROWSER_FORWARD",159,0,0,0,0,0,361,242,0xa7,0,0,},
+    { "KEY_CLOSECD",NULL,NULL,160,0,0,0,154,0,291,0,0,0,0,},
+    { "KEY_EJECTCD",NULL,NULL,161,0,0,0,0,0,108,236,0,0,0,},
+    { "KEY_EJECTCLOSECD",NULL,NULL,162,0,0,0,0,0,381,0,0,0,0,},
+    { "KEY_NEXTSONG",NULL,"VK_MEDIA_NEXT_TRACK",163,0,0,241,147,0,281,235,0xb0,0,0,},
+    { "KEY_PLAYPAUSE",NULL,"VK_MEDIA_PLAY_PAUSE",164,0,0,173,0,0,290,232,0xb3,0,0,},
+    { "KEY_PREVIOUSSONG",NULL,"VK_MEDIA_PREV_TRACK",165,0,0,250,148,0,272,234,0xb1,0,0,},
+    { "KEY_STOPCD",NULL,"VK_MEDIA_STOP",166,0,0,164,152,0,292,233,0xb2,0,0,},
+    { "KEY_RECORD",NULL,NULL,167,0,0,0,158,0,305,0,0,0,0,},
+    { "KEY_REWIND",NULL,NULL,168,0,0,0,159,0,280,0,0,0,0,},
+    { "KEY_PHONE",NULL,NULL,169,0,0,0,0,0,99,0,0,0,0,},
+    { "KEY_ISO","ISO_Section",NULL,170,0,0,0,0,0xa,112,0,0,0,0,},
+    { "KEY_CONFIG",NULL,NULL,171,0,0,0,0,0,257,0,0,0,0,},
+    { "KEY_HOMEPAGE",NULL,"VK_BROWSER_HOME",172,0,0,178,151,0,306,0,0xac,0,0,},
+    { "KEY_REFRESH",NULL,"VK_BROWSER_REFRESH",173,0,0,0,0,0,359,250,0xa8,0,0,},
+    { "KEY_EXIT",NULL,NULL,174,0,0,0,0,0,113,0,0,0,0,},
+    { "KEY_MOVE",NULL,NULL,175,0,0,0,0,0,114,0,0,0,0,},
+    { "KEY_EDIT",NULL,NULL,176,0,0,0,0,0,264,247,0,0,0,},
+    { "KEY_SCROLLUP",NULL,NULL,177,0,0,0,0,0,117,245,0,0,0,},
+    { "KEY_SCROLLDOWN",NULL,NULL,178,0,0,0,0,0,271,246,0,0,0,},
+    { "KEY_KPLEFTPAREN",NULL,NULL,179,0,0,0,0,0,374,182,0,0,0,},
+    { "KEY_KPRIGHTPAREN",NULL,NULL,180,0,0,0,0,0,379,183,0,0,0,},
+    { "KEY_NEW",NULL,NULL,181,0,0,0,0,0,265,0,0,0,0,},
+    { "KEY_REDO",NULL,NULL,182,0,0,0,0,0,266,0,0,0,0,},
+    { "KEY_F13","F13","VK_F13",183,0,93,47,127,0x69,93,104,0x7c,0x6e,0x6e,},
+    { "KEY_F14","F14","VK_F14",184,0,94,55,128,0x6b,94,105,0x7d,0x6f,0x6f,},
+    { "KEY_F15","F15","VK_F15",185,0,95,63,129,0x71,95,106,0x7e,0x70,0x70,},
+    { "KEY_F16","F16","VK_F16",186,0,0,0,130,0x6a,85,107,0x7f,0x71,0x71,},
+    { "KEY_F17","F17","VK_F17",187,0,0,0,131,0x40,259,108,0x80,0x72,0x72,},
+    { "KEY_F18","F18","VK_F18",188,0,0,0,0,0x4f,375,109,0x81,0,0,},
+    { "KEY_F19","F19","VK_F19",189,0,0,0,0,0x50,260,110,0x82,0,0,},
+    { "KEY_F20","F20","VK_F20",190,0,0,0,0,0x5a,90,111,0x83,0,0,},
+    { "KEY_F21",NULL,"VK_F21",191,0,0,0,0,0,116,112,0x84,0,0,},
+    { "KEY_F22",NULL,"VK_F22",192,0,0,0,0,0,377,113,0x85,0,0,},
+    { "KEY_F23",NULL,"VK_F23",193,0,0,0,0,0,109,114,0x86,0,0,},
+    { "KEY_F24",NULL,"VK_F24",194,0,0,0,0,0,111,115,0x87,0,0,},
+    { NULL,NULL,NULL,195,0,0,0,0,0,277,0,0,0,0,},
+    { NULL,NULL,NULL,196,0,0,0,0,0,278,0,0,0,0,},
+    { NULL,NULL,NULL,197,0,0,0,0,0,282,0,0,0,0,},
+    { NULL,NULL,NULL,198,0,0,0,0,0,283,0,0,0,0,},
+    { NULL,NULL,NULL,199,0,0,0,0,0,295,0,0,0,0,},
+    { "KEY_PLAYCD",NULL,NULL,200,0,0,0,0,0,296,0,0,0,0,},
+    { "KEY_PAUSECD",NULL,NULL,201,0,0,0,0,0,297,0,0,0,0,},
+    { "KEY_PROG3",NULL,NULL,202,0,0,0,0,0,299,0,0,0,0,},
+    { "KEY_PROG4",NULL,NULL,203,0,0,0,0,0,300,0,0,0,0,},
+    { "KEY_DASHBOARD",NULL,NULL,204,0,0,0,0,0,301,0,0,0,0,},
+    { "KEY_SUSPEND",NULL,NULL,205,0,0,0,0,0,293,0,0,0,0,},
+    { "KEY_CLOSE",NULL,NULL,206,0,0,0,0,0,303,0,0,0,0,},
+    { "KEY_PLAY",NULL,"VK_PLAY",207,0,0,0,0,0,307,0,0xfa,0,0,},
+    { "KEY_FASTFORWARD",NULL,NULL,208,0,0,0,0,0,308,0,0,0,0,},
+    { "KEY_BASSBOOST",NULL,NULL,209,0,0,0,0,0,310,0,0,0,0,},
+    { "KEY_PRINT",NULL,"VK_PRINT",210,0,0,0,0,0,313,0,0x2a,0,0,},
+    { "KEY_HP",NULL,NULL,211,0,0,0,0,0,314,0,0,0,0,},
+    { "KEY_CAMERA",NULL,NULL,212,0,0,0,0,0,315,0,0,0,0,},
+    { "KEY_SOUND",NULL,NULL,213,0,0,0,0,0,317,0,0,0,0,},
+    { "KEY_QUESTION",NULL,NULL,214,0,0,0,0,0,318,0,0,0,0,},
+    { "KEY_EMAIL",NULL,"VK_LAUNCH_MAIL",215,0,0,0,0,0,319,0,0xb4,0,0,},
+    { "KEY_CHAT",NULL,NULL,216,0,0,0,0,0,320,0,0,0,0,},
+    { "KEY_SEARCH",NULL,"VK_BROWSER_SEARCH",217,0,0,0,0,0,357,0,0xaa,0,0,},
+    { "KEY_CONNECT",NULL,NULL,218,0,0,0,0,0,322,0,0,0,0,},
+    { "KEY_FINANCE",NULL,NULL,219,0,0,0,0,0,323,0,0,0,0,},
+    { "KEY_SPORT",NULL,NULL,220,0,0,0,0,0,324,0,0,0,0,},
+    { "KEY_SHOP",NULL,NULL,221,0,0,0,0,0,325,0,0,0,0,},
+    { "KEY_ALTERASE",NULL,NULL,222,0,0,0,0,0,276,0,0,0,0,},
+    { "KEY_CANCEL",NULL,NULL,223,0,0,0,0,0,330,0,0,0,0,},
+    { "KEY_BRIGHTNESSDOWN",NULL,NULL,224,0,0,0,0,0,332,0,0,0,0,},
+    { "KEY_BRIGHTNESSUP",NULL,NULL,225,0,0,0,0,0,340,0,0,0,0,},
+    { "KEY_MEDIA",NULL,NULL,226,0,0,0,0,0,365,0,0,0,0,},
+    { "KEY_SWITCHVIDEOMODE",NULL,NULL,227,0,0,0,0,0,342,0,0,0,0,},
+    { "KEY_KBDILLUMTOGGLE",NULL,NULL,228,0,0,0,0,0,343,0,0,0,0,},
+    { "KEY_KBDILLUMDOWN",NULL,NULL,229,0,0,0,0,0,344,0,0,0,0,},
+    { "KEY_KBDILLUMUP",NULL,NULL,230,0,0,0,0,0,345,0,0,0,0,},
+    { "KEY_SEND",NULL,NULL,231,0,0,0,0,0,346,0,0,0,0,},
+    { "KEY_REPLY",NULL,NULL,232,0,0,0,0,0,356,0,0,0,0,},
+    { "KEY_FORWARDMAIL",NULL,NULL,233,0,0,0,0,0,270,0,0,0,0,},
+    { "KEY_SAVE",NULL,NULL,234,0,0,0,0,0,341,0,0,0,0,},
+    { "KEY_DOCUMENTS",NULL,NULL,235,0,0,0,0,0,368,0,0,0,0,},
+    { "KEY_BATTERY",NULL,NULL,236,0,0,0,0,0,369,0,0,0,0,},
+    { "KEY_BLUETOOTH",NULL,NULL,237,0,0,0,0,0,370,0,0,0,0,},
+    { "KEY_WLAN",NULL,NULL,238,0,0,0,0,0,371,0,0,0,0,},
+    { "KEY_UWB",NULL,NULL,239,0,0,0,0,0,372,0,0,0,0,},
+    { "KEY_UNKNOWN",NULL,NULL,240,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_VIDEO_NEXT",NULL,NULL,241,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_VIDEO_PREV",NULL,NULL,242,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRIGHTNESS_CYCLE",NULL,NULL,243,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRIGHTNESS_ZERO",NULL,NULL,244,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_DISPLAY_OFF",NULL,NULL,245,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_WIMAX",NULL,NULL,246,0,0,0,0,0,0,0,0,0,0,},
+    { NULL,NULL,NULL,247,0,0,0,0,0,0,0,0,0,0,},
+    { NULL,NULL,NULL,248,0,0,0,0,0,0,0,0,0,0,},
+    { NULL,NULL,NULL,249,0,0,0,0,0,0,0,0,0,0,},
+    { NULL,NULL,NULL,250,0,0,0,0,0,0,0,0,0,0,},
+    { NULL,NULL,NULL,251,0,0,0,0,0,0,0,0,0,0,},
+    { NULL,NULL,NULL,252,0,0,0,0,0,0,0,0,0,0,},
+    { NULL,NULL,NULL,253,0,0,0,0,0,0,0,0,0,0,},
+    { NULL,NULL,NULL,254,0,0,0,0,0,0,0,0,0,0,},
+    { NULL,NULL,NULL,255,0,0,182,0,0,0,0,0,0,0,},
+    { "BTN_MISC",NULL,NULL,0x100,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_0",NULL,"VK_LBUTTON",0x100,0,0,0,0,0,0,0,0x01,0,0,},
+    { "BTN_1",NULL,"VK_RBUTTON",0x101,0,0,0,0,0,0,0,0x02,0,0,},
+    { "BTN_2",NULL,"VK_MBUTTON",0x102,0,0,0,0,0,0,0,0x04,0,0,},
+    { "BTN_3",NULL,"VK_XBUTTON1",0x103,0,0,0,0,0,0,0,0x05,0,0,},
+    { "BTN_4",NULL,"VK_XBUTTON2",0x104,0,0,0,0,0,0,0,0x06,0,0,},
+    { "BTN_5",NULL,NULL,0x105,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_6",NULL,NULL,0x106,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_7",NULL,NULL,0x107,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_8",NULL,NULL,0x108,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_9",NULL,NULL,0x109,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_MOUSE",NULL,NULL,0x110,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_LEFT",NULL,NULL,0x110,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_RIGHT",NULL,NULL,0x111,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_MIDDLE",NULL,NULL,0x112,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_SIDE",NULL,NULL,0x113,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_EXTRA",NULL,NULL,0x114,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_FORWARD",NULL,NULL,0x115,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_BACK",NULL,NULL,0x116,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TASK",NULL,NULL,0x117,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_JOYSTICK",NULL,NULL,0x120,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TRIGGER",NULL,NULL,0x120,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_THUMB",NULL,NULL,0x121,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_THUMB2",NULL,NULL,0x122,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOP",NULL,NULL,0x123,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOP2",NULL,NULL,0x124,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_PINKIE",NULL,NULL,0x125,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_BASE",NULL,NULL,0x126,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_BASE2",NULL,NULL,0x127,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_BASE3",NULL,NULL,0x128,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_BASE4",NULL,NULL,0x129,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_BASE5",NULL,NULL,0x12a,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_BASE6",NULL,NULL,0x12b,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_DEAD",NULL,NULL,0x12f,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_GAMEPAD",NULL,NULL,0x130,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_A",NULL,NULL,0x130,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_B",NULL,NULL,0x131,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_C",NULL,NULL,0x132,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_X",NULL,NULL,0x133,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_Y",NULL,NULL,0x134,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_Z",NULL,NULL,0x135,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TL",NULL,NULL,0x136,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TR",NULL,NULL,0x137,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TL2",NULL,NULL,0x138,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TR2",NULL,NULL,0x139,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_SELECT",NULL,NULL,0x13a,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_START",NULL,NULL,0x13b,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_MODE",NULL,NULL,0x13c,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_THUMBL",NULL,NULL,0x13d,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_THUMBR",NULL,NULL,0x13e,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_DIGI",NULL,NULL,0x140,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_PEN",NULL,NULL,0x140,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_RUBBER",NULL,NULL,0x141,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_BRUSH",NULL,NULL,0x142,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_PENCIL",NULL,NULL,0x143,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_AIRBRUSH",NULL,NULL,0x144,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_FINGER",NULL,NULL,0x145,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_MOUSE",NULL,NULL,0x146,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_LENS",NULL,NULL,0x147,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOUCH",NULL,NULL,0x14a,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_STYLUS",NULL,NULL,0x14b,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_STYLUS2",NULL,NULL,0x14c,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_DOUBLETAP",NULL,NULL,0x14d,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_TRIPLETAP",NULL,NULL,0x14e,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_TOOL_QUADTAP",NULL,NULL,0x14f,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_WHEEL",NULL,NULL,0x150,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_GEAR_DOWN",NULL,NULL,0x150,0,0,0,0,0,0,0,0,0,0,},
+    { "BTN_GEAR_UP",NULL,NULL,0x151,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_OK",NULL,NULL,0x160,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_SELECT",NULL,"VK_SELECT",0x161,0,0,0,0,0,0,0,0x29,0,0,},
+    { "KEY_GOTO",NULL,NULL,0x162,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_CLEAR",NULL,NULL,0x163,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_POWER2",NULL,NULL,0x164,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_OPTION",NULL,NULL,0x165,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_INFO",NULL,NULL,0x166,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_TIME",NULL,NULL,0x167,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_VENDOR",NULL,NULL,0x168,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_ARCHIVE",NULL,NULL,0x169,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_PROGRAM",NULL,NULL,0x16a,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_CHANNEL",NULL,NULL,0x16b,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FAVORITES",NULL,"VK_BROWSER_FAVOURITES",0x16c,0,0,0,0,0,0,0,0xab,0,0,},
+    { "KEY_EPG",NULL,NULL,0x16d,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_PVR",NULL,NULL,0x16e,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_MHP",NULL,NULL,0x16f,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_LANGUAGE",NULL,NULL,0x170,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_TITLE",NULL,NULL,0x171,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_SUBTITLE",NULL,NULL,0x172,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_ANGLE",NULL,NULL,0x173,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_ZOOM",NULL,"VK_ZOOM",0x174,0,0,0,0,0,0,0,0xfb,0,0,},
+    { "KEY_MODE",NULL,NULL,0x175,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_KEYBOARD",NULL,NULL,0x176,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_SCREEN",NULL,NULL,0x177,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_PC",NULL,NULL,0x178,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_TV",NULL,NULL,0x179,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_TV2",NULL,NULL,0x17a,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_VCR",NULL,NULL,0x17b,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_VCR2",NULL,NULL,0x17c,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_SAT",NULL,NULL,0x17d,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_SAT2",NULL,NULL,0x17e,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_CD",NULL,NULL,0x17f,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_TAPE",NULL,NULL,0x180,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_RADIO",NULL,NULL,0x181,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_TUNER",NULL,NULL,0x182,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_PLAYER",NULL,NULL,0x183,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_TEXT",NULL,NULL,0x184,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_DVD",NULL,NULL,0x185,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_AUX",NULL,NULL,0x186,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_MP3",NULL,NULL,0x187,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_AUDIO",NULL,NULL,0x188,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_VIDEO",NULL,NULL,0x189,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_DIRECTORY",NULL,NULL,0x18a,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_LIST",NULL,NULL,0x18b,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_MEMO",NULL,NULL,0x18c,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_CALENDAR",NULL,NULL,0x18d,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_RED",NULL,NULL,0x18e,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_GREEN",NULL,NULL,0x18f,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_YELLOW",NULL,NULL,0x190,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BLUE",NULL,NULL,0x191,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_CHANNELUP",NULL,NULL,0x192,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_CHANNELDOWN",NULL,NULL,0x193,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FIRST",NULL,NULL,0x194,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_LAST",NULL,NULL,0x195,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_AB",NULL,NULL,0x196,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NEXT",NULL,NULL,0x197,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_RESTART",NULL,NULL,0x198,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_SLOW",NULL,NULL,0x199,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_SHUFFLE",NULL,NULL,0x19a,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BREAK",NULL,NULL,0x19b,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_PREVIOUS",NULL,NULL,0x19c,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_DIGITS",NULL,NULL,0x19d,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_TEEN",NULL,NULL,0x19e,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_TWEN",NULL,NULL,0x19f,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_VIDEOPHONE",NULL,NULL,0x1a0,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_GAMES",NULL,NULL,0x1a1,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_ZOOMIN",NULL,NULL,0x1a2,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_ZOOMOUT",NULL,NULL,0x1a3,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_ZOOMRESET",NULL,NULL,0x1a4,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_WORDPROCESSOR",NULL,NULL,0x1a5,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_EDITOR",NULL,NULL,0x1a6,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_SPREADSHEET",NULL,NULL,0x1a7,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_GRAPHICSEDITOR",NULL,NULL,0x1a8,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_PRESENTATION",NULL,NULL,0x1a9,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_DATABASE",NULL,NULL,0x1aa,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NEWS",NULL,NULL,0x1ab,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_VOICEMAIL",NULL,NULL,0x1ac,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_ADDRESSBOOK",NULL,NULL,0x1ad,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_MESSENGER",NULL,NULL,0x1ae,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_DISPLAYTOGGLE",NULL,NULL,0x1af,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_SPELLCHECK",NULL,NULL,0x1b0,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_LOGOFF",NULL,NULL,0x1b1,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_DOLLAR",NULL,NULL,0x1b2,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_EURO",NULL,NULL,0x1b3,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FRAMEBACK",NULL,NULL,0x1b4,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FRAMEFORWARD",NULL,NULL,0x1b5,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_CONTEXT_MENU",NULL,NULL,0x1b6,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_MEDIA_REPEAT",NULL,NULL,0x1b7,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_DEL_EOL",NULL,NULL,0x1c0,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_DEL_EOS",NULL,NULL,0x1c1,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_INS_LINE",NULL,NULL,0x1c2,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_DEL_LINE",NULL,NULL,0x1c3,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN",NULL,NULL,0x1d0,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_ESC",NULL,NULL,0x1d1,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F1",NULL,NULL,0x1d2,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F2",NULL,NULL,0x1d3,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F3",NULL,NULL,0x1d4,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F4",NULL,NULL,0x1d5,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F5",NULL,NULL,0x1d6,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F6",NULL,NULL,0x1d7,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F7",NULL,NULL,0x1d8,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F8",NULL,NULL,0x1d9,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F9",NULL,NULL,0x1da,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F10",NULL,NULL,0x1db,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F11",NULL,NULL,0x1dc,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F12",NULL,NULL,0x1dd,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_1",NULL,NULL,0x1de,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_2",NULL,NULL,0x1df,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_D",NULL,NULL,0x1e0,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_E",NULL,NULL,0x1e1,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_F",NULL,NULL,0x1e2,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_S",NULL,NULL,0x1e3,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_FN_B",NULL,NULL,0x1e4,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRL_DOT1",NULL,NULL,0x1f1,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRL_DOT2",NULL,NULL,0x1f2,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRL_DOT3",NULL,NULL,0x1f3,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRL_DOT4",NULL,NULL,0x1f4,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRL_DOT5",NULL,NULL,0x1f5,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRL_DOT6",NULL,NULL,0x1f6,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRL_DOT7",NULL,NULL,0x1f7,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRL_DOT8",NULL,NULL,0x1f8,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRL_DOT9",NULL,NULL,0x1f9,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_BRL_DOT10",NULL,NULL,0x1fa,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_0",NULL,NULL,0x200,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_1",NULL,NULL,0x201,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_2",NULL,NULL,0x202,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_3",NULL,NULL,0x203,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_4",NULL,NULL,0x204,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_5",NULL,NULL,0x205,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_6",NULL,NULL,0x206,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_7",NULL,NULL,0x207,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_8",NULL,NULL,0x208,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_9",NULL,NULL,0x209,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_STAR",NULL,NULL,0x20a,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_NUMERIC_POUND",NULL,NULL,0x20b,0,0,0,0,0,0,0,0,0,0,},
+    { "KEY_RFKILL",NULL,NULL,0x20c,0,0,0,0,0,0,0,0,0,0,},
+};
+
+struct virCodesetInfo {
+    const char *name;
+    unsigned int offset;
+};
+
+struct virCodesetInfo codesetInfo[] = {
+    [VIR_KEYCODE_SET_LINUX] =
+        { "linux", offsetof(struct keycode, linux_keycode)},
+    [VIR_KEYCODE_SET_XT] =
+        { "xt", offsetof(struct keycode, xt)},
+    [VIR_KEYCODE_SET_ATSET1] =
+        { "atset1", offsetof(struct keycode, atset1)},
+    [VIR_KEYCODE_SET_ATSET2] =
+        { "atset2", offsetof(struct keycode, atset2)},
+    [VIR_KEYCODE_SET_ATSET3] =
+        { "atset3", offsetof(struct keycode, atset3)},
+    [VIR_KEYCODE_SET_OSX] =
+        { "os-x", offsetof(struct keycode, os_x)},
+    [VIR_KEYCODE_SET_XT_KBD] =
+        { "xt_kbd", offsetof(struct keycode, xt_kbd)},
+    [VIR_KEYCODE_SET_USB] =
+        { "usb", offsetof(struct keycode, usb)},
+    [VIR_KEYCODE_SET_WIN32] =
+        { "win32", offsetof(struct keycode, win32)},
+    [VIR_KEYCODE_SET_XWIN_XT] =
+        { "xwin_xt", offsetof(struct keycode, xwin_xt)},
+    [VIR_KEYCODE_SET_XFREE86_KBD_XT] =
+        { "xfree86_kbd_xt", offsetof(struct keycode, xfree86_kbd_xt)},
+};
+
+const char *virKeycodeSetName(virKeycodeSet codeset)
+{
+    int i = (int)codeset;
+
+    if (i < 0 || i >= ARRAY_SIZE(codesetInfo))
+        return "UNKNOWN";
+
+    return codesetInfo[i].name;
+}
+
+virKeycodeSet virParseKeycodeSet(const char *name)
+{
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(codesetInfo); i++) {
+        if (!strcmp(codesetInfo[i].name, name))
+            return (virKeycodeSet)i;
+    }
+
+    return (virKeycodeSet)-1;
+}
+
+static int virParseKeyNameOffset(unsigned int name_offset,
+                                 unsigned int code_offset,
+                                 const char *keyname)
+{
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(keycodes); i++) {
+        const char *name = getfield(keycodes + i, const char *, name_offset);
+
+        if (name && !strcmp(name, keyname))
+            return getfield(keycodes + i, unsigned short, code_offset);
+    }
+
+    return -1;
+}
+
+int virParseKeyName(virKeycodeSet codeset, const char *keyname)
+{
+    switch (codeset) {
+    case VIR_KEYCODE_SET_LINUX:
+        return virParseKeyNameOffset(offsetof(struct keycode, linux_name),
+                                     offsetof(struct keycode, linux_keycode), keyname);
+    case VIR_KEYCODE_SET_OSX:
+        return virParseKeyNameOffset(offsetof(struct keycode, os_x_name),
+                                     offsetof(struct keycode, os_x), keyname);
+    case VIR_KEYCODE_SET_WIN32:
+        return virParseKeyNameOffset(offsetof(struct keycode, win32_name),
+                                     offsetof(struct keycode, win32), keyname);
+    default:
+        return -1;
+    }
+}
+
+static int virTranslateKeyCodeOffset(unsigned int from_offset,
+                                     unsigned int to_offset,
+                                     int key_value)
+{
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(keycodes); i++) {
+        if (getfield(keycodes + i, unsigned short, from_offset) == key_value)
+            return getfield(keycodes + i, unsigned short, to_offset);
+    }
+
+    return -1;
+}
+
+int virTranslateKeyCode(virKeycodeSet from_codeset,
+                        virKeycodeSet to_codeset,
+                        int key_value)
+{
+    if (key_value <= 0)
+        return -1;
+
+    key_value = virTranslateKeyCodeOffset(codesetInfo[from_codeset].offset,
+                                          codesetInfo[to_codeset].offset,
+                                          key_value);
+    if (key_value <= 0)
+        return -1;
+
+    return key_value;
+}
+
+
diff --git a/src/util/virtkey.h b/src/util/virtkey.h
new file mode 100644
index 0000000..f81bcb1
--- /dev/null
+++ b/src/util/virtkey.h
@@ -0,0 +1,21 @@
+#ifndef __UTIL_VIRTKEY_H__
+#define __UTIL_VIRTKEY_H__
+
+/*
+ * Copyright (c) 2011 Lai Jiangshan
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+#include <libvirt/libvirt.h>
+
+const char *virKeycodeSetName(virKeycodeSet codeset);
+virKeycodeSet virParseKeycodeSet(const char *name);
+int virParseKeyName(virKeycodeSet codeset, const char *keyname);
+int virTranslateKeyCode(virKeycodeSet from_codeset,
+                        virKeycodeSet to_offset,
+                        int key_value);
+
+#endif
diff --git a/tools/virsh.c b/tools/virsh.c
index fcd254d..a1e2f83 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -58,6 +58,7 @@
 #include "threads.h"
 #include "command.h"
 #include "count-one-bits.h"
+#include "virtkey.h"
 
 static char *progname;
 
-- 
1.7.4.4




More information about the libvir-list mailing list