From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LABRc-0000g0-5i for qemu-devel@nongnu.org; Tue, 09 Dec 2008 17:52:44 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LABRb-0000fo-LG for qemu-devel@nongnu.org; Tue, 09 Dec 2008 17:52:43 -0500 Received: from [199.232.76.173] (port=49056 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LABRb-0000fl-IX for qemu-devel@nongnu.org; Tue, 09 Dec 2008 17:52:43 -0500 Received: from [84.20.150.76] (port=43005 helo=narury.org) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LABRa-0001tf-VJ for qemu-devel@nongnu.org; Tue, 09 Dec 2008 17:52:43 -0500 Date: Wed, 10 Dec 2008 00:42:35 +0200 From: Riku Voipio Subject: Re: [Qemu-devel] [PATCH] evdev_keycode_map Message-ID: <20081209224235.GA12529@kos.to> References: MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="X1bOJ3K7DJ5YkBrT" Content-Disposition: inline In-Reply-To: Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Dustin Kirkland Cc: qemu-devel@nongnu.org --X1bOJ3K7DJ5YkBrT Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, Sep 24, 2008 at 06:10:27PM -0500, Dustin Kirkland wrote: > I'm attaching a patch that we have applied to the qemu implementation > inside of the kvm package in Ubuntu. Anyone know why this patch is still lingering? > --- kvm-72+dfsg/qemu/configure 2008-07-27 08:20:10.000000000 -0500 > +++ kvm-72+dfsg/qemu/configure 2008-09-24 16:04:28.036791147 -0500 > @@ -1198,9 +1198,9 @@ if test "$sdl1" =3D "yes" ; then > echo "#define CONFIG_SDL 1" >> $config_h > echo "CONFIG_SDL=3Dyes" >> $config_mak > if test "$target_softmmu" =3D "no" -o "$static" =3D "yes"; then > - echo "SDL_LIBS=3D$sdl_static_libs" >> $config_mak > + echo "SDL_LIBS=3D-lX11 $sdl_static_libs" >> $config_mak > else > - echo "SDL_LIBS=3D`$sdl_config --libs`" >> $config_mak > + echo "SDL_LIBS=3D-lX11 `$sdl_config --libs`" >> $config_mak > fi These changes make the SDL code dependant on X ? This would make compiling windows less trivial.. > if [ "${aa}" =3D "yes" ] ; then > echo "SDL_CFLAGS=3D`$sdl_config --cflags` `aalib-config --cflags`" >= > $config_mak > --- kvm-72+dfsg/qemu/sdl.c 2008-07-27 05:08:56.000000000 -0500 > +++ kvm-72+dfsg/qemu/sdl.c 2008-09-24 16:39:19.713788782 -0500 > @@ -132,21 +132,7 @@ static uint8_t sdl_keyevent_to_keycode(c > =20 > static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) > { > - int keycode; > - > - keycode =3D ev->keysym.scancode; > - > - if (keycode < 9) { > - keycode =3D 0; > - } else if (keycode < 97) { > - keycode -=3D 8; /* just an offset */ > - } else if (keycode < 212) { > - /* use conversion table */ > - keycode =3D _translate_keycode(keycode - 97); > - } else { > - keycode =3D 0; > - } > - return keycode; > + return _translate_keycode(ev->keysym.scancode); > } > =20 > #endif > --- kvm-72+dfsg/qemu/x_keymap.c 2008-07-27 05:08:56.000000000 -0500 > +++ kvm-72+dfsg/qemu/x_keymap.c 2008-09-24 16:52:27.262129702 -0500 > @@ -24,7 +24,15 @@ > #include "qemu-common.h" > #include "console.h" > =20 > -static const uint8_t x_keycode_to_pc_keycode[115] =3D { > +#include > +#include > +#include > +#include > + > +#define TRUE 1 > +#define FALSE 0 > + > +static const uint8_t x_keycode_to_pc_keycode[61] =3D { > 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 */ > }; > =20 > -uint8_t _translate_keycode(const int key) > +/* This code was ported from gtk-vnc, to handle evdev keycode mapping by > + * Dustin Kirkland , 24 September 2008. > + * > + * This table was put together by VirtualBox. It's based on the informa= tion in > + * /usr/share/X11/xkb/keycodes/evdev using the x_keycode_to_pc_keycode t= able > + * to get the pc keycodes. > + */ > + > +static const uint8_t evdev_keycode_to_pc_keycode[61] =3D { > + 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)) =3D=3D 0; > +} > + > +static bool check_for_evdev(void) > +{ > + SDL_SysWMinfo info; > + XkbDescPtr desc =3D NULL; > + bool has_evdev =3D FALSE; > + const char *keycodes; > + > + SDL_VERSION(&info.version); > + if (!SDL_GetWMInfo(&info)) > + goto out; > + > + desc =3D XkbGetKeyboard (info.info.x11.display, > + XkbAllComponentsMask, > + XkbUseCoreKbd); > + if (!desc) > + goto out; > + > + keycodes =3D XGetAtomName(info.info.x11.display, desc->names->keycod= es); > + if (keycodes =3D=3D NULL) > + fprintf(stderr, "qemu: warning: could not lookup keycode name\n"= ); > + else if (strstarts(keycodes, "evdev_")) > + has_evdev =3D TRUE; > + else if (!strstarts(keycodes, "xfree86_")) > + fprintf(stderr, "qemu: warning: unknown keycodes `%s'\n", keycod= es); > + > + 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 =3D 0; > + else if (keycode < 97) > + keycode -=3D 8; /* just an offset */ > + else if (keycode < 158) { > + if (check_for_evdev()) > + keycode =3D evdev_keycode_to_pc_keycode[keycode - 97]; > + else > + keycode =3D x_keycode_to_pc_keycode[keycode - 97]; This is suboptimal, for every keycode translation we have several rountrips to Xserver and back. Consider someone using a remote X server. save the result of check_for_evdev() and use it in subsequent calls. > + } else if (keycode =3D=3D 208) /* Hiragana_Katakana */ > + keycode =3D 0x70; > + else if (keycode =3D=3D 211) /* backslash */ > + keycode =3D 0x73; > + else > + keycode =3D 0; > + > + return keycode; > } --=20 "rm -rf" only sounds scary if you don't have backups --X1bOJ3K7DJ5YkBrT Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQFJPvRbibPvMsrqrwMRAn7WAKCNrQT9YLeuFO9jwhjapRVJ1zh0qQCeJ+dJ ftUkT1LhQJk24m8EsgjArfU= =eBiw -----END PGP SIGNATURE----- --X1bOJ3K7DJ5YkBrT--