Commit e58d12ed5b22ca78b46cc4e36392f4e763008eb9

Authored by bellard
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
... ... @@ -29,6 +29,10 @@
29 29 #include <signal.h>
30 30 #endif
31 31  
  32 +#if defined(__APPLE__)
  33 +#define CONFIG_SDL_GENERIC_KBD
  34 +#endif
  35 +
32 36 static SDL_Surface *screen;
33 37 static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
34 38 static int last_vm_running;
... ... @@ -63,6 +67,126 @@ static void sdl_resize(DisplayState *ds, int w, int h)
63 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 190 static const uint8_t x_keycode_to_pc_keycode[61] = {
67 191 0xc7, /* 97 Home */
68 192 0xc8, /* 98 Up */
... ... @@ -127,6 +251,27 @@ static const uint8_t x_keycode_to_pc_keycode[61] = {
127 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 275 static void sdl_process_key(SDL_KeyboardEvent *ev)
131 276 {
132 277 int keycode, v, i;
... ... @@ -144,22 +289,7 @@ static void sdl_process_key(SDL_KeyboardEvent *ev)
144 289 }
145 290  
146 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 294 switch(keycode) {
165 295 case 0x00:
... ...