Mercurial > sdl-ios-xcode
annotate src/events/SDL_keyboard.c @ 1795:398ac0f88e4d
Fixed bug #220
The AltiVec blitters don't compile, since they require __VEC__ to be enabled in
order for the compiler to understand "vector" and friends (i.e. do AltiVec)
But you don't want to turn AltiVec on globally, since then the code would only
run on a G4 (there are already runtime tests, before using the AltiVec
variants)
The solution here is to enable AltiVec locally, for the actual AltiVec code.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 09 May 2006 15:09:47 +0000 |
parents | a9be6a3a51d1 |
children | 782fd950bd46 c121d94672cb b1fd24d62e55 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1283
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1283
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1283
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 9 |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1283
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1283
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1283
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1283
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
223
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 /* General keyboard handling code for SDL */ | |
25 | |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
26 #include "SDL_timer.h" |
0 | 27 #include "SDL_events.h" |
28 #include "SDL_events_c.h" | |
29 #include "SDL_sysevents.h" | |
30 | |
31 | |
32 /* Global keystate information */ | |
33 static Uint8 SDL_KeyState[SDLK_LAST]; | |
34 static SDLMod SDL_ModState; | |
35 int SDL_TranslateUNICODE = 0; | |
36 | |
1612
97d0966f4bf7
Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents:
1507
diff
changeset
|
37 static const char *keynames[SDLK_LAST]; /* Array of keycode names */ |
0 | 38 |
39 /* | |
40 * jk 991215 - added | |
41 */ | |
42 struct { | |
43 int firsttime; /* if we check against the delay or repeat value */ | |
44 int delay; /* the delay before we start repeating */ | |
45 int interval; /* the delay between key repeat events */ | |
46 Uint32 timestamp; /* the time the first keydown event occurred */ | |
47 | |
48 SDL_Event evt; /* the event we are supposed to repeat */ | |
49 } SDL_KeyRepeat; | |
50 | |
51 /* Public functions */ | |
52 int SDL_KeyboardInit(void) | |
53 { | |
54 SDL_VideoDevice *video = current_video; | |
55 SDL_VideoDevice *this = current_video; | |
56 | |
57 /* Set default mode of UNICODE translation */ | |
58 SDL_EnableUNICODE(DEFAULT_UNICODE_TRANSLATION); | |
59 | |
60 /* Initialize the tables */ | |
61 SDL_ModState = KMOD_NONE; | |
1760
a9be6a3a51d1
Patch from Dmitry Yakimov to fix building on WinCE
Sam Lantinga <slouken@libsdl.org>
parents:
1612
diff
changeset
|
62 SDL_memset((void*)keynames, 0, sizeof(keynames)); |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
63 SDL_memset(SDL_KeyState, 0, sizeof(SDL_KeyState)); |
0 | 64 video->InitOSKeymap(this); |
65 | |
66 SDL_EnableKeyRepeat(0, 0); | |
67 | |
68 /* Fill in the blanks in keynames */ | |
69 keynames[SDLK_BACKSPACE] = "backspace"; | |
70 keynames[SDLK_TAB] = "tab"; | |
71 keynames[SDLK_CLEAR] = "clear"; | |
72 keynames[SDLK_RETURN] = "return"; | |
73 keynames[SDLK_PAUSE] = "pause"; | |
74 keynames[SDLK_ESCAPE] = "escape"; | |
75 keynames[SDLK_SPACE] = "space"; | |
76 keynames[SDLK_EXCLAIM] = "!"; | |
77 keynames[SDLK_QUOTEDBL] = "\""; | |
78 keynames[SDLK_HASH] = "#"; | |
79 keynames[SDLK_DOLLAR] = "$"; | |
80 keynames[SDLK_AMPERSAND] = "&"; | |
81 keynames[SDLK_QUOTE] = "'"; | |
82 keynames[SDLK_LEFTPAREN] = "("; | |
83 keynames[SDLK_RIGHTPAREN] = ")"; | |
84 keynames[SDLK_ASTERISK] = "*"; | |
85 keynames[SDLK_PLUS] = "+"; | |
86 keynames[SDLK_COMMA] = ","; | |
87 keynames[SDLK_MINUS] = "-"; | |
88 keynames[SDLK_PERIOD] = "."; | |
89 keynames[SDLK_SLASH] = "/"; | |
90 keynames[SDLK_0] = "0"; | |
91 keynames[SDLK_1] = "1"; | |
92 keynames[SDLK_2] = "2"; | |
93 keynames[SDLK_3] = "3"; | |
94 keynames[SDLK_4] = "4"; | |
95 keynames[SDLK_5] = "5"; | |
96 keynames[SDLK_6] = "6"; | |
97 keynames[SDLK_7] = "7"; | |
98 keynames[SDLK_8] = "8"; | |
99 keynames[SDLK_9] = "9"; | |
100 keynames[SDLK_COLON] = ":"; | |
101 keynames[SDLK_SEMICOLON] = ";"; | |
102 keynames[SDLK_LESS] = "<"; | |
103 keynames[SDLK_EQUALS] = "="; | |
104 keynames[SDLK_GREATER] = ">"; | |
105 keynames[SDLK_QUESTION] = "?"; | |
106 keynames[SDLK_AT] = "@"; | |
107 keynames[SDLK_LEFTBRACKET] = "["; | |
108 keynames[SDLK_BACKSLASH] = "\\"; | |
109 keynames[SDLK_RIGHTBRACKET] = "]"; | |
110 keynames[SDLK_CARET] = "^"; | |
111 keynames[SDLK_UNDERSCORE] = "_"; | |
112 keynames[SDLK_BACKQUOTE] = "`"; | |
113 keynames[SDLK_a] = "a"; | |
114 keynames[SDLK_b] = "b"; | |
115 keynames[SDLK_c] = "c"; | |
116 keynames[SDLK_d] = "d"; | |
117 keynames[SDLK_e] = "e"; | |
118 keynames[SDLK_f] = "f"; | |
119 keynames[SDLK_g] = "g"; | |
120 keynames[SDLK_h] = "h"; | |
121 keynames[SDLK_i] = "i"; | |
122 keynames[SDLK_j] = "j"; | |
123 keynames[SDLK_k] = "k"; | |
124 keynames[SDLK_l] = "l"; | |
125 keynames[SDLK_m] = "m"; | |
126 keynames[SDLK_n] = "n"; | |
127 keynames[SDLK_o] = "o"; | |
128 keynames[SDLK_p] = "p"; | |
129 keynames[SDLK_q] = "q"; | |
130 keynames[SDLK_r] = "r"; | |
131 keynames[SDLK_s] = "s"; | |
132 keynames[SDLK_t] = "t"; | |
133 keynames[SDLK_u] = "u"; | |
134 keynames[SDLK_v] = "v"; | |
135 keynames[SDLK_w] = "w"; | |
136 keynames[SDLK_x] = "x"; | |
137 keynames[SDLK_y] = "y"; | |
138 keynames[SDLK_z] = "z"; | |
139 keynames[SDLK_DELETE] = "delete"; | |
140 | |
141 keynames[SDLK_WORLD_0] = "world 0"; | |
142 keynames[SDLK_WORLD_1] = "world 1"; | |
143 keynames[SDLK_WORLD_2] = "world 2"; | |
144 keynames[SDLK_WORLD_3] = "world 3"; | |
145 keynames[SDLK_WORLD_4] = "world 4"; | |
146 keynames[SDLK_WORLD_5] = "world 5"; | |
147 keynames[SDLK_WORLD_6] = "world 6"; | |
148 keynames[SDLK_WORLD_7] = "world 7"; | |
149 keynames[SDLK_WORLD_8] = "world 8"; | |
150 keynames[SDLK_WORLD_9] = "world 9"; | |
151 keynames[SDLK_WORLD_10] = "world 10"; | |
152 keynames[SDLK_WORLD_11] = "world 11"; | |
153 keynames[SDLK_WORLD_12] = "world 12"; | |
154 keynames[SDLK_WORLD_13] = "world 13"; | |
155 keynames[SDLK_WORLD_14] = "world 14"; | |
156 keynames[SDLK_WORLD_15] = "world 15"; | |
157 keynames[SDLK_WORLD_16] = "world 16"; | |
158 keynames[SDLK_WORLD_17] = "world 17"; | |
159 keynames[SDLK_WORLD_18] = "world 18"; | |
160 keynames[SDLK_WORLD_19] = "world 19"; | |
161 keynames[SDLK_WORLD_20] = "world 20"; | |
162 keynames[SDLK_WORLD_21] = "world 21"; | |
163 keynames[SDLK_WORLD_22] = "world 22"; | |
164 keynames[SDLK_WORLD_23] = "world 23"; | |
165 keynames[SDLK_WORLD_24] = "world 24"; | |
166 keynames[SDLK_WORLD_25] = "world 25"; | |
167 keynames[SDLK_WORLD_26] = "world 26"; | |
168 keynames[SDLK_WORLD_27] = "world 27"; | |
169 keynames[SDLK_WORLD_28] = "world 28"; | |
170 keynames[SDLK_WORLD_29] = "world 29"; | |
171 keynames[SDLK_WORLD_30] = "world 30"; | |
172 keynames[SDLK_WORLD_31] = "world 31"; | |
173 keynames[SDLK_WORLD_32] = "world 32"; | |
174 keynames[SDLK_WORLD_33] = "world 33"; | |
175 keynames[SDLK_WORLD_34] = "world 34"; | |
176 keynames[SDLK_WORLD_35] = "world 35"; | |
177 keynames[SDLK_WORLD_36] = "world 36"; | |
178 keynames[SDLK_WORLD_37] = "world 37"; | |
179 keynames[SDLK_WORLD_38] = "world 38"; | |
180 keynames[SDLK_WORLD_39] = "world 39"; | |
181 keynames[SDLK_WORLD_40] = "world 40"; | |
182 keynames[SDLK_WORLD_41] = "world 41"; | |
183 keynames[SDLK_WORLD_42] = "world 42"; | |
184 keynames[SDLK_WORLD_43] = "world 43"; | |
185 keynames[SDLK_WORLD_44] = "world 44"; | |
186 keynames[SDLK_WORLD_45] = "world 45"; | |
187 keynames[SDLK_WORLD_46] = "world 46"; | |
188 keynames[SDLK_WORLD_47] = "world 47"; | |
189 keynames[SDLK_WORLD_48] = "world 48"; | |
190 keynames[SDLK_WORLD_49] = "world 49"; | |
191 keynames[SDLK_WORLD_50] = "world 50"; | |
192 keynames[SDLK_WORLD_51] = "world 51"; | |
193 keynames[SDLK_WORLD_52] = "world 52"; | |
194 keynames[SDLK_WORLD_53] = "world 53"; | |
195 keynames[SDLK_WORLD_54] = "world 54"; | |
196 keynames[SDLK_WORLD_55] = "world 55"; | |
197 keynames[SDLK_WORLD_56] = "world 56"; | |
198 keynames[SDLK_WORLD_57] = "world 57"; | |
199 keynames[SDLK_WORLD_58] = "world 58"; | |
200 keynames[SDLK_WORLD_59] = "world 59"; | |
201 keynames[SDLK_WORLD_60] = "world 60"; | |
202 keynames[SDLK_WORLD_61] = "world 61"; | |
203 keynames[SDLK_WORLD_62] = "world 62"; | |
204 keynames[SDLK_WORLD_63] = "world 63"; | |
205 keynames[SDLK_WORLD_64] = "world 64"; | |
206 keynames[SDLK_WORLD_65] = "world 65"; | |
207 keynames[SDLK_WORLD_66] = "world 66"; | |
208 keynames[SDLK_WORLD_67] = "world 67"; | |
209 keynames[SDLK_WORLD_68] = "world 68"; | |
210 keynames[SDLK_WORLD_69] = "world 69"; | |
211 keynames[SDLK_WORLD_70] = "world 70"; | |
212 keynames[SDLK_WORLD_71] = "world 71"; | |
213 keynames[SDLK_WORLD_72] = "world 72"; | |
214 keynames[SDLK_WORLD_73] = "world 73"; | |
215 keynames[SDLK_WORLD_74] = "world 74"; | |
216 keynames[SDLK_WORLD_75] = "world 75"; | |
217 keynames[SDLK_WORLD_76] = "world 76"; | |
218 keynames[SDLK_WORLD_77] = "world 77"; | |
219 keynames[SDLK_WORLD_78] = "world 78"; | |
220 keynames[SDLK_WORLD_79] = "world 79"; | |
221 keynames[SDLK_WORLD_80] = "world 80"; | |
222 keynames[SDLK_WORLD_81] = "world 81"; | |
223 keynames[SDLK_WORLD_82] = "world 82"; | |
224 keynames[SDLK_WORLD_83] = "world 83"; | |
225 keynames[SDLK_WORLD_84] = "world 84"; | |
226 keynames[SDLK_WORLD_85] = "world 85"; | |
227 keynames[SDLK_WORLD_86] = "world 86"; | |
228 keynames[SDLK_WORLD_87] = "world 87"; | |
229 keynames[SDLK_WORLD_88] = "world 88"; | |
230 keynames[SDLK_WORLD_89] = "world 89"; | |
231 keynames[SDLK_WORLD_90] = "world 90"; | |
232 keynames[SDLK_WORLD_91] = "world 91"; | |
233 keynames[SDLK_WORLD_92] = "world 92"; | |
234 keynames[SDLK_WORLD_93] = "world 93"; | |
235 keynames[SDLK_WORLD_94] = "world 94"; | |
236 keynames[SDLK_WORLD_95] = "world 95"; | |
237 | |
238 keynames[SDLK_KP0] = "[0]"; | |
239 keynames[SDLK_KP1] = "[1]"; | |
240 keynames[SDLK_KP2] = "[2]"; | |
241 keynames[SDLK_KP3] = "[3]"; | |
242 keynames[SDLK_KP4] = "[4]"; | |
243 keynames[SDLK_KP5] = "[5]"; | |
244 keynames[SDLK_KP6] = "[6]"; | |
245 keynames[SDLK_KP7] = "[7]"; | |
246 keynames[SDLK_KP8] = "[8]"; | |
247 keynames[SDLK_KP9] = "[9]"; | |
248 keynames[SDLK_KP_PERIOD] = "[.]"; | |
249 keynames[SDLK_KP_DIVIDE] = "[/]"; | |
250 keynames[SDLK_KP_MULTIPLY] = "[*]"; | |
251 keynames[SDLK_KP_MINUS] = "[-]"; | |
252 keynames[SDLK_KP_PLUS] = "[+]"; | |
253 keynames[SDLK_KP_ENTER] = "enter"; | |
254 keynames[SDLK_KP_EQUALS] = "equals"; | |
255 | |
256 keynames[SDLK_UP] = "up"; | |
257 keynames[SDLK_DOWN] = "down"; | |
258 keynames[SDLK_RIGHT] = "right"; | |
259 keynames[SDLK_LEFT] = "left"; | |
260 keynames[SDLK_DOWN] = "down"; | |
261 keynames[SDLK_INSERT] = "insert"; | |
262 keynames[SDLK_HOME] = "home"; | |
263 keynames[SDLK_END] = "end"; | |
264 keynames[SDLK_PAGEUP] = "page up"; | |
265 keynames[SDLK_PAGEDOWN] = "page down"; | |
266 | |
267 keynames[SDLK_F1] = "f1"; | |
268 keynames[SDLK_F2] = "f2"; | |
269 keynames[SDLK_F3] = "f3"; | |
270 keynames[SDLK_F4] = "f4"; | |
271 keynames[SDLK_F5] = "f5"; | |
272 keynames[SDLK_F6] = "f6"; | |
273 keynames[SDLK_F7] = "f7"; | |
274 keynames[SDLK_F8] = "f8"; | |
275 keynames[SDLK_F9] = "f9"; | |
276 keynames[SDLK_F10] = "f10"; | |
277 keynames[SDLK_F11] = "f11"; | |
278 keynames[SDLK_F12] = "f12"; | |
279 keynames[SDLK_F13] = "f13"; | |
280 keynames[SDLK_F14] = "f14"; | |
281 keynames[SDLK_F15] = "f15"; | |
282 | |
283 keynames[SDLK_NUMLOCK] = "numlock"; | |
284 keynames[SDLK_CAPSLOCK] = "caps lock"; | |
285 keynames[SDLK_SCROLLOCK] = "scroll lock"; | |
286 keynames[SDLK_RSHIFT] = "right shift"; | |
287 keynames[SDLK_LSHIFT] = "left shift"; | |
288 keynames[SDLK_RCTRL] = "right ctrl"; | |
289 keynames[SDLK_LCTRL] = "left ctrl"; | |
290 keynames[SDLK_RALT] = "right alt"; | |
291 keynames[SDLK_LALT] = "left alt"; | |
292 keynames[SDLK_RMETA] = "right meta"; | |
293 keynames[SDLK_LMETA] = "left meta"; | |
294 keynames[SDLK_LSUPER] = "left super"; /* "Windows" keys */ | |
295 keynames[SDLK_RSUPER] = "right super"; | |
296 keynames[SDLK_MODE] = "alt gr"; | |
297 keynames[SDLK_COMPOSE] = "compose"; | |
298 | |
299 keynames[SDLK_HELP] = "help"; | |
300 keynames[SDLK_PRINT] = "print screen"; | |
301 keynames[SDLK_SYSREQ] = "sys req"; | |
302 keynames[SDLK_BREAK] = "break"; | |
303 keynames[SDLK_MENU] = "menu"; | |
304 keynames[SDLK_POWER] = "power"; | |
305 keynames[SDLK_EURO] = "euro"; | |
184
3142d2ac11db
Added the Undo key for the Atari keyboard
Sam Lantinga <slouken@libsdl.org>
parents:
122
diff
changeset
|
306 keynames[SDLK_UNDO] = "undo"; |
0 | 307 |
308 /* Done. Whew. */ | |
309 return(0); | |
310 } | |
1123
28ac87a38c17
Date: Fri, 08 Jul 2005 22:43:48 +0200 (CEST)
Sam Lantinga <slouken@libsdl.org>
parents:
1021
diff
changeset
|
311 void SDL_KeyboardQuit(void) |
28ac87a38c17
Date: Fri, 08 Jul 2005 22:43:48 +0200 (CEST)
Sam Lantinga <slouken@libsdl.org>
parents:
1021
diff
changeset
|
312 { |
28ac87a38c17
Date: Fri, 08 Jul 2005 22:43:48 +0200 (CEST)
Sam Lantinga <slouken@libsdl.org>
parents:
1021
diff
changeset
|
313 } |
0 | 314 |
315 /* We lost the keyboard, so post key up messages for all pressed keys */ | |
316 void SDL_ResetKeyboard(void) | |
317 { | |
318 SDL_keysym keysym; | |
319 SDLKey key; | |
320 | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
321 SDL_memset(&keysym, 0, (sizeof keysym)); |
0 | 322 for ( key=SDLK_FIRST; key<SDLK_LAST; ++key ) { |
323 if ( SDL_KeyState[key] == SDL_PRESSED ) { | |
324 keysym.sym = key; | |
325 SDL_PrivateKeyboard(SDL_RELEASED, &keysym); | |
326 } | |
327 } | |
14
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
328 SDL_KeyRepeat.timestamp = 0; |
0 | 329 } |
330 | |
331 int SDL_EnableUNICODE(int enable) | |
332 { | |
333 int old_mode; | |
334 | |
335 old_mode = SDL_TranslateUNICODE; | |
336 if ( enable >= 0 ) { | |
337 SDL_TranslateUNICODE = enable; | |
338 } | |
339 return(old_mode); | |
340 } | |
341 | |
342 Uint8 * SDL_GetKeyState (int *numkeys) | |
343 { | |
344 if ( numkeys != (int *)0 ) | |
345 *numkeys = SDLK_LAST; | |
346 return(SDL_KeyState); | |
347 } | |
348 SDLMod SDL_GetModState (void) | |
349 { | |
350 return(SDL_ModState); | |
351 } | |
352 void SDL_SetModState (SDLMod modstate) | |
353 { | |
354 SDL_ModState = modstate; | |
355 } | |
356 | |
357 char *SDL_GetKeyName(SDLKey key) | |
358 { | |
1612
97d0966f4bf7
Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents:
1507
diff
changeset
|
359 const char *keyname; |
0 | 360 |
361 keyname = NULL; | |
362 if ( key < SDLK_LAST ) { | |
363 keyname = keynames[key]; | |
364 } | |
365 if ( keyname == NULL ) { | |
366 keyname = "unknown key"; | |
367 } | |
1612
97d0966f4bf7
Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents:
1507
diff
changeset
|
368 /* FIXME: make this function const in 1.3 */ |
97d0966f4bf7
Fixed some ultra-pedantic gcc warnings
Sam Lantinga <slouken@libsdl.org>
parents:
1507
diff
changeset
|
369 return (char *)(keyname); |
0 | 370 } |
371 | |
372 /* These are global for SDL_eventloop.c */ | |
373 int SDL_PrivateKeyboard(Uint8 state, SDL_keysym *keysym) | |
374 { | |
375 SDL_Event event; | |
376 int posted, repeatable; | |
377 Uint16 modstate; | |
378 | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
379 SDL_memset(&event, 0, sizeof(event)); |
0 | 380 |
381 #if 0 | |
382 printf("The '%s' key has been %s\n", SDL_GetKeyName(keysym->sym), | |
383 state == SDL_PRESSED ? "pressed" : "released"); | |
384 #endif | |
385 /* Set up the keysym */ | |
386 modstate = (Uint16)SDL_ModState; | |
387 | |
388 repeatable = 0; | |
389 | |
390 if ( state == SDL_PRESSED ) { | |
391 keysym->mod = (SDLMod)modstate; | |
392 switch (keysym->sym) { | |
1327 | 393 case SDLK_UNKNOWN: |
394 break; | |
0 | 395 case SDLK_NUMLOCK: |
396 modstate ^= KMOD_NUM; | |
397 if ( ! (modstate&KMOD_NUM) ) | |
398 state = SDL_RELEASED; | |
399 keysym->mod = (SDLMod)modstate; | |
400 break; | |
401 case SDLK_CAPSLOCK: | |
402 modstate ^= KMOD_CAPS; | |
403 if ( ! (modstate&KMOD_CAPS) ) | |
404 state = SDL_RELEASED; | |
405 keysym->mod = (SDLMod)modstate; | |
406 break; | |
407 case SDLK_LCTRL: | |
408 modstate |= KMOD_LCTRL; | |
409 break; | |
410 case SDLK_RCTRL: | |
411 modstate |= KMOD_RCTRL; | |
412 break; | |
413 case SDLK_LSHIFT: | |
414 modstate |= KMOD_LSHIFT; | |
415 break; | |
416 case SDLK_RSHIFT: | |
417 modstate |= KMOD_RSHIFT; | |
418 break; | |
419 case SDLK_LALT: | |
420 modstate |= KMOD_LALT; | |
421 break; | |
422 case SDLK_RALT: | |
423 modstate |= KMOD_RALT; | |
424 break; | |
425 case SDLK_LMETA: | |
426 modstate |= KMOD_LMETA; | |
427 break; | |
428 case SDLK_RMETA: | |
429 modstate |= KMOD_RMETA; | |
430 break; | |
431 case SDLK_MODE: | |
432 modstate |= KMOD_MODE; | |
433 break; | |
434 default: | |
435 repeatable = 1; | |
436 break; | |
437 } | |
438 } else { | |
439 switch (keysym->sym) { | |
1327 | 440 case SDLK_UNKNOWN: |
441 break; | |
0 | 442 case SDLK_NUMLOCK: |
443 case SDLK_CAPSLOCK: | |
444 /* Only send keydown events */ | |
445 return(0); | |
446 case SDLK_LCTRL: | |
447 modstate &= ~KMOD_LCTRL; | |
448 break; | |
449 case SDLK_RCTRL: | |
450 modstate &= ~KMOD_RCTRL; | |
451 break; | |
452 case SDLK_LSHIFT: | |
453 modstate &= ~KMOD_LSHIFT; | |
454 break; | |
455 case SDLK_RSHIFT: | |
456 modstate &= ~KMOD_RSHIFT; | |
457 break; | |
458 case SDLK_LALT: | |
459 modstate &= ~KMOD_LALT; | |
460 break; | |
461 case SDLK_RALT: | |
462 modstate &= ~KMOD_RALT; | |
463 break; | |
464 case SDLK_LMETA: | |
465 modstate &= ~KMOD_LMETA; | |
466 break; | |
467 case SDLK_RMETA: | |
468 modstate &= ~KMOD_RMETA; | |
469 break; | |
470 case SDLK_MODE: | |
471 modstate &= ~KMOD_MODE; | |
472 break; | |
473 default: | |
474 break; | |
475 } | |
476 keysym->mod = (SDLMod)modstate; | |
477 } | |
478 | |
479 /* Figure out what type of event this is */ | |
480 switch (state) { | |
481 case SDL_PRESSED: | |
482 event.type = SDL_KEYDOWN; | |
483 break; | |
484 case SDL_RELEASED: | |
485 event.type = SDL_KEYUP; | |
486 /* | |
487 * jk 991215 - Added | |
488 */ | |
1021
ddd058103e28
Date: Sun, 2 Jan 2005 18:36:09 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
489 if ( SDL_KeyRepeat.timestamp && |
ddd058103e28
Date: Sun, 2 Jan 2005 18:36:09 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
490 SDL_KeyRepeat.evt.key.keysym.sym == keysym->sym ) { |
0 | 491 SDL_KeyRepeat.timestamp = 0; |
492 } | |
493 break; | |
494 default: | |
495 /* Invalid state -- bail */ | |
496 return(0); | |
497 } | |
498 | |
1327 | 499 if ( keysym->sym != SDLK_UNKNOWN ) { |
500 /* Drop events that don't change state */ | |
501 if ( SDL_KeyState[keysym->sym] == state ) { | |
1282
217f5d5a49e5
Date: Sat, 15 Jan 2005 02:01:51 +0000 (UTC)
Sam Lantinga <slouken@libsdl.org>
parents:
1123
diff
changeset
|
502 #if 0 |
1283
f214b6fae45a
Date: Fri, 14 Jan 2005 21:52:46 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1282
diff
changeset
|
503 printf("Keyboard event didn't change state - dropped!\n"); |
1282
217f5d5a49e5
Date: Sat, 15 Jan 2005 02:01:51 +0000 (UTC)
Sam Lantinga <slouken@libsdl.org>
parents:
1123
diff
changeset
|
504 #endif |
1327 | 505 return(0); |
506 } | |
0 | 507 |
1327 | 508 /* Update internal keyboard state */ |
509 SDL_ModState = (SDLMod)modstate; | |
510 SDL_KeyState[keysym->sym] = state; | |
511 } | |
0 | 512 |
513 /* Post the event, if desired */ | |
514 posted = 0; | |
515 if ( SDL_ProcessEvents[event.type] == SDL_ENABLE ) { | |
516 event.key.state = state; | |
517 event.key.keysym = *keysym; | |
223
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
518 /* |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
519 * jk 991215 - Added |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
520 */ |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
521 if (repeatable && (SDL_KeyRepeat.delay != 0)) { |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
522 SDL_KeyRepeat.evt = event; |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
523 SDL_KeyRepeat.firsttime = 1; |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
524 SDL_KeyRepeat.timestamp=SDL_GetTicks(); |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
525 } |
0 | 526 if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) { |
527 posted = 1; | |
528 SDL_PushEvent(&event); | |
529 } | |
530 } | |
531 return(posted); | |
532 } | |
533 | |
534 /* | |
535 * jk 991215 - Added | |
536 */ | |
537 void SDL_CheckKeyRepeat(void) | |
538 { | |
539 if ( SDL_KeyRepeat.timestamp ) { | |
540 Uint32 now, interval; | |
541 | |
542 now = SDL_GetTicks(); | |
543 interval = (now - SDL_KeyRepeat.timestamp); | |
544 if ( SDL_KeyRepeat.firsttime ) { | |
545 if ( interval > (Uint32)SDL_KeyRepeat.delay ) { | |
546 SDL_KeyRepeat.timestamp = now; | |
547 SDL_KeyRepeat.firsttime = 0; | |
548 } | |
549 } else { | |
550 if ( interval > (Uint32)SDL_KeyRepeat.interval ) { | |
551 SDL_KeyRepeat.timestamp = now; | |
223
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
552 if ( (SDL_EventOK == NULL) || SDL_EventOK(&SDL_KeyRepeat.evt) ) { |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
553 SDL_PushEvent(&SDL_KeyRepeat.evt); |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
554 } |
0 | 555 } |
556 } | |
557 } | |
558 } | |
559 | |
560 int SDL_EnableKeyRepeat(int delay, int interval) | |
561 { | |
122
8f33e95b43b6
Don't worry about a minimum repeat rate - let the user hang themselves...
Sam Lantinga <slouken@libsdl.org>
parents:
14
diff
changeset
|
562 if ( (delay < 0) || (interval < 0) ) { |
8f33e95b43b6
Don't worry about a minimum repeat rate - let the user hang themselves...
Sam Lantinga <slouken@libsdl.org>
parents:
14
diff
changeset
|
563 SDL_SetError("keyboard repeat value less than zero"); |
0 | 564 return(-1); |
565 } | |
566 SDL_KeyRepeat.firsttime = 0; | |
567 SDL_KeyRepeat.delay = delay; | |
122
8f33e95b43b6
Don't worry about a minimum repeat rate - let the user hang themselves...
Sam Lantinga <slouken@libsdl.org>
parents:
14
diff
changeset
|
568 SDL_KeyRepeat.interval = interval; |
0 | 569 SDL_KeyRepeat.timestamp = 0; |
570 return(0); | |
571 } | |
572 | |
1507 | 573 void SDL_GetKeyRepeat(int *delay, int *interval) |
574 { | |
575 *delay = SDL_KeyRepeat.delay; | |
576 *interval = SDL_KeyRepeat.interval; | |
577 } | |
578 |