Revision de2200d3 sdl.c
b/sdl.c | ||
---|---|---|
63 | 63 |
ds->depth = screen->format->BitsPerPixel; |
64 | 64 |
} |
65 | 65 |
|
66 |
static const uint32_t x_keycode_to_pc_keycode[61] = {
|
|
67 |
0x47e0, /* 97 Home */
|
|
68 |
0x48e0, /* 98 Up */
|
|
69 |
0x49e0, /* 99 PgUp */
|
|
70 |
0x4be0, /* 100 Left */
|
|
66 |
static const uint8_t x_keycode_to_pc_keycode[61] = {
|
|
67 |
0xc7, /* 97 Home */
|
|
68 |
0xc8, /* 98 Up */
|
|
69 |
0xc9, /* 99 PgUp */
|
|
70 |
0xcb, /* 100 Left */
|
|
71 | 71 |
0x4c, /* 101 KP-5 */ |
72 |
0x4de0, /* 102 Right */ |
|
73 |
0x4fe0, /* 103 End */ |
|
74 |
0x50e0, /* 104 Down */ |
|
75 |
0x51e0, /* 105 PgDn */ |
|
76 |
0x52e0, /* 106 Ins */ |
|
77 |
0x53e0, /* 107 Del */ |
|
78 |
0x1ce0, /* 108 Enter */ |
|
79 |
0x1de0, /* 109 Ctrl-R */ |
|
80 |
0x451de1, /* 110 Pause */ |
|
81 |
0x37e0, /* 111 Print */ |
|
82 |
0x35e0, /* 112 Divide */ |
|
83 |
0x38e0, /* 113 Alt-R */ |
|
84 |
0x46e0, /* 114 Break */ |
|
72 |
0xcd, /* 102 Right */ |
|
73 |
0xcf, /* 103 End */ |
|
74 |
0xd0, /* 104 Down */ |
|
75 |
0xd1, /* 105 PgDn */ |
|
76 |
0xd2, /* 106 Ins */ |
|
77 |
0xd3, /* 107 Del */ |
|
78 |
0x9c, /* 108 Enter */ |
|
79 |
0x9d, /* 109 Ctrl-R */ |
|
80 |
0xb7, /* 111 Print */ |
|
81 |
0xb5, /* 112 Divide */ |
|
82 |
0xb8, /* 113 Alt-R */ |
|
83 |
0xc6, /* 114 Break */ |
|
85 | 84 |
0x0, /* 115 */ |
86 | 85 |
0x0, /* 116 */ |
87 | 86 |
0x0, /* 117 */ |
... | ... | |
129 | 128 |
|
130 | 129 |
static void sdl_process_key(SDL_KeyboardEvent *ev) |
131 | 130 |
{ |
132 |
int keycode, v; |
|
133 |
|
|
131 |
int keycode, v, i; |
|
132 |
static uint8_t modifiers_state[256]; |
|
133 |
|
|
134 |
if (ev->keysym.sym == SDLK_PAUSE) { |
|
135 |
/* specific case */ |
|
136 |
v = 0; |
|
137 |
if (ev->type == SDL_KEYUP) |
|
138 |
v |= 0x80; |
|
139 |
kbd_put_keycode(0xe1); |
|
140 |
kbd_put_keycode(0x1d | v); |
|
141 |
kbd_put_keycode(0x45 | v); |
|
142 |
return; |
|
143 |
} |
|
144 |
|
|
134 | 145 |
/* XXX: not portable, but avoids complicated mappings */ |
135 | 146 |
keycode = ev->keysym.scancode; |
136 | 147 |
|
148 |
/* XXX: windows version may not work: 0xe0/0xe1 should be trapped |
|
149 |
? */ |
|
137 | 150 |
#ifndef _WIN32 |
138 | 151 |
if (keycode < 9) { |
139 | 152 |
keycode = 0; |
... | ... | |
146 | 159 |
keycode = 0; |
147 | 160 |
} |
148 | 161 |
#endif |
149 |
|
|
150 |
/* now send the key code */ |
|
151 |
while (keycode != 0) { |
|
152 |
v = keycode & 0xff; |
|
162 |
|
|
163 |
switch(keycode) { |
|
164 |
case 0x00: |
|
165 |
/* sent when leaving window: reset the modifiers state */ |
|
166 |
for(i = 0; i < 256; i++) { |
|
167 |
if (modifiers_state[i]) { |
|
168 |
if (i & 0x80) |
|
169 |
kbd_put_keycode(0xe0); |
|
170 |
kbd_put_keycode(i | 0x80); |
|
171 |
} |
|
172 |
} |
|
173 |
return; |
|
174 |
case 0x2a: /* Left Shift */ |
|
175 |
case 0x36: /* Right Shift */ |
|
176 |
case 0x1d: /* Left CTRL */ |
|
177 |
case 0x9d: /* Right CTRL */ |
|
178 |
case 0x38: /* Left ALT */ |
|
179 |
case 0xb8: /* Right ALT */ |
|
153 | 180 |
if (ev->type == SDL_KEYUP) |
154 |
v |= 0x80; |
|
155 |
kbd_put_keycode(v); |
|
156 |
keycode >>= 8; |
|
181 |
modifiers_state[keycode] = 0; |
|
182 |
else |
|
183 |
modifiers_state[keycode] = 1; |
|
184 |
break; |
|
185 |
case 0x45: /* num lock */ |
|
186 |
case 0x3a: /* caps lock */ |
|
187 |
/* SDL does not send the key up event, so we generate it */ |
|
188 |
kbd_put_keycode(keycode); |
|
189 |
kbd_put_keycode(keycode | 0x80); |
|
190 |
return; |
|
157 | 191 |
} |
192 |
|
|
193 |
/* now send the key code */ |
|
194 |
if (keycode & 0x80) |
|
195 |
kbd_put_keycode(0xe0); |
|
196 |
if (ev->type == SDL_KEYUP) |
|
197 |
kbd_put_keycode(keycode | 0x80); |
|
198 |
else |
|
199 |
kbd_put_keycode(keycode & 0x7f); |
|
158 | 200 |
} |
159 | 201 |
|
160 | 202 |
static void sdl_update_caption(void) |
Also available in: Unified diff