[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [PVFB] Support keymap localisation.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1169483160 0
# Node ID b1c03f19a4ef68ff4858e899578caad39ff669ac
# Parent  a02622437e07739ff28420653c8196b05863a6a2
[PVFB] Support keymap localisation.

Conversion to the scan code uses QEMU's function.
Moreover, keyboard support for PVFB uses QEMU's keymaps.
Keyboard default layout is en-us.

Signed-off-by: Junko Ichino <ichino.junko@xxxxxxxxxxxxxx>
Signed-off-by: Takanori Kasai <kasai.takanori@xxxxxxxxxxxxxx>
Signed-off-by: Hirofumi Tsujimura <tsujimura.hirof@xxxxxxxxxxxxxx>
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
---
 tools/xenfb/Makefile |    2 
 tools/xenfb/vncfb.c  |  223 ++++++++++++++++++---------------------------------
 2 files changed, 80 insertions(+), 145 deletions(-)

diff -r a02622437e07 -r b1c03f19a4ef tools/xenfb/Makefile
--- a/tools/xenfb/Makefile      Mon Jan 22 15:59:41 2007 +0000
+++ b/tools/xenfb/Makefile      Mon Jan 22 16:26:00 2007 +0000
@@ -1,7 +1,7 @@ XEN_ROOT=../..
 XEN_ROOT=../..
 include $(XEN_ROOT)/tools/Rules.mk
 
-CFLAGS += -I$(XEN_LIBXC) -I$(XEN_XENSTORE) 
-I$(XEN_ROOT)/linux-2.6-xen-sparse/include
+CFLAGS += -I$(XEN_LIBXC) -I$(XEN_XENSTORE) 
-I$(XEN_ROOT)/linux-2.6-xen-sparse/include -I$(XEN_ROOT)/tools/ioemu
 LDFLAGS += -L$(XEN_LIBXC) -L$(XEN_XENSTORE)
 
 INSTALL         = install
diff -r a02622437e07 -r b1c03f19a4ef tools/xenfb/vncfb.c
--- a/tools/xenfb/vncfb.c       Mon Jan 22 15:59:41 2007 +0000
+++ b/tools/xenfb/vncfb.c       Mon Jan 22 16:26:00 2007 +0000
@@ -11,142 +11,50 @@
 #include <xs.h>
 #include "xenfb.h"
 
-static int xk2linux[0x10000] = {
-       [XK_a] = KEY_A,
-       [XK_b] = KEY_B,
-       [XK_c] = KEY_C,
-       [XK_d] = KEY_D,
-       [XK_e] = KEY_E,
-       [XK_f] = KEY_F,
-       [XK_g] = KEY_G,
-       [XK_h] = KEY_H,
-       [XK_i] = KEY_I,
-       [XK_j] = KEY_J,
-       [XK_k] = KEY_K,
-       [XK_l] = KEY_L,
-       [XK_m] = KEY_M,
-       [XK_n] = KEY_N,
-       [XK_o] = KEY_O,
-       [XK_p] = KEY_P,
-       [XK_q] = KEY_Q,
-       [XK_r] = KEY_R,
-       [XK_s] = KEY_S,
-       [XK_t] = KEY_T,
-       [XK_u] = KEY_U,
-       [XK_v] = KEY_V,
-       [XK_w] = KEY_W,
-       [XK_x] = KEY_X,
-       [XK_y] = KEY_Y,
-       [XK_z] = KEY_Z,
-       [XK_A] = KEY_A,
-       [XK_B] = KEY_B,
-       [XK_C] = KEY_C,
-       [XK_D] = KEY_D,
-       [XK_E] = KEY_E,
-       [XK_F] = KEY_F,
-       [XK_G] = KEY_G,
-       [XK_H] = KEY_H,
-       [XK_I] = KEY_I,
-       [XK_J] = KEY_J,
-       [XK_K] = KEY_K,
-       [XK_L] = KEY_L,
-       [XK_M] = KEY_M,
-       [XK_N] = KEY_N,
-       [XK_O] = KEY_O,
-       [XK_P] = KEY_P,
-       [XK_Q] = KEY_Q,
-       [XK_R] = KEY_R,
-       [XK_S] = KEY_S,
-       [XK_T] = KEY_T,
-       [XK_U] = KEY_U,
-       [XK_V] = KEY_V,
-       [XK_W] = KEY_W,
-       [XK_X] = KEY_X,
-       [XK_Y] = KEY_Y,
-       [XK_Z] = KEY_Z,
-       [XK_0] = KEY_0,
-       [XK_1] = KEY_1,
-       [XK_2] = KEY_2,
-       [XK_3] = KEY_3,
-       [XK_4] = KEY_4,
-       [XK_5] = KEY_5,
-       [XK_6] = KEY_6,
-       [XK_7] = KEY_7,
-       [XK_8] = KEY_8,
-       [XK_9] = KEY_9,
-       [XK_Return] = KEY_ENTER,
-       [XK_BackSpace] = KEY_BACKSPACE,
-       [XK_Tab] = KEY_TAB,
-       [XK_Pause] = KEY_PAUSE,
-       [XK_Delete] = KEY_DELETE,
-       [XK_slash] = KEY_SLASH,
-       [XK_minus] = KEY_MINUS,
-       [XK_equal] = KEY_EQUAL,
-       [XK_Escape] = KEY_ESC,
-       [XK_braceleft] = KEY_LEFTBRACE,
-       [XK_braceright] = KEY_RIGHTBRACE,
-       [XK_bracketleft] = KEY_LEFTMETA,
-       [XK_bracketright] = KEY_RIGHTMETA,
-       [XK_Control_L] = KEY_LEFTCTRL,
-       [XK_Control_R] = KEY_RIGHTCTRL,
-       [XK_Shift_L] = KEY_LEFTSHIFT,
-       [XK_Shift_R] = KEY_RIGHTSHIFT,
-       [XK_Alt_L] = KEY_LEFTALT,
-       [XK_Alt_R] = KEY_RIGHTALT,
-       [XK_semicolon] = KEY_SEMICOLON, 
-       [XK_apostrophe] = KEY_APOSTROPHE,
-       [XK_grave] = KEY_GRAVE,
-       [XK_backslash] = KEY_BACKSLASH,
-       [XK_comma] = KEY_COMMA,
-       [XK_period] = KEY_DOT,
-       [XK_space] = KEY_SPACE,
-       [XK_Caps_Lock] = KEY_CAPSLOCK,
-       [XK_Num_Lock] = KEY_NUMLOCK,
-       [XK_Scroll_Lock] = KEY_SCROLLLOCK,
-       [XK_Sys_Req] = KEY_SYSRQ,
-       [XK_Linefeed] = KEY_LINEFEED,
-       [XK_Home] = KEY_HOME,
-       [XK_Pause] = KEY_PAUSE,
-       [XK_F1] = KEY_F1,
-       [XK_F2] = KEY_F2,
-       [XK_F3] = KEY_F3,
-       [XK_F4] = KEY_F4,
-       [XK_F5] = KEY_F5,
-       [XK_F6] = KEY_F6,
-       [XK_F7] = KEY_F7,
-       [XK_F8] = KEY_F8,
-       [XK_F9] = KEY_F9,
-       [XK_F10] = KEY_F10,
-       [XK_F11] = KEY_F11,
-       [XK_F12] = KEY_F12,
-       [XK_Up] = KEY_UP,
-       [XK_Page_Up] = KEY_PAGEUP,
-       [XK_Left] = KEY_LEFT,
-       [XK_Right] = KEY_RIGHT,
-       [XK_End] = KEY_END,
-       [XK_Down] = KEY_DOWN,
-       [XK_Page_Down] = KEY_PAGEDOWN,
-       [XK_Insert] = KEY_INSERT, 
-       [XK_colon] = KEY_SEMICOLON,
-       [XK_quotedbl] = KEY_APOSTROPHE,
-       [XK_less] = KEY_COMMA,
-       [XK_greater] = KEY_DOT,
-       [XK_question] = KEY_SLASH,
-       [XK_bar] = KEY_BACKSLASH,
-       [XK_asciitilde] = KEY_GRAVE,
-       [XK_exclam] = KEY_1,
-       [XK_at] = KEY_2,
-       [XK_numbersign] = KEY_3,
-       [XK_dollar] = KEY_4,
-       [XK_percent] = KEY_5,
-       [XK_asciicircum] = KEY_6,
-       [XK_ampersand] = KEY_7,
-       [XK_asterisk] = KEY_8,
-       [XK_parenleft] = KEY_9,
-       [XK_parenright] = KEY_0,
-       [XK_underscore] = KEY_MINUS,
-       [XK_plus] = KEY_EQUAL,
+/* Grab key translation support routines from qemu directory. */
+#define qemu_mallocz(size) calloc(1, (size))
+static const char *bios_dir = "/usr/share/xen/qemu";
+#include "vnc_keysym.h"
+#include "keymaps.c"
+
+static unsigned char atkbd_set2_keycode[512] = {
+
+         0, 67, 65, 63, 61, 59, 60, 88,  0, 68, 66, 64, 62, 15, 41,117,
+         0, 56, 42, 93, 29, 16,  2,  0,  0,  0, 44, 31, 30, 17,  3,  0,
+         0, 46, 45, 32, 18,  5,  4, 95,  0, 57, 47, 33, 20, 19,  6,183,
+         0, 49, 48, 35, 34, 21,  7,184,  0,  0, 50, 36, 22,  8,  9,185,
+         0, 51, 37, 23, 24, 11, 10,  0,  0, 52, 53, 38, 39, 25, 12,  0,
+         0, 89, 40,  0, 26, 13,  0,  0, 58, 54, 28, 27,  0, 43,  0, 85,
+         0, 86, 91, 90, 92,  0, 14, 94,  0, 79,124, 75, 71,121,  0,  0,
+        82, 83, 80, 76, 77, 72,  1, 69, 87, 78, 81, 74, 55, 73, 70, 99,
+
+         0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+       217,100,255,  0, 97,165,  0,  0,156,  0,  0,  0,  0,  0,  0,125,
+       173,114,  0,113,  0,  0,  0,126,128,  0,  0,140,  0,  0,  0,127,
+       159,  0,115,  0,164,  0,  0,116,158,  0,150,166,  0,  0,  0,142,
+       157,  0,  0,  0,  0,  0,  0,  0,155,  0, 98,  0,  0,163,  0,  0,
+       226,  0,  0,  0,  0,  0,  0,  0,  0,255, 96,  0,  0,  0,143,  0,
+         0,  0,  0,  0,  0,  0,  0,  0,  0,107,  0,105,102,  0,  0,112,
+       110,111,108,112,106,103,  0,119,  0,118,109,  0, 99,104,119,  0,
+
 };
+
+static unsigned char atkbd_unxlate_table[128] = {
+
+         0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
+        21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
+        35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
+        50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88,  5,  6,  4, 12,  3,
+        11,  2, 10,  1,  9,119,126,108,117,125,123,107,115,116,121,105,
+       114,122,112,113,127, 96, 97,120,  7, 15, 23, 31, 39, 47, 55, 63,
+        71, 79, 86, 94,  8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
+        19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
+
+};
+
+unsigned char keycode_table[512];
+
+static void *kbd_layout;
 
 static int btnmap[] = {
        BTN_LEFT, BTN_MIDDLE, BTN_RIGHT, BTN_FORWARD, BTN_BACK
@@ -165,13 +73,16 @@ static void on_kbd_event(rfbBool down, r
         */
        rfbScreenInfoPtr server = cl->screen;
        struct xenfb *xenfb = server->screenData;
-       if (keycode >= sizeof(xk2linux) / sizeof(*xk2linux))
+
+       if( keycode >= 'A' && keycode <= 'Z' )
+               keycode += 'a' - 'A';
+
+       int scancode = keycode_table[keysym2scancode(kbd_layout, keycode)];
+       if (scancode == 0)
                return;
-       if (xk2linux[keycode] == 0)
-               return;
-       if (xenfb_send_key(xenfb, down, xk2linux[keycode]) < 0)
+       if (xenfb_send_key(xenfb, down, scancode) < 0)
                fprintf(stderr, "Key %d %s lost (%s)\n",
-                       xk2linux[keycode], down ? "down" : "up",
+                       scancode, down ? "down" : "up",
                        strerror(errno));
 }
 
@@ -305,6 +216,7 @@ static struct option options[] = {
        { "title", 1, NULL, 't' },
        { "unused", 0, NULL, 'u' },
        { "listen", 1, NULL, 'l' },
+       { "keymap", 1, NULL, 'k' },
        { NULL }
 };
 
@@ -318,6 +230,7 @@ int main(int argc, char **argv)
        int domid = -1, port = -1;
        char *title = NULL;
        char *listen = NULL;
+       char *keymap = NULL;
        bool unused = false;
        int opt;
        struct xenfb *xenfb;
@@ -328,10 +241,11 @@ int main(int argc, char **argv)
        int r;
        struct xs_handle *xsh;
        char vncpasswd[1024];
+       int i;
 
        vncpasswd[0] = '\0';
 
-       while ((opt = getopt_long(argc, argv, "d:p:t:u", options,
+       while ((opt = getopt_long(argc, argv, "d:p:t:uk:", options,
                                  NULL)) != -1) {
                switch (opt) {
                 case 'd':
@@ -359,6 +273,9 @@ int main(int argc, char **argv)
                 case 'l':
                        listen = strdup(optarg);
                        break;
+                case 'k':
+                       keymap = strdup(optarg);
+                       break;
                case '?':
                        exit(1);
                 }
@@ -378,7 +295,23 @@ int main(int argc, char **argv)
                fprintf(stderr, "Invalid port specified\n");
                exit(1);
         }
-            
+
+       if (keymap == NULL){
+               keymap = "en-us";
+       }
+
+       kbd_layout = init_keyboard_layout(keymap);
+       if( !kbd_layout ){
+               fprintf(stderr, "Invalid keyboard_layout\n");
+               exit(1);
+        }
+
+       for (i = 0; i < 128; i++) {
+               keycode_table[i] = atkbd_set2_keycode[atkbd_unxlate_table[i]];
+               keycode_table[i | 0x80] = 
+                       atkbd_set2_keycode[atkbd_unxlate_table[i] | 0x80];
+       }
+
        fake_argv[2] = portstr;
 
         if (title != NULL)
@@ -409,7 +342,8 @@ int main(int argc, char **argv)
        }
 
 
-       if (xenstore_read_vncpasswd(xsh, domid, vncpasswd, 
sizeof(vncpasswd)/sizeof(char)) < 0) {
+       if (xenstore_read_vncpasswd(xsh, domid, vncpasswd,
+                                   sizeof(vncpasswd)/sizeof(char)) < 0) {
                fprintf(stderr, "cannot read VNC password from xenstore\n");
                exit(1);
        }
@@ -432,7 +366,8 @@ int main(int argc, char **argv)
        if (vncpasswd[0]) {
                char **passwds = malloc(sizeof(char**)*2);
                if (!passwds) {
-                       fprintf(stderr, "cannot allocate memory (%s)\n", 
strerror(errno));
+                       fprintf(stderr, "cannot allocate memory (%s)\n",
+                               strerror(errno));
                        exit(1);
                }
                fprintf(stderr, "Registered password\n");

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.