Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
403 lines (347 loc) · 13.6 KB

SDL_nxevents.c

File metadata and controls

403 lines (347 loc) · 13.6 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Jan 4, 2004
Jan 4, 2004
3
Copyright (C) 1997-2004 Sam Lantinga
4
Copyright (C) 2001 Hsieh-Fu Tsai
Aug 25, 2002
Aug 25, 2002
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
Dec 14, 2001
Dec 14, 2001
22
slouken@libsdl.org
23
24
25
26
Hsieh-Fu Tsai
clare@setabox.com
*/
Feb 21, 2006
Feb 21, 2006
27
#include "SDL_config.h"
28
29
#include "SDL_keysym.h"
Feb 16, 2006
Feb 16, 2006
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
Jul 10, 2006
Jul 10, 2006
36
static SDLKey NX_NONASCII_keymap[MWKEY_LAST + 1];
Jul 10, 2006
Jul 10, 2006
38
39
void
NX_InitOSKeymap(_THIS)
Jul 10, 2006
Jul 10, 2006
41
int i;
Jul 10, 2006
Jul 10, 2006
43
Dprintf("enter NX_InitOSKeymap\n");
44
45
// Map the nanox scancodes to SDL keysyms
Jul 10, 2006
Jul 10, 2006
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");
Jul 10, 2006
Jul 10, 2006
113
114
SDL_keysym *
NX_TranslateKey(GR_EVENT_KEYSTROKE * keystroke, SDL_keysym * keysym)
Jul 10, 2006
Jul 10, 2006
116
GR_KEY ch = keystroke->ch;
Jul 10, 2006
Jul 10, 2006
118
Dprintf("enter NX_TranslateKey\n");
Jul 10, 2006
Jul 10, 2006
120
121
keysym->scancode = keystroke->scancode;
keysym->sym = SDLK_UNKNOWN;
122
123
if (ch & MWKEY_NONASCII_MASK) {
Jul 10, 2006
Jul 10, 2006
124
keysym->sym = NX_NONASCII_keymap[ch & 0xFF];
125
} else {
Jul 10, 2006
Jul 10, 2006
126
keysym->sym = ch & 0x7F;
Jul 10, 2006
Jul 10, 2006
129
130
131
keysym->mod = KMOD_NONE;
#if 1 // Retrieve more mode information
Jul 10, 2006
Jul 10, 2006
133
GR_KEYMOD mod = keystroke->modifiers;
134
135
if (mod & MWKMOD_LSHIFT)
Jul 10, 2006
Jul 10, 2006
136
keysym->mod |= KMOD_LSHIFT;
137
if (mod & MWKMOD_RSHIFT)
Jul 10, 2006
Jul 10, 2006
138
keysym->mod |= KMOD_RSHIFT;
139
if (mod & MWKMOD_LCTRL)
Jul 10, 2006
Jul 10, 2006
140
keysym->mod |= KMOD_LCTRL;
141
if (mod & MWKMOD_RCTRL)
Jul 10, 2006
Jul 10, 2006
142
keysym->mod |= KMOD_RCTRL;
143
if (mod & MWKMOD_LALT)
Jul 10, 2006
Jul 10, 2006
144
keysym->mod |= KMOD_LALT;
145
if (mod & MWKMOD_RALT)
Jul 10, 2006
Jul 10, 2006
146
keysym->mod |= KMOD_RALT;
147
if (mod & MWKMOD_LMETA)
Jul 10, 2006
Jul 10, 2006
148
keysym->mod |= KMOD_LMETA;
149
if (mod & MWKMOD_RMETA)
Jul 10, 2006
Jul 10, 2006
150
keysym->mod |= KMOD_RMETA;
151
if (mod & MWKMOD_NUM)
Jul 10, 2006
Jul 10, 2006
152
keysym->mod |= KMOD_NUM;
153
if (mod & MWKMOD_CAPS)
Jul 10, 2006
Jul 10, 2006
154
keysym->mod |= KMOD_CAPS;
155
if (mod & MWKMOD_ALTGR)
Jul 10, 2006
Jul 10, 2006
156
keysym->mod |= KMOD_MODE;
157
158
159
}
#endif
Jul 10, 2006
Jul 10, 2006
160
keysym->unicode = ch;
Jul 10, 2006
Jul 10, 2006
162
163
Dprintf("leave NX_TranslateKey\n");
return keysym;
Jul 10, 2006
Jul 10, 2006
166
167
static int
check_boundary(_THIS, int x, int y)
Jul 10, 2006
Jul 10, 2006
169
170
171
172
173
if (x < OffsetX || y < OffsetY || x > OffsetX + this->screen->w ||
y > OffsetY + this->screen->h)
return 0;
return 1;
Jul 10, 2006
Jul 10, 2006
176
177
void
NX_PumpEvents(_THIS)
Jul 10, 2006
Jul 10, 2006
179
180
GR_EVENT event;
static GR_BUTTON last_button_down = 0;
Jul 10, 2006
Jul 10, 2006
182
GrCheckNextEvent(&event);
183
184
185
186
while (event.type != GR_EVENT_TYPE_NONE) {
// dispatch event
switch (event.type) {
Jul 10, 2006
Jul 10, 2006
187
case GR_EVENT_TYPE_MOUSE_ENTER:
Jul 10, 2006
Jul 10, 2006
189
190
191
Dprintf("mouse enter\n");
SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
break;
Jul 10, 2006
Jul 10, 2006
194
case GR_EVENT_TYPE_MOUSE_EXIT:
Jul 10, 2006
Jul 10, 2006
196
197
198
Dprintf("mouse exit\n");
SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
break;
Jul 10, 2006
Jul 10, 2006
201
case GR_EVENT_TYPE_FOCUS_IN:
Jul 10, 2006
Jul 10, 2006
203
204
205
Dprintf("focus in\n");
SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS);
break;
Jul 10, 2006
Jul 10, 2006
208
case GR_EVENT_TYPE_FOCUS_OUT:
Jul 10, 2006
Jul 10, 2006
210
211
212
Dprintf("focus out\n");
SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS);
break;
Jul 10, 2006
Jul 10, 2006
215
216
217
case GR_EVENT_TYPE_MOUSE_MOTION:
{
Dprintf("mouse motion\n");
218
219
220
if (SDL_VideoSurface) {
if (currently_fullscreen) {
Jul 10, 2006
Jul 10, 2006
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 {
Jul 10, 2006
Jul 10, 2006
229
230
SDL_PrivateMouseMotion(0, 0, event.button.x,
event.button.y);
231
232
}
}
Jul 10, 2006
Jul 10, 2006
233
break;
Jul 10, 2006
Jul 10, 2006
236
case GR_EVENT_TYPE_BUTTON_DOWN:
Jul 10, 2006
Jul 10, 2006
238
239
240
int button = event.button.buttons;
Dprintf("button down\n");
241
242
switch (button) {
Jul 10, 2006
Jul 10, 2006
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;
Jul 10, 2006
Jul 10, 2006
255
256
last_button_down = button;
257
if (currently_fullscreen) {
Jul 10, 2006
Jul 10, 2006
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 {
Jul 10, 2006
Jul 10, 2006
265
266
SDL_PrivateMouseButton(SDL_PRESSED, button,
event.button.x, event.button.y);
Jul 10, 2006
Jul 10, 2006
268
break;
269
270
271
}
// do not konw which button is released
Jul 10, 2006
Jul 10, 2006
272
273
274
case GR_EVENT_TYPE_BUTTON_UP:
{
Dprintf("button up\n");
275
276
if (currently_fullscreen) {
Jul 10, 2006
Jul 10, 2006
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 {
Jul 10, 2006
Jul 10, 2006
285
286
287
SDL_PrivateMouseButton(SDL_RELEASED,
last_button_down,
event.button.x, event.button.y);
Jul 10, 2006
Jul 10, 2006
289
290
last_button_down = 0;
break;
Jul 10, 2006
Jul 10, 2006
293
case GR_EVENT_TYPE_KEY_DOWN:
Jul 10, 2006
Jul 10, 2006
295
SDL_keysym keysym;
Jul 10, 2006
Jul 10, 2006
297
298
299
300
301
Dprintf("key down\n");
SDL_PrivateKeyboard(SDL_PRESSED,
NX_TranslateKey(&event.keystroke,
&keysym));
break;
Jul 10, 2006
Jul 10, 2006
304
case GR_EVENT_TYPE_KEY_UP:
Jul 10, 2006
Jul 10, 2006
306
SDL_keysym keysym;
Jul 10, 2006
Jul 10, 2006
308
309
310
311
312
Dprintf("key up\n");
SDL_PrivateKeyboard(SDL_RELEASED,
NX_TranslateKey(&event.keystroke,
&keysym));
break;
Jul 10, 2006
Jul 10, 2006
315
case GR_EVENT_TYPE_CLOSE_REQ:
Jul 10, 2006
Jul 10, 2006
317
318
319
Dprintf("close require\n");
SDL_PrivateQuit();
break;
Jul 10, 2006
Jul 10, 2006
322
case GR_EVENT_TYPE_EXPOSURE:
Jul 10, 2006
Jul 10, 2006
324
Dprintf("event_type_exposure\n");
325
if (SDL_VideoSurface) {
Jul 10, 2006
Jul 10, 2006
326
NX_RefreshDisplay(this); //, & event.exposure) ;
Jul 10, 2006
Jul 10, 2006
328
break;
Jul 10, 2006
Jul 10, 2006
331
case GR_EVENT_TYPE_UPDATE:
332
333
{
switch (event.update.utype) {
Jul 10, 2006
Jul 10, 2006
334
case GR_UPDATE_MAP:
Jul 10, 2006
Jul 10, 2006
336
Dprintf("GR_UPDATE_MAP\n");
337
// If we're not active, make ourselves active
Jul 10, 2006
Jul 10, 2006
338
if (!(SDL_GetAppState() & SDL_APPACTIVE)) {
339
// Send an internal activate event
Jul 10, 2006
Jul 10, 2006
340
SDL_PrivateAppActive(1, SDL_APPACTIVE);
341
342
}
if (SDL_VideoSurface) {
Jul 10, 2006
Jul 10, 2006
343
NX_RefreshDisplay(this);
Jul 10, 2006
Jul 10, 2006
345
break;
Jul 10, 2006
Jul 10, 2006
347
348
349
case GR_UPDATE_UNMAP:
case GR_UPDATE_UNMAPTEMP:
Jul 10, 2006
Jul 10, 2006
351
Dprintf("GR_UPDATE_UNMAP or GR_UPDATE_UNMAPTEMP\n");
352
// If we're active, make ourselves inactive
Jul 10, 2006
Jul 10, 2006
353
if (SDL_GetAppState() & SDL_APPACTIVE) {
354
// Send an internal deactivate event
Jul 10, 2006
Jul 10, 2006
355
356
357
SDL_PrivateAppActive(0,
SDL_APPACTIVE |
SDL_APPINPUTFOCUS);
Jul 10, 2006
Jul 10, 2006
359
break;
Jul 10, 2006
Jul 10, 2006
361
362
case GR_UPDATE_SIZE:
Jul 10, 2006
Jul 10, 2006
364
365
366
367
Dprintf("GR_UPDATE_SIZE\n");
SDL_PrivateResize(event.update.width,
event.update.height);
break;
Aug 25, 2002
Aug 25, 2002
369
Jul 10, 2006
Jul 10, 2006
370
371
case GR_UPDATE_MOVE:
case GR_UPDATE_REPARENT:
Aug 25, 2002
Aug 25, 2002
372
{
Jul 10, 2006
Jul 10, 2006
373
Dprintf("GR_UPDATE_MOVE or GR_UPDATE_REPARENT\n");
Aug 25, 2002
Aug 25, 2002
374
#ifdef ENABLE_NANOX_DIRECT_FB
Jul 10, 2006
Jul 10, 2006
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);
}
Aug 25, 2002
Aug 25, 2002
382
#endif
Jul 10, 2006
Jul 10, 2006
383
break;
Aug 25, 2002
Aug 25, 2002
384
}
Jul 10, 2006
Jul 10, 2006
385
386
387
388
default:
Dprintf("unknown GR_EVENT_TYPE_UPDATE\n");
break;
Jul 10, 2006
Jul 10, 2006
390
break;
Jul 10, 2006
Jul 10, 2006
392
393
default:
Jul 10, 2006
Jul 10, 2006
395
Dprintf("pump event default\n");
396
397
398
}
}
Jul 10, 2006
Jul 10, 2006
399
GrCheckNextEvent(&event);
Jul 10, 2006
Jul 10, 2006
402
403
/* vi: set ts=4 sw=4 expandtab: */