From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.24) id 1AkiCI-0001I5-F4 for qemu-devel@nongnu.org; Sun, 25 Jan 2004 06:12:58 -0500 Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.24) id 1AkiBl-0000r1-7z for qemu-devel@nongnu.org; Sun, 25 Jan 2004 06:12:57 -0500 Received: from [195.149.39.210] (helo=ixion.tartarus.org) by monty-python.gnu.org with esmtp (Exim 4.24) id 1AkiBk-0000oi-JL for qemu-devel@nongnu.org; Sun, 25 Jan 2004 06:12:24 -0500 Received: from chris by ixion.tartarus.org with local (Exim 3.35 #1 (Debian)) for qemu-devel@nongnu.org id 1AkiBj-0001eK-00; Sun, 25 Jan 2004 11:12:23 +0000 Date: Sun, 25 Jan 2004 11:12:23 +0000 From: Chris Emerson Message-ID: <20040125111222.GA29143@ixion.tartarus.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="JYK4vJDZwFMowpUq" Content-Disposition: inline Subject: [Qemu-devel] [PATCH] Keyboard portability Reply-To: qemu-devel@nongnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org --JYK4vJDZwFMowpUq Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Here's a patch which makes the keyboard usable for me on Debian/PPC. The translation to PC keycodes is done from the SDL keysym rather than the original scancode. It's likely that there could be problems with different keyboard layouts, but I think it should work on the whole. Not tested on anything but my PowerMac with USB keyboard. Chris --JYK4vJDZwFMowpUq Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="sdl-kbd.diff" Index: sdl.c =================================================================== RCS file: /cvsroot/qemu/qemu/sdl.c,v retrieving revision 1.3 diff -u -r1.3 sdl.c --- sdl.c 4 Jan 2004 18:15:01 -0000 1.3 +++ sdl.c 25 Jan 2004 11:03:55 -0000 @@ -137,21 +137,122 @@ 0x53, /* 157 KP_Del */ }; +static const uint32_t sdl_sym_to_pc_keycode[SDLK_LAST] = { + [SDLK_ESCAPE] = 0x01, + [SDLK_F1] = 0x3b, + [SDLK_F2] = 0x3c, + [SDLK_F3] = 0x3d, + [SDLK_F4] = 0x3e, + [SDLK_F5] = 0x3f, + [SDLK_F6] = 0x40, + [SDLK_F7] = 0x41, + [SDLK_F8] = 0x42, + [SDLK_F9] = 0x43, + [SDLK_F10] = 0x44, + [SDLK_F11] = 0x57, + [SDLK_F12] = 0x58, + [SDLK_PRINT] = 0x37e0, + [SDLK_SCROLLOCK] = 0x46, + [SDLK_PAUSE] = 0x451de1, + [SDLK_BACKQUOTE] = 0x29, + [SDLK_1] = 0x02, + [SDLK_2] = 0x03, + [SDLK_3] = 0x04, + [SDLK_4] = 0x05, + [SDLK_5] = 0x06, + [SDLK_6] = 0x07, + [SDLK_7] = 0x08, + [SDLK_8] = 0x09, + [SDLK_9] = 0x0a, + [SDLK_0] = 0x0b, + [SDLK_MINUS] = 0x0c, + [SDLK_EQUALS] = 0x0d, + [SDLK_BACKSPACE] = 0x0e, + [SDLK_TAB] = 0x0f, + [SDLK_q] = 0x10, + [SDLK_w] = 0x11, + [SDLK_e] = 0x12, + [SDLK_r] = 0x13, + [SDLK_t] = 0x14, + [SDLK_y] = 0x15, + [SDLK_u] = 0x16, + [SDLK_i] = 0x17, + [SDLK_o] = 0x18, + [SDLK_p] = 0x19, + [SDLK_LEFTBRACKET] =0x1a, + [SDLK_RIGHTBRACKET]=0x1b, + [SDLK_RETURN] = 0x1c, + [SDLK_CAPSLOCK] = 0x3a, + [SDLK_a] = 0x1e, + [SDLK_s] = 0x1f, + [SDLK_d] = 0x20, + [SDLK_f] = 0x21, + [SDLK_g] = 0x22, + [SDLK_h] = 0x23, + [SDLK_j] = 0x24, + [SDLK_k] = 0x25, + [SDLK_l] = 0x26, + [SDLK_SEMICOLON] = 0x27, + [SDLK_QUOTE] = 0x28, + [SDLK_HASH] = 0x2b, + [SDLK_LSHIFT] = 0x2a, + [SDLK_BACKSLASH] = 0x56, + [SDLK_z] = 0x2c, + [SDLK_x] = 0x2d, + [SDLK_c] = 0x2e, + [SDLK_v] = 0x2f, + [SDLK_b] = 0x30, + [SDLK_n] = 0x31, + [SDLK_m] = 0x32, + [SDLK_COMMA] = 0x33, + [SDLK_PERIOD] = 0x34, + [SDLK_SLASH] = 0x35, + [SDLK_RSHIFT] = 0x36, + [SDLK_LCTRL] = 0x1d, + [SDLK_LALT] = 0x38, + [SDLK_SPACE] = 0x39, + [SDLK_RALT] = 0x38e0, + [SDLK_RCTRL] = 0x1de0, + [SDLK_INSERT] = 0x52e0, + [SDLK_HOME] = 0x47e0, + [SDLK_PAGEUP] = 0x49e0, + [SDLK_DELETE] = 0x53e0, + [SDLK_END] = 0x4fe0, + [SDLK_HOME] = 0x51e0, + [SDLK_UP] = 0x48e0, + [SDLK_LEFT] = 0x4be0, + [SDLK_DOWN] = 0x50e0, + [SDLK_RIGHT] = 0x4de0, + [SDLK_NUMLOCK] = 0x45, + [SDLK_KP_DIVIDE] = 0x35e0, + [SDLK_KP_MULTIPLY] =0x37, + [SDLK_KP_MINUS] = 0x4a, + [SDLK_KP7] = 0x47, + [SDLK_KP8] = 0x48, + [SDLK_KP9] = 0x49, + [SDLK_KP_PLUS] = 0x4e, + [SDLK_KP4] = 0x4b, + [SDLK_KP5] = 0x4c, + [SDLK_KP6] = 0x4d, + [SDLK_KP1] = 0x4f, + [SDLK_KP2] = 0x50, + [SDLK_KP3] = 0x51, + [SDLK_KP_ENTER] = 0x1ce0, + [SDLK_KP0] = 0x52, + [SDLK_KP_PERIOD] = 0x52, +}; + static void sdl_process_key(SDL_KeyboardEvent *ev) { int keycode, v; + SDLKey sym; - /* XXX: not portable, but avoids complicated mappings */ - keycode = ev->keysym.scancode; - if (keycode < 9) { - keycode = 0; - } else if (keycode < 97) { - keycode -= 8; /* just an offset */ - } else if (keycode < 158) { - /* use conversion table */ - keycode = x_keycode_to_pc_keycode[keycode - 97]; + sym = ev->keysym.sym; + + if ((sym > SDLK_LAST) || (sym < 0)) { + keycode = 0; } else { - keycode = 0; + keycode = sdl_sym_to_pc_keycode[sym]; } /* now send the key code */ --JYK4vJDZwFMowpUq--