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