Mercurial > sdl-ios-xcode
annotate src/events/SDL_keyboard.c @ 1551:02e19471a694
Fixed bug #4
[Note: I'm applying this patch since it's a cleaner version of what's already implemented, and supports this controller on older kernels. I'll ask to make sure this doesn't break on the new kernels where it's no longer necessary]
Date: Mon, 21 Mar 2005 09:41:11 -0500
From: Chris Nelson
Subject: SDL Patch
Hey, Ryan.
I submitted the following patch about a year ago. It's just a simple
patch for the linux port, to make multiple joysticks each appear to SDL
as their own device, if they are on the same USB port (specifically,
these guys
<http://www.consoleplus.co.uk/product_info.php?pName=super-joybox-5-quad-joypad-converter>,
which allow 4 Playstation2 controllers to be accessed via a single USB
port). Without this patch, SDL pretty much drops the ball, and reports
that there are 4 joysticks available when less than that number are
plugged in.
My work built upon the work of another person with the same device. When
I submitted the patch to the list, he tested it, but it didn't work for
him, so the patch was never accepted. Maybe about 3 times in the past
year, I've tried to email the guy, to see if he couldn't run my new
version, complete with debug code to diagnose the problem he was having.
He never got back to me.
So, I'm attaching the patch. I wish I knew why it didn't work for him,
but I've been using it for the last year with no problems. Let me know
if you need any more information, or have any ideas as to how I could
test it. I'd like to see it in the tree, but I want to make sure it works.
-Chris
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 19 Mar 2006 06:31:34 +0000 |
parents | 1ff64ad478b2 |
children | 97d0966f4bf7 |
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 | |
37 static char *keynames[SDLK_LAST]; /* Array of keycode names */ | |
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; | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
62 SDL_memset(keynames, 0, sizeof(keynames)); |
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 { | |
359 char *keyname; | |
360 | |
361 keyname = NULL; | |
362 if ( key < SDLK_LAST ) { | |
363 keyname = keynames[key]; | |
364 } | |
365 if ( keyname == NULL ) { | |
366 keyname = "unknown key"; | |
367 } | |
368 return(keyname); | |
369 } | |
370 | |
371 /* These are global for SDL_eventloop.c */ | |
372 int SDL_PrivateKeyboard(Uint8 state, SDL_keysym *keysym) | |
373 { | |
374 SDL_Event event; | |
375 int posted, repeatable; | |
376 Uint16 modstate; | |
377 | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
378 SDL_memset(&event, 0, sizeof(event)); |
0 | 379 |
380 #if 0 | |
381 printf("The '%s' key has been %s\n", SDL_GetKeyName(keysym->sym), | |
382 state == SDL_PRESSED ? "pressed" : "released"); | |
383 #endif | |
384 /* Set up the keysym */ | |
385 modstate = (Uint16)SDL_ModState; | |
386 | |
387 repeatable = 0; | |
388 | |
389 if ( state == SDL_PRESSED ) { | |
390 keysym->mod = (SDLMod)modstate; | |
391 switch (keysym->sym) { | |
1327 | 392 case SDLK_UNKNOWN: |
393 break; | |
0 | 394 case SDLK_NUMLOCK: |
395 modstate ^= KMOD_NUM; | |
396 if ( ! (modstate&KMOD_NUM) ) | |
397 state = SDL_RELEASED; | |
398 keysym->mod = (SDLMod)modstate; | |
399 break; | |
400 case SDLK_CAPSLOCK: | |
401 modstate ^= KMOD_CAPS; | |
402 if ( ! (modstate&KMOD_CAPS) ) | |
403 state = SDL_RELEASED; | |
404 keysym->mod = (SDLMod)modstate; | |
405 break; | |
406 case SDLK_LCTRL: | |
407 modstate |= KMOD_LCTRL; | |
408 break; | |
409 case SDLK_RCTRL: | |
410 modstate |= KMOD_RCTRL; | |
411 break; | |
412 case SDLK_LSHIFT: | |
413 modstate |= KMOD_LSHIFT; | |
414 break; | |
415 case SDLK_RSHIFT: | |
416 modstate |= KMOD_RSHIFT; | |
417 break; | |
418 case SDLK_LALT: | |
419 modstate |= KMOD_LALT; | |
420 break; | |
421 case SDLK_RALT: | |
422 modstate |= KMOD_RALT; | |
423 break; | |
424 case SDLK_LMETA: | |
425 modstate |= KMOD_LMETA; | |
426 break; | |
427 case SDLK_RMETA: | |
428 modstate |= KMOD_RMETA; | |
429 break; | |
430 case SDLK_MODE: | |
431 modstate |= KMOD_MODE; | |
432 break; | |
433 default: | |
434 repeatable = 1; | |
435 break; | |
436 } | |
437 } else { | |
438 switch (keysym->sym) { | |
1327 | 439 case SDLK_UNKNOWN: |
440 break; | |
0 | 441 case SDLK_NUMLOCK: |
442 case SDLK_CAPSLOCK: | |
443 /* Only send keydown events */ | |
444 return(0); | |
445 case SDLK_LCTRL: | |
446 modstate &= ~KMOD_LCTRL; | |
447 break; | |
448 case SDLK_RCTRL: | |
449 modstate &= ~KMOD_RCTRL; | |
450 break; | |
451 case SDLK_LSHIFT: | |
452 modstate &= ~KMOD_LSHIFT; | |
453 break; | |
454 case SDLK_RSHIFT: | |
455 modstate &= ~KMOD_RSHIFT; | |
456 break; | |
457 case SDLK_LALT: | |
458 modstate &= ~KMOD_LALT; | |
459 break; | |
460 case SDLK_RALT: | |
461 modstate &= ~KMOD_RALT; | |
462 break; | |
463 case SDLK_LMETA: | |
464 modstate &= ~KMOD_LMETA; | |
465 break; | |
466 case SDLK_RMETA: | |
467 modstate &= ~KMOD_RMETA; | |
468 break; | |
469 case SDLK_MODE: | |
470 modstate &= ~KMOD_MODE; | |
471 break; | |
472 default: | |
473 break; | |
474 } | |
475 keysym->mod = (SDLMod)modstate; | |
476 } | |
477 | |
478 /* Figure out what type of event this is */ | |
479 switch (state) { | |
480 case SDL_PRESSED: | |
481 event.type = SDL_KEYDOWN; | |
482 break; | |
483 case SDL_RELEASED: | |
484 event.type = SDL_KEYUP; | |
485 /* | |
486 * jk 991215 - Added | |
487 */ | |
1021
ddd058103e28
Date: Sun, 2 Jan 2005 18:36:09 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
488 if ( SDL_KeyRepeat.timestamp && |
ddd058103e28
Date: Sun, 2 Jan 2005 18:36:09 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
489 SDL_KeyRepeat.evt.key.keysym.sym == keysym->sym ) { |
0 | 490 SDL_KeyRepeat.timestamp = 0; |
491 } | |
492 break; | |
493 default: | |
494 /* Invalid state -- bail */ | |
495 return(0); | |
496 } | |
497 | |
1327 | 498 if ( keysym->sym != SDLK_UNKNOWN ) { |
499 /* Drop events that don't change state */ | |
500 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
|
501 #if 0 |
1283
f214b6fae45a
Date: Fri, 14 Jan 2005 21:52:46 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
1282
diff
changeset
|
502 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
|
503 #endif |
1327 | 504 return(0); |
505 } | |
0 | 506 |
1327 | 507 /* Update internal keyboard state */ |
508 SDL_ModState = (SDLMod)modstate; | |
509 SDL_KeyState[keysym->sym] = state; | |
510 } | |
0 | 511 |
512 /* Post the event, if desired */ | |
513 posted = 0; | |
514 if ( SDL_ProcessEvents[event.type] == SDL_ENABLE ) { | |
515 event.key.state = state; | |
516 event.key.keysym = *keysym; | |
223
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
517 /* |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
518 * jk 991215 - Added |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
519 */ |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
520 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
|
521 SDL_KeyRepeat.evt = event; |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
522 SDL_KeyRepeat.firsttime = 1; |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
523 SDL_KeyRepeat.timestamp=SDL_GetTicks(); |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
524 } |
0 | 525 if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) { |
526 posted = 1; | |
527 SDL_PushEvent(&event); | |
528 } | |
529 } | |
530 return(posted); | |
531 } | |
532 | |
533 /* | |
534 * jk 991215 - Added | |
535 */ | |
536 void SDL_CheckKeyRepeat(void) | |
537 { | |
538 if ( SDL_KeyRepeat.timestamp ) { | |
539 Uint32 now, interval; | |
540 | |
541 now = SDL_GetTicks(); | |
542 interval = (now - SDL_KeyRepeat.timestamp); | |
543 if ( SDL_KeyRepeat.firsttime ) { | |
544 if ( interval > (Uint32)SDL_KeyRepeat.delay ) { | |
545 SDL_KeyRepeat.timestamp = now; | |
546 SDL_KeyRepeat.firsttime = 0; | |
547 } | |
548 } else { | |
549 if ( interval > (Uint32)SDL_KeyRepeat.interval ) { | |
550 SDL_KeyRepeat.timestamp = now; | |
223
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
551 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
|
552 SDL_PushEvent(&SDL_KeyRepeat.evt); |
8d370608ba0a
Fixed key repeat interactions with event filters (thanks Elmar!)
Sam Lantinga <slouken@libsdl.org>
parents:
184
diff
changeset
|
553 } |
0 | 554 } |
555 } | |
556 } | |
557 } | |
558 | |
559 int SDL_EnableKeyRepeat(int delay, int interval) | |
560 { | |
122
8f33e95b43b6
Don't worry about a minimum repeat rate - let the user hang themselves...
Sam Lantinga <slouken@libsdl.org>
parents:
14
diff
changeset
|
561 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
|
562 SDL_SetError("keyboard repeat value less than zero"); |
0 | 563 return(-1); |
564 } | |
565 SDL_KeyRepeat.firsttime = 0; | |
566 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
|
567 SDL_KeyRepeat.interval = interval; |
0 | 568 SDL_KeyRepeat.timestamp = 0; |
569 return(0); | |
570 } | |
571 | |
1507 | 572 void SDL_GetKeyRepeat(int *delay, int *interval) |
573 { | |
574 *delay = SDL_KeyRepeat.delay; | |
575 *interval = SDL_KeyRepeat.interval; | |
576 } | |
577 |