e14743d1 |
1 | /* |
2 | SDL - Simple DirectMedia Layer |
3 | Copyright (C) 1997-2009 Sam Lantinga |
4 | Copyright (C) 2001 Hsieh-Fu Tsai |
5 | Copyright (C) 2002 Greg Haerr <greg@censoft.com> |
6 | |
7 | This library is free software; you can redistribute it and/or |
8 | modify it under the terms of the GNU Library General Public |
9 | License as published by the Free Software Foundation; either |
10 | version 2 of the License, or (at your option) any later version. |
11 | |
12 | This library is distributed in the hope that it will be useful, |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | Library General Public License for more details. |
16 | |
17 | You should have received a copy of the GNU Library General Public |
18 | License along with this library; if not, write to the Free |
19 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | |
21 | Sam Lantinga |
22 | slouken@libsdl.org |
23 | |
24 | Hsieh-Fu Tsai |
25 | clare@setabox.com |
26 | */ |
27 | #include "SDL_config.h" |
28 | |
29 | #include "SDL_keysym.h" |
30 | #include "../../events/SDL_events_c.h" |
31 | |
32 | #include "SDL_nxevents_c.h" |
33 | #include "SDL_nximage_c.h" |
34 | |
35 | // The translation tables from a nanox keysym to a SDL keysym |
36 | static SDLKey NX_NONASCII_keymap [MWKEY_LAST + 1] ; |
37 | |
38 | void NX_InitOSKeymap (_THIS) |
39 | { |
40 | int i ; |
41 | |
42 | Dprintf ("enter NX_InitOSKeymap\n") ; |
43 | |
44 | // Map the nanox scancodes to SDL keysyms |
45 | for (i = 0; i < SDL_arraysize (NX_NONASCII_keymap); ++ i) |
46 | NX_NONASCII_keymap [i] = SDLK_UNKNOWN ; |
47 | |
48 | NX_NONASCII_keymap [MWKEY_LEFT & 0xFF] = SDLK_LEFT ; |
49 | NX_NONASCII_keymap [MWKEY_RIGHT & 0xFF] = SDLK_RIGHT ; |
50 | NX_NONASCII_keymap [MWKEY_UP & 0xFF] = SDLK_UP ; |
51 | NX_NONASCII_keymap [MWKEY_DOWN & 0xFF] = SDLK_DOWN ; |
52 | NX_NONASCII_keymap [MWKEY_INSERT & 0xFF] = SDLK_INSERT ; |
53 | NX_NONASCII_keymap [MWKEY_DELETE & 0xFF] = SDLK_DELETE ; |
54 | NX_NONASCII_keymap [MWKEY_HOME & 0xFF] = SDLK_HOME ; |
55 | NX_NONASCII_keymap [MWKEY_END & 0xFF] = SDLK_END ; |
56 | NX_NONASCII_keymap [MWKEY_PAGEUP & 0xFF] = SDLK_PAGEUP ; |
57 | NX_NONASCII_keymap [MWKEY_PAGEDOWN & 0xFF] = SDLK_PAGEDOWN ; |
58 | |
59 | NX_NONASCII_keymap [MWKEY_KP0 & 0xFF] = SDLK_KP0 ; |
60 | NX_NONASCII_keymap [MWKEY_KP1 & 0xFF] = SDLK_KP1 ; |
61 | NX_NONASCII_keymap [MWKEY_KP2 & 0xFF] = SDLK_KP2 ; |
62 | NX_NONASCII_keymap [MWKEY_KP3 & 0xFF] = SDLK_KP3 ; |
63 | NX_NONASCII_keymap [MWKEY_KP4 & 0xFF] = SDLK_KP4 ; |
64 | NX_NONASCII_keymap [MWKEY_KP5 & 0xFF] = SDLK_KP5 ; |
65 | NX_NONASCII_keymap [MWKEY_KP6 & 0xFF] = SDLK_KP6 ; |
66 | NX_NONASCII_keymap [MWKEY_KP7 & 0xFF] = SDLK_KP7 ; |
67 | NX_NONASCII_keymap [MWKEY_KP8 & 0xFF] = SDLK_KP8 ; |
68 | NX_NONASCII_keymap [MWKEY_KP9 & 0xFF] = SDLK_KP9 ; |
69 | NX_NONASCII_keymap [MWKEY_KP_PERIOD & 0xFF] = SDLK_KP_PERIOD ; |
70 | NX_NONASCII_keymap [MWKEY_KP_DIVIDE & 0xFF] = SDLK_KP_DIVIDE ; |
71 | NX_NONASCII_keymap [MWKEY_KP_MULTIPLY & 0xFF] = SDLK_KP_MULTIPLY ; |
72 | NX_NONASCII_keymap [MWKEY_KP_MINUS & 0xFF] = SDLK_KP_MINUS ; |
73 | NX_NONASCII_keymap [MWKEY_KP_PLUS & 0xFF] = SDLK_KP_PLUS ; |
74 | NX_NONASCII_keymap [MWKEY_KP_ENTER & 0xFF] = SDLK_KP_ENTER ; |
75 | NX_NONASCII_keymap [MWKEY_KP_EQUALS & 0xFF] = SDLK_KP_EQUALS ; |
76 | |
77 | NX_NONASCII_keymap [MWKEY_F1 & 0xFF] = SDLK_F1 ; |
78 | NX_NONASCII_keymap [MWKEY_F2 & 0xFF] = SDLK_F2 ; |
79 | NX_NONASCII_keymap [MWKEY_F3 & 0xFF] = SDLK_F3 ; |
80 | NX_NONASCII_keymap [MWKEY_F4 & 0xFF] = SDLK_F4 ; |
81 | NX_NONASCII_keymap [MWKEY_F5 & 0xFF] = SDLK_F5 ; |
82 | NX_NONASCII_keymap [MWKEY_F6 & 0xFF] = SDLK_F6 ; |
83 | NX_NONASCII_keymap [MWKEY_F7 & 0xFF] = SDLK_F7 ; |
84 | NX_NONASCII_keymap [MWKEY_F8 & 0xFF] = SDLK_F8 ; |
85 | NX_NONASCII_keymap [MWKEY_F9 & 0xFF] = SDLK_F9 ; |
86 | NX_NONASCII_keymap [MWKEY_F10 & 0xFF] = SDLK_F10 ; |
87 | NX_NONASCII_keymap [MWKEY_F11 & 0xFF] = SDLK_F11 ; |
88 | NX_NONASCII_keymap [MWKEY_F12 & 0xFF] = SDLK_F12 ; |
89 | |
90 | NX_NONASCII_keymap [MWKEY_NUMLOCK & 0xFF] = SDLK_NUMLOCK ; |
91 | NX_NONASCII_keymap [MWKEY_CAPSLOCK & 0xFF] = SDLK_CAPSLOCK ; |
92 | NX_NONASCII_keymap [MWKEY_SCROLLOCK & 0xFF] = SDLK_SCROLLOCK ; |
93 | NX_NONASCII_keymap [MWKEY_LSHIFT & 0xFF] = SDLK_LSHIFT ; |
94 | NX_NONASCII_keymap [MWKEY_RSHIFT & 0xFF] = SDLK_RSHIFT ; |
95 | NX_NONASCII_keymap [MWKEY_LCTRL & 0xFF] = SDLK_LCTRL ; |
96 | NX_NONASCII_keymap [MWKEY_RCTRL & 0xFF] = SDLK_RCTRL ; |
97 | NX_NONASCII_keymap [MWKEY_LALT & 0xFF] = SDLK_LALT ; |
98 | NX_NONASCII_keymap [MWKEY_RALT & 0xFF] = SDLK_RALT ; |
99 | NX_NONASCII_keymap [MWKEY_LMETA & 0xFF] = SDLK_LMETA ; |
100 | NX_NONASCII_keymap [MWKEY_RMETA & 0xFF] = SDLK_RMETA ; |
101 | NX_NONASCII_keymap [MWKEY_ALTGR & 0xFF] = SDLK_MODE ; |
102 | |
103 | NX_NONASCII_keymap [MWKEY_PRINT & 0xFF] = SDLK_PRINT ; |
104 | NX_NONASCII_keymap [MWKEY_SYSREQ & 0xFF] = SDLK_SYSREQ ; |
105 | NX_NONASCII_keymap [MWKEY_PAUSE & 0xFF] = SDLK_PAUSE ; |
106 | NX_NONASCII_keymap [MWKEY_BREAK & 0xFF] = SDLK_BREAK ; |
107 | NX_NONASCII_keymap [MWKEY_MENU & 0xFF] = SDLK_MENU ; |
108 | |
109 | Dprintf ("leave NX_InitOSKeymap\n") ; |
110 | } |
111 | |
112 | SDL_keysym * NX_TranslateKey (GR_EVENT_KEYSTROKE * keystroke, SDL_keysym * keysym) |
113 | { |
114 | GR_KEY ch = keystroke -> ch ; |
115 | |
116 | Dprintf ("enter NX_TranslateKey\n") ; |
117 | |
118 | keysym -> scancode = keystroke -> scancode ; |
119 | keysym -> sym = SDLK_UNKNOWN ; |
120 | |
121 | if (ch & MWKEY_NONASCII_MASK) { |
122 | keysym -> sym = NX_NONASCII_keymap [ch & 0xFF] ; |
123 | } else { |
124 | keysym -> sym = ch & 0x7F ; |
125 | } |
126 | |
127 | keysym -> mod = KMOD_NONE ; |
128 | |
129 | #if 1 // Retrieve more mode information |
130 | { |
131 | GR_KEYMOD mod = keystroke -> modifiers ; |
132 | |
133 | if (mod & MWKMOD_LSHIFT) |
134 | keysym -> mod |= KMOD_LSHIFT ; |
135 | if (mod & MWKMOD_RSHIFT) |
136 | keysym -> mod |= KMOD_RSHIFT ; |
137 | if (mod & MWKMOD_LCTRL) |
138 | keysym -> mod |= KMOD_LCTRL ; |
139 | if (mod & MWKMOD_RCTRL) |
140 | keysym -> mod |= KMOD_RCTRL ; |
141 | if (mod & MWKMOD_LALT) |
142 | keysym -> mod |= KMOD_LALT ; |
143 | if (mod & MWKMOD_RALT) |
144 | keysym -> mod |= KMOD_RALT ; |
145 | if (mod & MWKMOD_LMETA) |
146 | keysym -> mod |= KMOD_LMETA ; |
147 | if (mod & MWKMOD_RMETA) |
148 | keysym -> mod |= KMOD_RMETA ; |
149 | if (mod & MWKMOD_NUM) |
150 | keysym -> mod |= KMOD_NUM ; |
151 | if (mod & MWKMOD_CAPS) |
152 | keysym -> mod |= KMOD_CAPS ; |
153 | if (mod & MWKMOD_ALTGR) |
154 | keysym -> mod |= KMOD_MODE ; |
155 | } |
156 | #endif |
157 | |
158 | keysym -> unicode = ch ; |
159 | |
160 | Dprintf ("leave NX_TranslateKey\n") ; |
161 | return keysym ; |
162 | } |
163 | |
164 | static int check_boundary (_THIS, int x, int y) |
165 | { |
166 | if (x < OffsetX || y < OffsetY || x > OffsetX + this -> screen -> w || |
167 | y > OffsetY + this -> screen -> h) |
168 | return 0 ; |
169 | |
170 | return 1 ; |
171 | } |
172 | |
173 | void NX_PumpEvents (_THIS) |
174 | { |
175 | GR_EVENT event ; |
176 | static GR_BUTTON last_button_down = 0 ; |
177 | |
178 | GrCheckNextEvent (& event) ; |
179 | while (event.type != GR_EVENT_TYPE_NONE) { |
180 | |
181 | // dispatch event |
182 | switch (event.type) { |
183 | case GR_EVENT_TYPE_MOUSE_ENTER : |
184 | { |
185 | Dprintf ("mouse enter\n") ; |
186 | SDL_PrivateAppActive (1, SDL_APPMOUSEFOCUS) ; |
187 | break ; |
188 | } |
189 | |
190 | case GR_EVENT_TYPE_MOUSE_EXIT : |
191 | { |
192 | Dprintf ("mouse exit\n") ; |
193 | SDL_PrivateAppActive (0, SDL_APPMOUSEFOCUS) ; |
194 | break ; |
195 | } |
196 | |
197 | case GR_EVENT_TYPE_FOCUS_IN : |
198 | { |
199 | Dprintf ("focus in\n") ; |
200 | SDL_PrivateAppActive (1, SDL_APPINPUTFOCUS) ; |
201 | break ; |
202 | } |
203 | |
204 | case GR_EVENT_TYPE_FOCUS_OUT : |
205 | { |
206 | Dprintf ("focus out\n") ; |
207 | SDL_PrivateAppActive (0, SDL_APPINPUTFOCUS) ; |
208 | break ; |
209 | } |
210 | |
211 | case GR_EVENT_TYPE_MOUSE_MOTION : |
212 | { |
213 | Dprintf ("mouse motion\n") ; |
214 | |
215 | if (SDL_VideoSurface) { |
216 | if (currently_fullscreen) { |
217 | if (check_boundary (this, event.button.x, event.button.y)) { |
218 | SDL_PrivateMouseMotion (0, 0, event.button.x - OffsetX, |
219 | event.button.y - OffsetY) ; |
220 | } |
221 | } else { |
222 | SDL_PrivateMouseMotion (0, 0, event.button.x, event.button.y) ; |
223 | } |
224 | } |
225 | break ; |
226 | } |
227 | |
228 | case GR_EVENT_TYPE_BUTTON_DOWN : |
229 | { |
230 | int button = event.button.buttons ; |
231 | |
232 | Dprintf ("button down\n") ; |
233 | |
234 | switch (button) { |
235 | case MWBUTTON_L : |
236 | button = 1 ; |
237 | break ; |
238 | case MWBUTTON_M : |
239 | button = 2 ; |
240 | break ; |
241 | case MWBUTTON_R : |
242 | button = 3 ; |
243 | break ; |
244 | default : |
245 | button = 0 ; |
246 | } |
247 | last_button_down = button ; |
248 | |
249 | if (currently_fullscreen) { |
250 | if (check_boundary (this, event.button.x, event.button.y)) { |
251 | SDL_PrivateMouseButton (SDL_PRESSED, button, |
252 | event.button.x - OffsetX, event.button.y - OffsetY) ; |
253 | } |
254 | } else { |
255 | SDL_PrivateMouseButton (SDL_PRESSED, button, |
256 | event.button.x, event.button.y) ; |
257 | } |
258 | break ; |
259 | } |
260 | |
261 | // do not konw which button is released |
262 | case GR_EVENT_TYPE_BUTTON_UP : |
263 | { |
264 | Dprintf ("button up\n") ; |
265 | |
266 | if (currently_fullscreen) { |
267 | if (check_boundary (this, event.button.x, event.button.y)) { |
268 | SDL_PrivateMouseButton (SDL_RELEASED, last_button_down, |
269 | event.button.x - OffsetX, event.button.y - OffsetY) ; |
270 | } |
271 | } else { |
272 | SDL_PrivateMouseButton (SDL_RELEASED, last_button_down, |
273 | event.button.x, event.button.y) ; |
274 | } |
275 | last_button_down = 0 ; |
276 | break ; |
277 | } |
278 | |
279 | case GR_EVENT_TYPE_KEY_DOWN : |
280 | { |
281 | SDL_keysym keysym ; |
282 | |
283 | Dprintf ("key down\n") ; |
284 | SDL_PrivateKeyboard (SDL_PRESSED, |
285 | NX_TranslateKey (& event.keystroke, & keysym)) ; |
286 | break ; |
287 | } |
288 | |
289 | case GR_EVENT_TYPE_KEY_UP : |
290 | { |
291 | SDL_keysym keysym ; |
292 | |
293 | Dprintf ("key up\n") ; |
294 | SDL_PrivateKeyboard (SDL_RELEASED, |
295 | NX_TranslateKey (& event.keystroke, & keysym)) ; |
296 | break ; |
297 | } |
298 | |
299 | case GR_EVENT_TYPE_CLOSE_REQ : |
300 | { |
301 | Dprintf ("close require\n") ; |
302 | SDL_PrivateQuit () ; |
303 | break ; |
304 | } |
305 | |
306 | case GR_EVENT_TYPE_EXPOSURE : |
307 | { |
308 | Dprintf ("event_type_exposure\n") ; |
309 | if (SDL_VideoSurface) { |
310 | NX_RefreshDisplay (this) ;//, & event.exposure) ; |
311 | } |
312 | break ; |
313 | } |
314 | |
315 | case GR_EVENT_TYPE_UPDATE : |
316 | { |
317 | switch (event.update.utype) { |
318 | case GR_UPDATE_MAP : |
319 | { |
320 | Dprintf ("GR_UPDATE_MAP\n") ; |
321 | // If we're not active, make ourselves active |
322 | if (!(SDL_GetAppState () & SDL_APPACTIVE)) { |
323 | // Send an internal activate event |
324 | SDL_PrivateAppActive (1, SDL_APPACTIVE) ; |
325 | } |
326 | if (SDL_VideoSurface) { |
327 | NX_RefreshDisplay (this) ; |
328 | } |
329 | break ; |
330 | } |
331 | |
332 | case GR_UPDATE_UNMAP : |
333 | case GR_UPDATE_UNMAPTEMP : |
334 | { |
335 | Dprintf ("GR_UPDATE_UNMAP or GR_UPDATE_UNMAPTEMP\n") ; |
336 | // If we're active, make ourselves inactive |
337 | if (SDL_GetAppState () & SDL_APPACTIVE) { |
338 | // Send an internal deactivate event |
339 | SDL_PrivateAppActive (0, SDL_APPACTIVE | SDL_APPINPUTFOCUS) ; |
340 | } |
341 | break ; |
342 | } |
343 | |
344 | case GR_UPDATE_SIZE : |
345 | { |
346 | Dprintf ("GR_UPDATE_SIZE\n") ; |
347 | SDL_PrivateResize (event.update.width, event.update.height) ; |
348 | break ; |
349 | } |
350 | |
351 | case GR_UPDATE_MOVE : |
352 | case GR_UPDATE_REPARENT : |
353 | { |
354 | Dprintf ("GR_UPDATE_MOVE or GR_UPDATE_REPARENT\n") ; |
355 | #ifdef ENABLE_NANOX_DIRECT_FB |
356 | if (Clientfb) { |
357 | /* Get current window position and fb pointer*/ |
358 | if (currently_fullscreen) |
359 | GrGetWindowFBInfo(FSwindow, &fbinfo); |
360 | else |
361 | GrGetWindowFBInfo(SDL_Window, &fbinfo); |
362 | } |
363 | #endif |
364 | break ; |
365 | } |
366 | |
367 | default : |
368 | Dprintf ("unknown GR_EVENT_TYPE_UPDATE\n") ; |
369 | break ; |
370 | } |
371 | break ; |
372 | } |
373 | |
374 | default : |
375 | { |
376 | Dprintf ("pump event default\n") ; |
377 | } |
378 | } |
379 | |
380 | GrCheckNextEvent (& event) ; |
381 | } |
382 | } |