29 |
#include <signal.h> |
#include <signal.h> |
30 |
#endif |
#endif |
31 |
|
|
|
#if defined(__APPLE__) |
|
|
#define CONFIG_SDL_GENERIC_KBD |
|
|
#endif |
|
|
|
|
32 |
static SDL_Surface *screen; |
static SDL_Surface *screen; |
33 |
static int gui_grab; /* if true, all keyboard/mouse events are grabbed */ |
static int gui_grab; /* if true, all keyboard/mouse events are grabbed */ |
34 |
static int last_vm_running; |
static int last_vm_running; |
68 |
ds->height = h; |
ds->height = h; |
69 |
} |
} |
70 |
|
|
71 |
#ifdef CONFIG_SDL_GENERIC_KBD |
/* generic keyboard conversion */ |
72 |
|
|
73 |
/* XXX: use keymap tables defined in the VNC patch because the |
#include "sdl_keysym.h" |
74 |
following code suppose you have a US keyboard. */ |
#include "keymaps.c" |
75 |
|
|
76 |
static const uint8_t scancodes[SDLK_LAST] = { |
static kbd_layout_t *kbd_layout = NULL; |
|
[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, |
|
|
}; |
|
77 |
|
|
78 |
static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) |
static uint8_t sdl_keyevent_to_keycode_generic(const SDL_KeyboardEvent *ev) |
79 |
{ |
{ |
80 |
return scancodes[ev->keysym.sym]; |
int keysym; |
81 |
|
/* workaround for X11+SDL bug with AltGR */ |
82 |
|
keysym = ev->keysym.sym; |
83 |
|
if (keysym == 0 && ev->keysym.scancode == 113) |
84 |
|
keysym = SDLK_MODE; |
85 |
|
return keysym2scancode(kbd_layout, keysym); |
86 |
} |
} |
87 |
|
|
88 |
#elif defined(_WIN32) |
/* specific keyboard conversions from scan codes */ |
89 |
|
|
90 |
|
#if defined(_WIN32) |
91 |
|
|
92 |
static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) |
static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) |
93 |
{ |
{ |
209 |
return; |
return; |
210 |
} |
} |
211 |
|
|
212 |
/* XXX: not portable, but avoids complicated mappings */ |
if (kbd_layout) { |
213 |
keycode = sdl_keyevent_to_keycode(ev); |
keycode = sdl_keyevent_to_keycode_generic(ev); |
214 |
|
} else { |
215 |
|
keycode = sdl_keyevent_to_keycode(ev); |
216 |
|
} |
217 |
|
|
218 |
switch(keycode) { |
switch(keycode) { |
219 |
case 0x00: |
case 0x00: |
465 |
{ |
{ |
466 |
int flags; |
int flags; |
467 |
|
|
468 |
|
#if defined(__APPLE__) |
469 |
|
/* always use generic keymaps */ |
470 |
|
if (!keyboard_layout) |
471 |
|
keyboard_layout = "en-us"; |
472 |
|
#endif |
473 |
|
if(keyboard_layout) { |
474 |
|
kbd_layout = init_keyboard_layout(keyboard_layout); |
475 |
|
if (!kbd_layout) |
476 |
|
exit(1); |
477 |
|
} |
478 |
|
|
479 |
flags = SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE; |
flags = SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE; |
480 |
if (SDL_Init (flags)) { |
if (SDL_Init (flags)) { |
481 |
fprintf(stderr, "Could not initialize SDL - exiting\n"); |
fprintf(stderr, "Could not initialize SDL - exiting\n"); |