tags 515585 + patch

I tested the patch on kvm_83 from experimental. Attached is a patch which make 
kvm work with evdev
diff -Naur kvm-83+dfsg.orig/debian/patches/95_evdev_keycode_map.patch kvm-83+dfsg/debian/patches/95_evdev_keycode_map.patch
--- kvm-83+dfsg.orig/debian/patches/95_evdev_keycode_map.patch	1970-01-01 01:00:00.000000000 +0100
+++ kvm-83+dfsg/debian/patches/95_evdev_keycode_map.patch	2009-02-16 13:21:07.000000000 +0100
@@ -0,0 +1,219 @@
+# This code was ported from gtk-vnc, to handle evdev keycode mapping by
+# Dustin Kirkland <[email protected]>, 24 September 2008.
+
+
+--- a/qemu/configure	2008-07-27 08:20:10.000000000 -0500
++++ b/qemu/configure	2008-09-24 16:04:28.036791147 -0500
+@@ -1439,9 +1439,9 @@ if test "$sdl1" = "yes" ; then
+   echo "#define CONFIG_SDL 1" >> $config_h
+   echo "CONFIG_SDL=yes" >> $config_mak
+   if test "$target_softmmu" = "no" -o "$static" = "yes"; then
+-    echo "SDL_LIBS=$sdl_static_libs" >> $config_mak
++    echo "SDL_LIBS=-lX11 $sdl_static_libs" >> $config_mak
+   else
+-    echo "SDL_LIBS=`$sdl_config --libs`" >> $config_mak
++    echo "SDL_LIBS=-lX11 `$sdl_config --libs`" >> $config_mak
+   fi
+   if [ "${aa}" = "yes" ] ; then
+     echo "SDL_CFLAGS=`$sdl_config --cflags` `aalib-config --cflags`" >> $config_mak
+--- a/qemu/sdl.c	2008-07-27 05:08:56.000000000 -0500
++++ b/qemu/sdl.c	2008-09-24 16:39:19.713788782 -0500
+@@ -132,21 +132,7 @@ static uint8_t sdl_keyevent_to_keycode(c
+ 
+ static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev)
+ {
+-    int keycode;
+-
+-    keycode = ev->keysym.scancode;
+-
+-    if (keycode < 9) {
+-        keycode = 0;
+-    } else if (keycode < 97) {
+-        keycode -= 8; /* just an offset */
+-    } else if (keycode < 212) {
+-        /* use conversion table */
+-        keycode = _translate_keycode(keycode - 97);
+-    } else {
+-        keycode = 0;
+-    }
+-    return keycode;
++    return _translate_keycode(ev->keysym.scancode);
+ }
+ 
+ #endif
+--- a/qemu/x_keymap.c	2008-07-27 05:08:56.000000000 -0500
++++ b/qemu/x_keymap.c	2008-09-24 16:52:27.262129702 -0500
+@@ -24,7 +24,15 @@
+ #include "qemu-common.h"
+ #include "console.h"
+ 
+-static const uint8_t x_keycode_to_pc_keycode[115] = {
++#include <SDL/SDL_syswm.h>
++#include <X11/XKBlib.h>
++#include <stdbool.h>
++#include <string.h>
++
++#define TRUE 1
++#define FALSE 0
++
++static const uint8_t x_keycode_to_pc_keycode[61] = {
+    0xc7,      /*  97  Home   */
+    0xc8,      /*  98  Up     */
+    0xc9,      /*  99  PgUp   */
+@@ -86,27 +94,136 @@ static const uint8_t x_keycode_to_pc_key
+    0x51,         /* 155 KP_PgDn */
+    0x52,         /* 156 KP_Ins */
+    0x53,         /* 157 KP_Del */
+-   0x0,         /* 158 */
+-   0x0,         /* 159 */
+-   0x0,         /* 160 */
+-   0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,         /* 170 */
+-   0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,         /* 180 */
+-   0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,         /* 190 */
+-   0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,         /* 200 */
+-   0x0,         /* 201 */
+-   0x0,         /* 202 */
+-   0x0,         /* 203 */
+-   0x0,         /* 204 */
+-   0x0,         /* 205 */
+-   0x0,         /* 206 */
+-   0x0,         /* 207 */
+-   0x70,         /* 208 Hiragana_Katakana */
+-   0x0,         /* 209 */
+-   0x0,         /* 210 */
+-   0x73,         /* 211 backslash */
+ };
+ 
+-uint8_t _translate_keycode(const int key)
++/* This code was ported from gtk-vnc, to handle evdev keycode mapping by
++ * Dustin Kirkland <[email protected]>, 24 September 2008.
++ *
++ * This table was put together by VirtualBox.  It's based on the information in
++ * /usr/share/X11/xkb/keycodes/evdev using the x_keycode_to_pc_keycode table
++ * to get the pc keycodes.
++ */
++
++static const uint8_t evdev_keycode_to_pc_keycode[61] = {
++   0x0,         /*  97 EVDEV - RO   ("Internet" Keyboards) */
++   0x0,         /*  98 EVDEV - KATA (Katakana) */
++   0x0,         /*  99 EVDEV - HIRA (Hiragana) */
++   0x79,        /* 100 EVDEV - HENK (Henkan) */
++   0x70,        /* 101 EVDEV - HKTG (Hiragana/Katakana toggle) */
++   0x7b,        /* 102 EVDEV - MUHE (Muhenkan) */
++   0x0,         /* 103 EVDEV - JPCM (KPJPComma) */
++   0x9c,        /* 104 EVDEV - KPEN */
++   0x9d,        /* 105 EVDEV - RCTL */
++   0xb5,        /* 106 EVDEV - KPDV */
++   0xb7,        /* 107 EVDEV - PRSC ***FIXME*** */
++   0xb8,        /* 108 EVDEV - RALT */
++   0x0,         /* 109 EVDEV - LNFD ("Internet" Keyboards) */
++   0xc7,        /* 110 EVDEV - HOME ***FIXME*** */
++   0xc8,        /* 111 EVDEV - UP   */
++   0xc9,        /* 112 EVDEV - PGUP */
++   0xcb,        /* 113 EVDEV - LEFT */
++   0xcd,        /* 114 EVDEV - RGHT */
++   0xcf,        /* 115 EVDEV - END  */
++   0xd0,        /* 116 EVDEV - DOWN */
++   0xd1,        /* 117 EVDEV - PGDN */
++   0xd2,        /* 118 EVDEV - INS  */
++   0xd3,        /* 119 EVDEV - DELE */
++   0x0,         /* 120 EVDEV - I120 ("Internet" Keyboards) */
++   0x0,         /* 121 EVDEV - MUTE */
++   0x0,         /* 122 EVDEV - VOL- */
++   0x0,         /* 123 EVDEV - VOL+ */
++   0x0,         /* 124 EVDEV - POWR */
++   0x0,         /* 125 EVDEV - KPEQ */
++   0x0,         /* 126 EVDEV - I126 ("Internet" Keyboards) */
++   0x0,         /* 127 EVDEV - PAUS */
++   0x0,         /* 128 EVDEV - ???? */
++   0x0,         /* 129 EVDEV - I129 ("Internet" Keyboards) */
++   0xf1,        /* 130 EVDEV - HNGL (Korean Hangul Latin toggle) */
++   0xf2,        /* 131 EVDEV - HJCV (Korean Hangul Hanja toggle) */
++   0x7d,        /* 132 EVDEV - AE13 (Yen) */
++   0xdb,        /* 133 EVDEV - LWIN */
++   0xdc,        /* 134 EVDEV - RWIN */
++   0xdd,        /* 135 EVDEV - MENU */
++   0x0,         /* 136 EVDEV - STOP */
++   0x0,         /* 137 EVDEV - AGAI */
++   0x0,         /* 138 EVDEV - PROP */
++   0x0,         /* 139 EVDEV - UNDO */
++   0x0,         /* 140 EVDEV - FRNT */
++   0x0,         /* 141 EVDEV - COPY */
++   0x0,         /* 142 EVDEV - OPEN */
++   0x0,         /* 143 EVDEV - PAST */
++   0x0,         /* 144 EVDEV - FIND */
++   0x0,         /* 145 EVDEV - CUT  */
++   0x0,         /* 146 EVDEV - HELP */
++   0x0,         /* 147 EVDEV - I147 */
++   0x0,         /* 148 EVDEV - I148 */
++   0x0,         /* 149 EVDEV - I149 */
++   0x0,         /* 150 EVDEV - I150 */
++   0x0,         /* 151 EVDEV - I151 */
++   0x0,         /* 152 EVDEV - I152 */
++   0x0,         /* 153 EVDEV - I153 */
++   0x0,         /* 154 EVDEV - I154 */
++   0x0,         /* 155 EVDEV - I156 */
++   0x0,         /* 156 EVDEV - I157 */
++   0x0,         /* 157 EVDEV - I158 */
++};
++
++static bool strstarts(const char *lhs, const char *rhs)
++{
++    if (strlen(lhs) < strlen(rhs))
++        return false;
++    return memcmp(lhs, rhs, strlen(rhs)) == 0;
++}
++
++static bool check_for_evdev(void)
++{
++    SDL_SysWMinfo info;
++    XkbDescPtr desc = NULL;
++    bool has_evdev = FALSE;
++    const char *keycodes;
++
++    SDL_VERSION(&info.version);
++    if (!SDL_GetWMInfo(&info))
++        goto out;
++
++    desc = XkbGetKeyboard (info.info.x11.display,
++                XkbAllComponentsMask,
++                XkbUseCoreKbd);
++    if (!desc)
++        goto out;
++
++    keycodes = XGetAtomName(info.info.x11.display, desc->names->keycodes);
++    if (keycodes == NULL)
++        fprintf(stderr, "qemu: warning: could not lookup keycode name\n");
++    else if (strstarts(keycodes, "evdev_"))
++        has_evdev = TRUE;
++    else if (!strstarts(keycodes, "xfree86_"))
++        fprintf(stderr, "qemu: warning: unknown keycodes `%s'\n", keycodes);
++
++    XkbFreeClientMap(desc, XkbGBN_AllComponentsMask, True);
++
++out:
++    return has_evdev;
++}
++
++
++uint8_t _translate_keycode(int keycode)
+ {
+-	return x_keycode_to_pc_keycode[key];
++    if (keycode < 9)
++        keycode = 0;
++    else if (keycode < 97)
++        keycode -= 8; /* just an offset */
++    else if (keycode < 158) {
++        if (check_for_evdev())
++            keycode = evdev_keycode_to_pc_keycode[keycode - 97];
++        else
++            keycode = x_keycode_to_pc_keycode[keycode - 97];
++    } else if (keycode == 208) /* Hiragana_Katakana */
++        keycode = 0x70;
++    else if (keycode == 211) /* backslash */
++        keycode = 0x73;
++    else
++        keycode = 0;
++
++    return keycode;
+ }
diff -Naur kvm-83+dfsg.orig/debian/patches/series kvm-83+dfsg/debian/patches/series
--- kvm-83+dfsg.orig/debian/patches/series	2009-02-16 13:37:07.000000000 +0100
+++ kvm-83+dfsg/debian/patches/series	2009-02-16 13:40:01.000000000 +0100
@@ -12,3 +12,4 @@
 ignore_missing_bios.patch
 altgr-dead-keys-vnc.diff
 qemu-ifup_head.patch
+95_evdev_keycode_map.patch

Reply via email to