Commit e58d12ed5b22ca78b46cc4e36392f4e763008eb9
1 parent
d549f7d9
Darwin patch
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@982 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
146 additions
and
16 deletions
sdl.c
| @@ -29,6 +29,10 @@ | @@ -29,6 +29,10 @@ | ||
| 29 | #include <signal.h> | 29 | #include <signal.h> |
| 30 | #endif | 30 | #endif |
| 31 | 31 | ||
| 32 | +#if defined(__APPLE__) | ||
| 33 | +#define CONFIG_SDL_GENERIC_KBD | ||
| 34 | +#endif | ||
| 35 | + | ||
| 32 | static SDL_Surface *screen; | 36 | static SDL_Surface *screen; |
| 33 | static int gui_grab; /* if true, all keyboard/mouse events are grabbed */ | 37 | static int gui_grab; /* if true, all keyboard/mouse events are grabbed */ |
| 34 | static int last_vm_running; | 38 | static int last_vm_running; |
| @@ -63,6 +67,126 @@ static void sdl_resize(DisplayState *ds, int w, int h) | @@ -63,6 +67,126 @@ static void sdl_resize(DisplayState *ds, int w, int h) | ||
| 63 | ds->depth = screen->format->BitsPerPixel; | 67 | ds->depth = screen->format->BitsPerPixel; |
| 64 | } | 68 | } |
| 65 | 69 | ||
| 70 | +#ifdef CONFIG_SDL_GENERIC_KBD | ||
| 71 | + | ||
| 72 | +/* XXX: use keymap tables defined in the VNC patch because the | ||
| 73 | + following code suppose you have a US keyboard. */ | ||
| 74 | + | ||
| 75 | +static const uint8_t scancodes[SDLK_LAST] = { | ||
| 76 | + [SDLK_ESCAPE] = 0x01, | ||
| 77 | + [SDLK_1] = 0x02, | ||
| 78 | + [SDLK_2] = 0x03, | ||
| 79 | + [SDLK_3] = 0x04, | ||
| 80 | + [SDLK_4] = 0x05, | ||
| 81 | + [SDLK_5] = 0x06, | ||
| 82 | + [SDLK_6] = 0x07, | ||
| 83 | + [SDLK_7] = 0x08, | ||
| 84 | + [SDLK_8] = 0x09, | ||
| 85 | + [SDLK_9] = 0x0a, | ||
| 86 | + [SDLK_0] = 0x0b, | ||
| 87 | + [SDLK_MINUS] = 0x0c, | ||
| 88 | + [SDLK_EQUALS] = 0x0d, | ||
| 89 | + [SDLK_BACKSPACE] = 0x0e, | ||
| 90 | + [SDLK_TAB] = 0x0f, | ||
| 91 | + [SDLK_q] = 0x10, | ||
| 92 | + [SDLK_w] = 0x11, | ||
| 93 | + [SDLK_e] = 0x12, | ||
| 94 | + [SDLK_r] = 0x13, | ||
| 95 | + [SDLK_t] = 0x14, | ||
| 96 | + [SDLK_y] = 0x15, | ||
| 97 | + [SDLK_u] = 0x16, | ||
| 98 | + [SDLK_i] = 0x17, | ||
| 99 | + [SDLK_o] = 0x18, | ||
| 100 | + [SDLK_p] = 0x19, | ||
| 101 | + [SDLK_LEFTBRACKET] = 0x1a, | ||
| 102 | + [SDLK_RIGHTBRACKET] = 0x1b, | ||
| 103 | + [SDLK_RETURN] = 0x1c, | ||
| 104 | + [SDLK_LCTRL] = 0x1d, | ||
| 105 | + [SDLK_a] = 0x1e, | ||
| 106 | + [SDLK_s] = 0x1f, | ||
| 107 | + [SDLK_d] = 0x20, | ||
| 108 | + [SDLK_f] = 0x21, | ||
| 109 | + [SDLK_g] = 0x22, | ||
| 110 | + [SDLK_h] = 0x23, | ||
| 111 | + [SDLK_j] = 0x24, | ||
| 112 | + [SDLK_k] = 0x25, | ||
| 113 | + [SDLK_l] = 0x26, | ||
| 114 | + [SDLK_SEMICOLON] = 0x27, | ||
| 115 | + [SDLK_QUOTE] = 0x28, | ||
| 116 | + [SDLK_BACKQUOTE] = 0x29, | ||
| 117 | + [SDLK_LSHIFT] = 0x2a, | ||
| 118 | + [SDLK_BACKSLASH] = 0x2b, | ||
| 119 | + [SDLK_z] = 0x2c, | ||
| 120 | + [SDLK_x] = 0x2d, | ||
| 121 | + [SDLK_c] = 0x2e, | ||
| 122 | + [SDLK_v] = 0x2f, | ||
| 123 | + [SDLK_b] = 0x30, | ||
| 124 | + [SDLK_n] = 0x31, | ||
| 125 | + [SDLK_m] = 0x32, | ||
| 126 | + [SDLK_COMMA] = 0x33, | ||
| 127 | + [SDLK_PERIOD] = 0x34, | ||
| 128 | + [SDLK_SLASH] = 0x35, | ||
| 129 | + [SDLK_KP_MULTIPLY] = 0x37, | ||
| 130 | + [SDLK_LALT] = 0x38, | ||
| 131 | + [SDLK_SPACE] = 0x39, | ||
| 132 | + [SDLK_CAPSLOCK] = 0x3a, | ||
| 133 | + [SDLK_F1] = 0x3b, | ||
| 134 | + [SDLK_F2] = 0x3c, | ||
| 135 | + [SDLK_F3] = 0x3d, | ||
| 136 | + [SDLK_F4] = 0x3e, | ||
| 137 | + [SDLK_F5] = 0x3f, | ||
| 138 | + [SDLK_F6] = 0x40, | ||
| 139 | + [SDLK_F7] = 0x41, | ||
| 140 | + [SDLK_F8] = 0x42, | ||
| 141 | + [SDLK_F9] = 0x43, | ||
| 142 | + [SDLK_F10] = 0x44, | ||
| 143 | + [SDLK_NUMLOCK] = 0x45, | ||
| 144 | + [SDLK_SCROLLOCK] = 0x46, | ||
| 145 | + [SDLK_KP7] = 0x47, | ||
| 146 | + [SDLK_KP8] = 0x48, | ||
| 147 | + [SDLK_KP9] = 0x49, | ||
| 148 | + [SDLK_KP_MINUS] = 0x4a, | ||
| 149 | + [SDLK_KP4] = 0x4b, | ||
| 150 | + [SDLK_KP5] = 0x4c, | ||
| 151 | + [SDLK_KP6] = 0x4d, | ||
| 152 | + [SDLK_KP_PLUS] = 0x4e, | ||
| 153 | + [SDLK_KP1] = 0x4f, | ||
| 154 | + [SDLK_KP2] = 0x50, | ||
| 155 | + [SDLK_KP3] = 0x51, | ||
| 156 | + [SDLK_KP0] = 0x52, | ||
| 157 | + [SDLK_KP_PERIOD] = 0x53, | ||
| 158 | + [SDLK_PRINT] = 0x54, | ||
| 159 | + [SDLK_LMETA] = 0x56, | ||
| 160 | + | ||
| 161 | + [SDLK_KP_ENTER] = 0x9c, | ||
| 162 | + [SDLK_KP_DIVIDE] = 0xb5, | ||
| 163 | + | ||
| 164 | + [SDLK_UP] = 0xc8, | ||
| 165 | + [SDLK_DOWN] = 0xd0, | ||
| 166 | + [SDLK_RIGHT] = 0xcd, | ||
| 167 | + [SDLK_LEFT] = 0xcb, | ||
| 168 | + [SDLK_INSERT] = 0xd2, | ||
| 169 | + [SDLK_HOME] = 0xc7, | ||
| 170 | + [SDLK_END] = 0xcf, | ||
| 171 | + [SDLK_PAGEUP] = 0xc9, | ||
| 172 | + [SDLK_PAGEDOWN] = 0xd1, | ||
| 173 | + [SDLK_DELETE] = 0xd3, | ||
| 174 | +}; | ||
| 175 | + | ||
| 176 | +static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) | ||
| 177 | +{ | ||
| 178 | + return scancodes[ev->keysym.sym]; | ||
| 179 | +} | ||
| 180 | + | ||
| 181 | +#elif defined(_WIN32) | ||
| 182 | + | ||
| 183 | +static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) | ||
| 184 | +{ | ||
| 185 | + return ev->keysym.scancode; | ||
| 186 | +} | ||
| 187 | + | ||
| 188 | +#else | ||
| 189 | + | ||
| 66 | static const uint8_t x_keycode_to_pc_keycode[61] = { | 190 | static const uint8_t x_keycode_to_pc_keycode[61] = { |
| 67 | 0xc7, /* 97 Home */ | 191 | 0xc7, /* 97 Home */ |
| 68 | 0xc8, /* 98 Up */ | 192 | 0xc8, /* 98 Up */ |
| @@ -127,6 +251,27 @@ static const uint8_t x_keycode_to_pc_keycode[61] = { | @@ -127,6 +251,27 @@ static const uint8_t x_keycode_to_pc_keycode[61] = { | ||
| 127 | 0x53, /* 157 KP_Del */ | 251 | 0x53, /* 157 KP_Del */ |
| 128 | }; | 252 | }; |
| 129 | 253 | ||
| 254 | +static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) | ||
| 255 | +{ | ||
| 256 | + int keycode; | ||
| 257 | + | ||
| 258 | + keycode = ev->keysym.scancode; | ||
| 259 | + | ||
| 260 | + if (keycode < 9) { | ||
| 261 | + keycode = 0; | ||
| 262 | + } else if (keycode < 97) { | ||
| 263 | + keycode -= 8; /* just an offset */ | ||
| 264 | + } else if (keycode < 158) { | ||
| 265 | + /* use conversion table */ | ||
| 266 | + keycode = x_keycode_to_pc_keycode[keycode - 97]; | ||
| 267 | + } else { | ||
| 268 | + keycode = 0; | ||
| 269 | + } | ||
| 270 | + return keycode; | ||
| 271 | +} | ||
| 272 | + | ||
| 273 | +#endif | ||
| 274 | + | ||
| 130 | static void sdl_process_key(SDL_KeyboardEvent *ev) | 275 | static void sdl_process_key(SDL_KeyboardEvent *ev) |
| 131 | { | 276 | { |
| 132 | int keycode, v, i; | 277 | int keycode, v, i; |
| @@ -144,22 +289,7 @@ static void sdl_process_key(SDL_KeyboardEvent *ev) | @@ -144,22 +289,7 @@ static void sdl_process_key(SDL_KeyboardEvent *ev) | ||
| 144 | } | 289 | } |
| 145 | 290 | ||
| 146 | /* XXX: not portable, but avoids complicated mappings */ | 291 | /* XXX: not portable, but avoids complicated mappings */ |
| 147 | - keycode = ev->keysym.scancode; | ||
| 148 | - | ||
| 149 | - /* XXX: windows version may not work: 0xe0/0xe1 should be trapped | ||
| 150 | - ? */ | ||
| 151 | -#ifndef _WIN32 | ||
| 152 | - if (keycode < 9) { | ||
| 153 | - keycode = 0; | ||
| 154 | - } else if (keycode < 97) { | ||
| 155 | - keycode -= 8; /* just an offset */ | ||
| 156 | - } else if (keycode < 158) { | ||
| 157 | - /* use conversion table */ | ||
| 158 | - keycode = x_keycode_to_pc_keycode[keycode - 97]; | ||
| 159 | - } else { | ||
| 160 | - keycode = 0; | ||
| 161 | - } | ||
| 162 | -#endif | 292 | + keycode = sdl_keyevent_to_keycode(ev); |
| 163 | 293 | ||
| 164 | switch(keycode) { | 294 | switch(keycode) { |
| 165 | case 0x00: | 295 | case 0x00: |