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