Darwin patch

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@982 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
bellard 2004-07-05 22:13:07 +00:00
parent d549f7d98f
commit e58d12ed5b

162
sdl.c
View File

@ -29,6 +29,10 @@
#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;
@ -63,6 +67,126 @@ static void sdl_resize(DisplayState *ds, int w, int h)
ds->depth = screen->format->BitsPerPixel;
}
#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,
};
static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev)
{
return scancodes[ev->keysym.sym];
}
#elif defined(_WIN32)
static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev)
{
return ev->keysym.scancode;
}
#else
static const uint8_t x_keycode_to_pc_keycode[61] = {
0xc7, /* 97 Home */
0xc8, /* 98 Up */
@ -127,6 +251,27 @@ static const uint8_t x_keycode_to_pc_keycode[61] = {
0x53, /* 157 KP_Del */
};
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 < 158) {
/* use conversion table */
keycode = x_keycode_to_pc_keycode[keycode - 97];
} else {
keycode = 0;
}
return keycode;
}
#endif
static void sdl_process_key(SDL_KeyboardEvent *ev)
{
int keycode, v, i;
@ -144,22 +289,7 @@ static void sdl_process_key(SDL_KeyboardEvent *ev)
}
/* XXX: not portable, but avoids complicated mappings */
keycode = ev->keysym.scancode;
/* XXX: windows version may not work: 0xe0/0xe1 should be trapped
? */
#ifndef _WIN32
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];
} else {
keycode = 0;
}
#endif
keycode = sdl_keyevent_to_keycode(ev);
switch(keycode) {
case 0x00: