diff options
Diffstat (limited to 'sdl.c')
-rw-r--r-- | sdl.c | 146 |
1 files changed, 32 insertions, 114 deletions
@@ -29,10 +29,6 @@ #include <signal.h> #endif -#if defined(__APPLE__) -#define CONFIG_SDL_GENERIC_KBD -#endif - static SDL_Surface *screen; static int gui_grab; /* if true, all keyboard/mouse events are grabbed */ static int last_vm_running; @@ -72,118 +68,26 @@ static void sdl_resize(DisplayState *ds, int w, int h) ds->height = h; } -#ifdef CONFIG_SDL_GENERIC_KBD - -/* XXX: use keymap tables defined in the VNC patch because the - following code suppose you have a US keyboard. */ - -static const uint8_t scancodes[SDLK_LAST] = { - [SDLK_ESCAPE] = 0x01, - [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_LCTRL] = 0x1d, - [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_BACKQUOTE] = 0x29, - [SDLK_LSHIFT] = 0x2a, - [SDLK_BACKSLASH] = 0x2b, - [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_KP_MULTIPLY] = 0x37, - [SDLK_LALT] = 0x38, - [SDLK_SPACE] = 0x39, - [SDLK_CAPSLOCK] = 0x3a, - [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_NUMLOCK] = 0x45, - [SDLK_SCROLLOCK] = 0x46, - [SDLK_KP7] = 0x47, - [SDLK_KP8] = 0x48, - [SDLK_KP9] = 0x49, - [SDLK_KP_MINUS] = 0x4a, - [SDLK_KP4] = 0x4b, - [SDLK_KP5] = 0x4c, - [SDLK_KP6] = 0x4d, - [SDLK_KP_PLUS] = 0x4e, - [SDLK_KP1] = 0x4f, - [SDLK_KP2] = 0x50, - [SDLK_KP3] = 0x51, - [SDLK_KP0] = 0x52, - [SDLK_KP_PERIOD] = 0x53, - [SDLK_PRINT] = 0x54, - [SDLK_LMETA] = 0x56, - - [SDLK_KP_ENTER] = 0x9c, - [SDLK_KP_DIVIDE] = 0xb5, - - [SDLK_UP] = 0xc8, - [SDLK_DOWN] = 0xd0, - [SDLK_RIGHT] = 0xcd, - [SDLK_LEFT] = 0xcb, - [SDLK_INSERT] = 0xd2, - [SDLK_HOME] = 0xc7, - [SDLK_END] = 0xcf, - [SDLK_PAGEUP] = 0xc9, - [SDLK_PAGEDOWN] = 0xd1, - [SDLK_DELETE] = 0xd3, -}; +/* generic keyboard conversion */ -static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) +#include "sdl_keysym.h" +#include "keymaps.c" + +static kbd_layout_t *kbd_layout = NULL; + +static uint8_t sdl_keyevent_to_keycode_generic(const SDL_KeyboardEvent *ev) { - return scancodes[ev->keysym.sym]; + int keysym; + /* workaround for X11+SDL bug with AltGR */ + keysym = ev->keysym.sym; + if (keysym == 0 && ev->keysym.scancode == 113) + keysym = SDLK_MODE; + return keysym2scancode(kbd_layout, keysym); } -#elif defined(_WIN32) +/* specific keyboard conversions from scan codes */ + +#if defined(_WIN32) static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) { @@ -305,8 +209,11 @@ static void sdl_process_key(SDL_KeyboardEvent *ev) return; } - /* XXX: not portable, but avoids complicated mappings */ - keycode = sdl_keyevent_to_keycode(ev); + if (kbd_layout) { + keycode = sdl_keyevent_to_keycode_generic(ev); + } else { + keycode = sdl_keyevent_to_keycode(ev); + } switch(keycode) { case 0x00: @@ -558,6 +465,17 @@ void sdl_display_init(DisplayState *ds, int full_screen) { int flags; +#if defined(__APPLE__) + /* always use generic keymaps */ + if (!keyboard_layout) + keyboard_layout = "en-us"; +#endif + if(keyboard_layout) { + kbd_layout = init_keyboard_layout(keyboard_layout); + if (!kbd_layout) + exit(1); + } + flags = SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE; if (SDL_Init (flags)) { fprintf(stderr, "Could not initialize SDL - exiting\n"); |