Revision 3d11d0eb sdl.c
b/sdl.c | ||
---|---|---|
29 | 29 |
#include <signal.h> |
30 | 30 |
#endif |
31 | 31 |
|
32 |
#if defined(__APPLE__) |
|
33 |
#define CONFIG_SDL_GENERIC_KBD |
|
34 |
#endif |
|
35 |
|
|
36 | 32 |
static SDL_Surface *screen; |
37 | 33 |
static int gui_grab; /* if true, all keyboard/mouse events are grabbed */ |
38 | 34 |
static int last_vm_running; |
... | ... | |
72 | 68 |
ds->height = h; |
73 | 69 |
} |
74 | 70 |
|
75 |
#ifdef CONFIG_SDL_GENERIC_KBD |
|
76 |
|
|
77 |
/* XXX: use keymap tables defined in the VNC patch because the |
|
78 |
following code suppose you have a US keyboard. */ |
|
79 |
|
|
80 |
static const uint8_t scancodes[SDLK_LAST] = { |
|
81 |
[SDLK_ESCAPE] = 0x01, |
|
82 |
[SDLK_1] = 0x02, |
|
83 |
[SDLK_2] = 0x03, |
|
84 |
[SDLK_3] = 0x04, |
|
85 |
[SDLK_4] = 0x05, |
|
86 |
[SDLK_5] = 0x06, |
|
87 |
[SDLK_6] = 0x07, |
|
88 |
[SDLK_7] = 0x08, |
|
89 |
[SDLK_8] = 0x09, |
|
90 |
[SDLK_9] = 0x0a, |
|
91 |
[SDLK_0] = 0x0b, |
|
92 |
[SDLK_MINUS] = 0x0c, |
|
93 |
[SDLK_EQUALS] = 0x0d, |
|
94 |
[SDLK_BACKSPACE] = 0x0e, |
|
95 |
[SDLK_TAB] = 0x0f, |
|
96 |
[SDLK_q] = 0x10, |
|
97 |
[SDLK_w] = 0x11, |
|
98 |
[SDLK_e] = 0x12, |
|
99 |
[SDLK_r] = 0x13, |
|
100 |
[SDLK_t] = 0x14, |
|
101 |
[SDLK_y] = 0x15, |
|
102 |
[SDLK_u] = 0x16, |
|
103 |
[SDLK_i] = 0x17, |
|
104 |
[SDLK_o] = 0x18, |
|
105 |
[SDLK_p] = 0x19, |
|
106 |
[SDLK_LEFTBRACKET] = 0x1a, |
|
107 |
[SDLK_RIGHTBRACKET] = 0x1b, |
|
108 |
[SDLK_RETURN] = 0x1c, |
|
109 |
[SDLK_LCTRL] = 0x1d, |
|
110 |
[SDLK_a] = 0x1e, |
|
111 |
[SDLK_s] = 0x1f, |
|
112 |
[SDLK_d] = 0x20, |
|
113 |
[SDLK_f] = 0x21, |
|
114 |
[SDLK_g] = 0x22, |
|
115 |
[SDLK_h] = 0x23, |
|
116 |
[SDLK_j] = 0x24, |
|
117 |
[SDLK_k] = 0x25, |
|
118 |
[SDLK_l] = 0x26, |
|
119 |
[SDLK_SEMICOLON] = 0x27, |
|
120 |
[SDLK_QUOTE] = 0x28, |
|
121 |
[SDLK_BACKQUOTE] = 0x29, |
|
122 |
[SDLK_LSHIFT] = 0x2a, |
|
123 |
[SDLK_BACKSLASH] = 0x2b, |
|
124 |
[SDLK_z] = 0x2c, |
|
125 |
[SDLK_x] = 0x2d, |
|
126 |
[SDLK_c] = 0x2e, |
|
127 |
[SDLK_v] = 0x2f, |
|
128 |
[SDLK_b] = 0x30, |
|
129 |
[SDLK_n] = 0x31, |
|
130 |
[SDLK_m] = 0x32, |
|
131 |
[SDLK_COMMA] = 0x33, |
|
132 |
[SDLK_PERIOD] = 0x34, |
|
133 |
[SDLK_SLASH] = 0x35, |
|
134 |
[SDLK_KP_MULTIPLY] = 0x37, |
|
135 |
[SDLK_LALT] = 0x38, |
|
136 |
[SDLK_SPACE] = 0x39, |
|
137 |
[SDLK_CAPSLOCK] = 0x3a, |
|
138 |
[SDLK_F1] = 0x3b, |
|
139 |
[SDLK_F2] = 0x3c, |
|
140 |
[SDLK_F3] = 0x3d, |
|
141 |
[SDLK_F4] = 0x3e, |
|
142 |
[SDLK_F5] = 0x3f, |
|
143 |
[SDLK_F6] = 0x40, |
|
144 |
[SDLK_F7] = 0x41, |
|
145 |
[SDLK_F8] = 0x42, |
|
146 |
[SDLK_F9] = 0x43, |
|
147 |
[SDLK_F10] = 0x44, |
|
148 |
[SDLK_NUMLOCK] = 0x45, |
|
149 |
[SDLK_SCROLLOCK] = 0x46, |
|
150 |
[SDLK_KP7] = 0x47, |
|
151 |
[SDLK_KP8] = 0x48, |
|
152 |
[SDLK_KP9] = 0x49, |
|
153 |
[SDLK_KP_MINUS] = 0x4a, |
|
154 |
[SDLK_KP4] = 0x4b, |
|
155 |
[SDLK_KP5] = 0x4c, |
|
156 |
[SDLK_KP6] = 0x4d, |
|
157 |
[SDLK_KP_PLUS] = 0x4e, |
|
158 |
[SDLK_KP1] = 0x4f, |
|
159 |
[SDLK_KP2] = 0x50, |
|
160 |
[SDLK_KP3] = 0x51, |
|
161 |
[SDLK_KP0] = 0x52, |
|
162 |
[SDLK_KP_PERIOD] = 0x53, |
|
163 |
[SDLK_PRINT] = 0x54, |
|
164 |
[SDLK_LMETA] = 0x56, |
|
165 |
|
|
166 |
[SDLK_KP_ENTER] = 0x9c, |
|
167 |
[SDLK_KP_DIVIDE] = 0xb5, |
|
168 |
|
|
169 |
[SDLK_UP] = 0xc8, |
|
170 |
[SDLK_DOWN] = 0xd0, |
|
171 |
[SDLK_RIGHT] = 0xcd, |
|
172 |
[SDLK_LEFT] = 0xcb, |
|
173 |
[SDLK_INSERT] = 0xd2, |
|
174 |
[SDLK_HOME] = 0xc7, |
|
175 |
[SDLK_END] = 0xcf, |
|
176 |
[SDLK_PAGEUP] = 0xc9, |
|
177 |
[SDLK_PAGEDOWN] = 0xd1, |
|
178 |
[SDLK_DELETE] = 0xd3, |
|
179 |
}; |
|
71 |
/* generic keyboard conversion */ |
|
180 | 72 |
|
181 |
static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) |
|
73 |
#include "sdl_keysym.h" |
|
74 |
#include "keymaps.c" |
|
75 |
|
|
76 |
static kbd_layout_t *kbd_layout = NULL; |
|
77 |
|
|
78 |
static uint8_t sdl_keyevent_to_keycode_generic(const SDL_KeyboardEvent *ev) |
|
182 | 79 |
{ |
183 |
return scancodes[ev->keysym.sym]; |
|
80 |
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); |
|
184 | 86 |
} |
185 | 87 |
|
186 |
#elif defined(_WIN32) |
|
88 |
/* specific keyboard conversions from scan codes */ |
|
89 |
|
|
90 |
#if defined(_WIN32) |
|
187 | 91 |
|
188 | 92 |
static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev) |
189 | 93 |
{ |
... | ... | |
305 | 209 |
return; |
306 | 210 |
} |
307 | 211 |
|
308 |
/* XXX: not portable, but avoids complicated mappings */ |
|
309 |
keycode = sdl_keyevent_to_keycode(ev); |
|
212 |
if (kbd_layout) { |
|
213 |
keycode = sdl_keyevent_to_keycode_generic(ev); |
|
214 |
} else { |
|
215 |
keycode = sdl_keyevent_to_keycode(ev); |
|
216 |
} |
|
310 | 217 |
|
311 | 218 |
switch(keycode) { |
312 | 219 |
case 0x00: |
... | ... | |
558 | 465 |
{ |
559 | 466 |
int flags; |
560 | 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 |
|
|
561 | 479 |
flags = SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE; |
562 | 480 |
if (SDL_Init (flags)) { |
563 | 481 |
fprintf(stderr, "Could not initialize SDL - exiting\n"); |
Also available in: Unified diff