This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_DirectFB_events.c
749 lines (670 loc) · 27.8 KB
1
/*
2
SDL - Simple DirectMedia Layer
3
Copyright (C) 1997-2011 Sam Lantinga
4
5
6
7
8
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
13
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
Lesser General Public License for more details.
14
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
20
Sam Lantinga
slouken@libsdl.org
21
22
23
SDL1.3 DirectFB driver by couriersud@arcor.de
24
25
26
27
*/
/* Handle the event stream, converting DirectFB input events into SDL events */
28
29
30
#include "SDL_DirectFB_video.h"
#include "SDL_DirectFB_window.h"
#include "SDL_DirectFB_modes.h"
31
32
33
34
#include "SDL_syswm.h"
#include "../../events/SDL_mouse_c.h"
35
#include "../../events/SDL_keyboard_c.h"
36
37
#include "../../events/SDL_windowevents_c.h"
#include "../../events/SDL_events_c.h"
38
#include "../../events/scancodes_linux.h"
39
40
#include "../../events/scancodes_xfree86.h"
41
42
#include "SDL_DirectFB_events.h"
43
#if USE_MULTI_API
44
45
#define SDL_SendMouseMotion_ex(w, id, relative, x, y, p) SDL_SendMouseMotion(id, relative, x, y, p)
#define SDL_SendMouseButton_ex(w, id, state, button) SDL_SendMouseButton(id, state, button)
46
47
48
#define SDL_SendKeyboardKey_ex(id, state, scancode) SDL_SendKeyboardKey(id, state, scancode)
#define SDL_SendKeyboardText_ex(id, text) SDL_SendKeyboardText(id, text)
#else
49
50
#define SDL_SendMouseMotion_ex(w, id, relative, x, y, p) SDL_SendMouseMotion(w, relative, x, y)
#define SDL_SendMouseButton_ex(w, id, state, button) SDL_SendMouseButton(w, state, button)
51
52
53
54
#define SDL_SendKeyboardKey_ex(id, state, scancode) SDL_SendKeyboardKey(state, scancode)
#define SDL_SendKeyboardText_ex(id, text) SDL_SendKeyboardText(text)
#endif
55
56
57
58
59
60
61
typedef struct _cb_data cb_data;
struct _cb_data
{
DFB_DeviceData *devdata;
int sys_ids;
int sys_kbd;
};
62
63
/* The translation tables from a DirectFB keycode to a SDL keysym */
64
static SDL_Scancode oskeymap[256];
65
66
67
68
69
70
static SDL_Keysym *DirectFB_TranslateKey(_THIS, DFBWindowEvent * evt,
SDL_Keysym * keysym);
static SDL_Keysym *DirectFB_TranslateKeyInputEvent(_THIS, DFBInputEvent * evt,
SDL_Keysym * keysym);
71
72
static void DirectFB_InitOSKeymap(_THIS, SDL_Scancode * keypmap, int numkeys);
73
static int DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button);
74
75
static void UnicodeToUtf8( Uint16 w , char *utf8buf)
76
{
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
unsigned char *utf8s = (unsigned char *) utf8buf;
if ( w < 0x0080 ) {
utf8s[0] = ( unsigned char ) w;
utf8s[1] = 0;
}
else if ( w < 0x0800 ) {
utf8s[0] = 0xc0 | (( w ) >> 6 );
utf8s[1] = 0x80 | (( w ) & 0x3f );
utf8s[2] = 0;
}
else {
utf8s[0] = 0xe0 | (( w ) >> 12 );
utf8s[1] = 0x80 | (( ( w ) >> 6 ) & 0x3f );
utf8s[2] = 0x80 | (( w ) & 0x3f );
utf8s[3] = 0;
}
94
95
}
96
static void
97
FocusAllMice(_THIS, SDL_Window *window)
98
{
99
#if USE_MULTI_API
100
101
102
103
104
SDL_DFB_DEVICEDATA(_this);
int index;
for (index = 0; index < devdata->num_mice; index++)
SDL_SetMouseFocus(devdata->mouse_id[index], id);
105
106
107
#else
SDL_SetMouseFocus(window);
#endif
108
109
110
111
}
static void
112
FocusAllKeyboards(_THIS, SDL_Window *window)
113
{
114
#if USE_MULTI_API
115
116
117
118
119
SDL_DFB_DEVICEDATA(_this);
int index;
for (index = 0; index < devdata->num_keyboard; index++)
SDL_SetKeyboardFocus(index, id);
120
121
122
#else
SDL_SetKeyboardFocus(window);
#endif
123
124
125
126
127
}
static void
MotionAllMice(_THIS, int x, int y)
{
128
#if USE_MULTI_API
129
130
131
132
133
134
135
136
137
SDL_DFB_DEVICEDATA(_this);
int index;
for (index = 0; index < devdata->num_mice; index++) {
SDL_Mouse *mouse = SDL_GetMouse(index);
mouse->x = mouse->last_x = x;
mouse->y = mouse->last_y = y;
//SDL_SendMouseMotion(devdata->mouse_id[index], 0, x, y, 0);
}
138
#endif
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
}
static int
KbdIndex(_THIS, int id)
{
SDL_DFB_DEVICEDATA(_this);
int index;
for (index = 0; index < devdata->num_keyboard; index++) {
if (devdata->keyboard[index].id == id)
return index;
}
return -1;
}
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
static int
ClientXY(DFB_WindowData * p, int *x, int *y)
{
int cx, cy;
cx = *x;
cy = *y;
cx -= p->client.x;
cy -= p->client.y;
if (cx < 0 || cy < 0)
return 0;
if (cx >= p->client.w || cy >= p->client.h)
return 0;
*x = cx;
*y = cy;
return 1;
}
static void
175
ProcessWindowEvent(_THIS, SDL_Window *sdlwin, DFBWindowEvent * evt)
176
177
{
SDL_DFB_DEVICEDATA(_this);
178
SDL_DFB_WINDOWDATA(sdlwin);
179
SDL_Keysym keysym;
180
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE];
181
182
183
184
if (evt->clazz == DFEC_WINDOW) {
switch (evt->type) {
case DWET_BUTTONDOWN:
185
if (ClientXY(windata, &evt->x, &evt->y)) {
186
if (!devdata->use_linux_input) {
187
SDL_SendMouseMotion_ex(sdlwin, devdata->mouse_id[0], 0, evt->x,
188
evt->y, 0);
189
SDL_SendMouseButton_ex(sdlwin, devdata->mouse_id[0],
190
191
192
193
194
195
196
197
198
SDL_PRESSED,
DirectFB_TranslateButton
(evt->button));
} else {
MotionAllMice(_this, evt->x, evt->y);
}
}
break;
case DWET_BUTTONUP:
199
if (ClientXY(windata, &evt->x, &evt->y)) {
200
if (!devdata->use_linux_input) {
201
SDL_SendMouseMotion_ex(sdlwin, devdata->mouse_id[0], 0, evt->x,
202
evt->y, 0);
203
SDL_SendMouseButton_ex(sdlwin, devdata->mouse_id[0],
204
205
206
207
208
209
210
211
212
SDL_RELEASED,
DirectFB_TranslateButton
(evt->button));
} else {
MotionAllMice(_this, evt->x, evt->y);
}
}
break;
case DWET_MOTION:
213
if (ClientXY(windata, &evt->x, &evt->y)) {
214
if (!devdata->use_linux_input) {
215
216
if (!(sdlwin->flags & SDL_WINDOW_INPUT_GRABBED))
SDL_SendMouseMotion_ex(sdlwin, devdata->mouse_id[0], 0,
217
218
219
220
221
222
223
224
225
226
227
evt->x, evt->y, 0);
} else {
/* relative movements are not exact!
* This code should limit the number of events sent.
* However it kills MAME axis recognition ... */
static int cnt = 0;
if (1 && ++cnt > 20) {
MotionAllMice(_this, evt->x, evt->y);
cnt = 0;
}
}
228
229
if (!(sdlwin->flags & SDL_WINDOW_MOUSE_FOCUS))
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_ENTER, 0,
230
0);
231
232
233
234
235
}
break;
case DWET_KEYDOWN:
if (!devdata->use_linux_input) {
DirectFB_TranslateKey(_this, evt, &keysym);
236
//printf("Scancode %d %d %d\n", keysym.scancode, evt->key_code, evt->key_id);
237
SDL_SendKeyboardKey_ex(0, SDL_PRESSED, keysym.scancode);
238
if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) {
239
240
SDL_zero(text);
UnicodeToUtf8(keysym.unicode, text);
241
if (*text) {
242
SDL_SendKeyboardText_ex(0, text);
243
244
245
246
247
248
249
}
}
}
break;
case DWET_KEYUP:
if (!devdata->use_linux_input) {
DirectFB_TranslateKey(_this, evt, &keysym);
250
SDL_SendKeyboardKey_ex(0, SDL_RELEASED, keysym.scancode);
251
252
253
}
break;
case DWET_POSITION:
254
255
if (ClientXY(windata, &evt->x, &evt->y)) {
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_MOVED,
256
257
258
259
evt->x, evt->y);
}
break;
case DWET_POSITION_SIZE:
260
261
if (ClientXY(windata, &evt->x, &evt->y)) {
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_MOVED,
262
263
264
265
266
evt->x, evt->y);
}
/* fall throught */
case DWET_SIZE:
// FIXME: what about < 0
267
evt->w -= (windata->theme.right_size + windata->theme.left_size);
268
evt->h -=
269
270
271
(windata->theme.top_size + windata->theme.bottom_size +
windata->theme.caption_size);
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_RESIZED,
272
273
274
evt->w, evt->h);
break;
case DWET_CLOSE:
275
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_CLOSE, 0, 0);
276
277
break;
case DWET_GOTFOCUS:
278
279
280
DirectFB_SetContext(_this, sdlwin);
FocusAllKeyboards(_this, sdlwin);
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_FOCUS_GAINED,
281
282
283
0, 0);
break;
case DWET_LOSTFOCUS:
284
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);
285
286
287
288
FocusAllKeyboards(_this, 0);
break;
case DWET_ENTER:
/* SDL_DirectFB_ReshowCursor(_this, 0); */
289
FocusAllMice(_this, sdlwin);
290
// FIXME: when do we really enter ?
291
if (ClientXY(windata, &evt->x, &evt->y))
292
MotionAllMice(_this, evt->x, evt->y);
293
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_ENTER, 0, 0);
294
295
break;
case DWET_LEAVE:
296
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_LEAVE, 0, 0);
297
298
299
300
301
302
303
304
305
306
307
FocusAllMice(_this, 0);
/* SDL_DirectFB_ReshowCursor(_this, 1); */
break;
default:
;
}
} else
printf("Event Clazz %d\n", evt->clazz);
}
static void
308
ProcessInputEvent(_THIS, DFBInputEvent * ievt)
309
310
{
SDL_DFB_DEVICEDATA(_this);
311
SDL_Keysym keysym;
312
int kbd_idx;
313
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE];
314
315
316
if (!devdata->use_linux_input) {
if (ievt->type == DIET_AXISMOTION) {
317
if ((devdata->grabbed_window != NULL) && (ievt->flags & DIEF_AXISREL)) {
318
if (ievt->axis == DIAI_X)
319
SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1,
320
321
ievt->axisrel, 0, 0);
else if (ievt->axis == DIAI_Y)
322
SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1, 0,
323
324
325
326
327
328
329
330
331
332
333
334
335
336
ievt->axisrel, 0);
}
}
} else {
static int last_x, last_y;
switch (ievt->type) {
case DIET_AXISMOTION:
if (ievt->flags & DIEF_AXISABS) {
if (ievt->axis == DIAI_X)
last_x = ievt->axisabs;
else if (ievt->axis == DIAI_Y)
last_y = ievt->axisabs;
if (!(ievt->flags & DIEF_FOLLOW)) {
337
#if USE_MULTI_API
338
339
SDL_Mouse *mouse = SDL_GetMouse(ievt->device_id);
SDL_Window *window = SDL_GetWindowFromID(mouse->focus);
340
341
342
#else
SDL_Window *window = devdata->grabbed_window;
#endif
343
344
345
346
347
if (window) {
DFB_WindowData *windata =
(DFB_WindowData *) window->driverdata;
int x, y;
348
windata->dfbwin->GetPosition(windata->dfbwin, &x, &y);
349
SDL_SendMouseMotion_ex(window, ievt->device_id, 0,
350
351
352
353
354
last_x - (x +
windata->client.x),
last_y - (y +
windata->client.y), 0);
} else {
355
SDL_SendMouseMotion_ex(window, ievt->device_id, 0, last_x,
356
357
358
359
360
last_y, 0);
}
}
} else if (ievt->flags & DIEF_AXISREL) {
if (ievt->axis == DIAI_X)
361
SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1,
362
363
ievt->axisrel, 0, 0);
else if (ievt->axis == DIAI_Y)
364
SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1, 0,
365
366
367
368
369
ievt->axisrel, 0);
}
break;
case DIET_KEYPRESS:
kbd_idx = KbdIndex(_this, ievt->device_id);
370
371
DirectFB_TranslateKeyInputEvent(_this, ievt, &keysym);
//printf("Scancode %d %d %d\n", keysym.scancode, evt->key_code, evt->key_id);
372
SDL_SendKeyboardKey_ex(kbd_idx, SDL_PRESSED, keysym.scancode);
373
if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) {
374
375
SDL_zero(text);
UnicodeToUtf8(keysym.unicode, text);
376
if (*text) {
377
SDL_SendKeyboardText_ex(kbd_idx, text);
378
379
380
381
382
}
}
break;
case DIET_KEYRELEASE:
kbd_idx = KbdIndex(_this, ievt->device_id);
383
DirectFB_TranslateKeyInputEvent(_this, ievt, &keysym);
384
SDL_SendKeyboardKey_ex(kbd_idx, SDL_RELEASED, keysym.scancode);
385
386
387
break;
case DIET_BUTTONPRESS:
if (ievt->buttons & DIBM_LEFT)
388
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 1);
389
if (ievt->buttons & DIBM_MIDDLE)
390
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 2);
391
if (ievt->buttons & DIBM_RIGHT)
392
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 3);
393
394
395
break;
case DIET_BUTTONRELEASE:
if (!(ievt->buttons & DIBM_LEFT))
396
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 1);
397
if (!(ievt->buttons & DIBM_MIDDLE))
398
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 2);
399
if (!(ievt->buttons & DIBM_RIGHT))
400
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 3);
401
402
403
404
405
406
407
break;
default:
break; /* please gcc */
}
}
}
408
void
409
DirectFB_PumpEventsWindow(_THIS)
410
{
411
SDL_DFB_DEVICEDATA(_this);
412
DFBInputEvent ievt;
413
SDL_Window *w;
414
415
416
for (w = devdata->firstwin; w != NULL; w = w->next) {
SDL_DFB_WINDOWDATA(w);
417
DFBWindowEvent evt;
418
419
while (windata->eventbuffer->GetEvent(windata->eventbuffer,
420
DFB_EVENT(&evt)) == DFB_OK) {
421
422
423
424
425
426
427
428
429
430
431
if (!DirectFB_WM_ProcessEvent(_this, w, &evt)) {
/* Send a SDL_SYSWMEVENT if the application wants them */
if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) {
SDL_SysWMmsg wmmsg;
SDL_VERSION(&wmmsg.version);
wmmsg.subsystem = SDL_SYSWM_DIRECTFB;
wmmsg.msg.dfb.event.window = evt;
SDL_SendSysWMEvent(&wmmsg);
}
ProcessWindowEvent(_this, w, &evt);
}
432
433
434
435
436
437
}
}
/* Now get relative events in case we need them */
while (devdata->events->GetEvent(devdata->events,
DFB_EVENT(&ievt)) == DFB_OK) {
438
439
440
441
442
443
444
445
if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) {
SDL_SysWMmsg wmmsg;
SDL_VERSION(&wmmsg.version);
wmmsg.subsystem = SDL_SYSWM_DIRECTFB;
wmmsg.msg.dfb.event.input = ievt;
SDL_SendSysWMEvent(&wmmsg);
}
446
ProcessInputEvent(_this, &ievt);
447
448
449
}
}
450
void
451
DirectFB_InitOSKeymap(_THIS, SDL_Scancode * keymap, int numkeys)
452
{
453
454
455
int i;
/* Initialize the DirectFB key translation table */
456
for (i = 0; i < numkeys; ++i)
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
keymap[i] = SDL_SCANCODE_UNKNOWN;
keymap[DIKI_A - DIKI_UNKNOWN] = SDL_SCANCODE_A;
keymap[DIKI_B - DIKI_UNKNOWN] = SDL_SCANCODE_B;
keymap[DIKI_C - DIKI_UNKNOWN] = SDL_SCANCODE_C;
keymap[DIKI_D - DIKI_UNKNOWN] = SDL_SCANCODE_D;
keymap[DIKI_E - DIKI_UNKNOWN] = SDL_SCANCODE_E;
keymap[DIKI_F - DIKI_UNKNOWN] = SDL_SCANCODE_F;
keymap[DIKI_G - DIKI_UNKNOWN] = SDL_SCANCODE_G;
keymap[DIKI_H - DIKI_UNKNOWN] = SDL_SCANCODE_H;
keymap[DIKI_I - DIKI_UNKNOWN] = SDL_SCANCODE_I;
keymap[DIKI_J - DIKI_UNKNOWN] = SDL_SCANCODE_J;
keymap[DIKI_K - DIKI_UNKNOWN] = SDL_SCANCODE_K;
keymap[DIKI_L - DIKI_UNKNOWN] = SDL_SCANCODE_L;
keymap[DIKI_M - DIKI_UNKNOWN] = SDL_SCANCODE_M;
keymap[DIKI_N - DIKI_UNKNOWN] = SDL_SCANCODE_N;
keymap[DIKI_O - DIKI_UNKNOWN] = SDL_SCANCODE_O;
keymap[DIKI_P - DIKI_UNKNOWN] = SDL_SCANCODE_P;
keymap[DIKI_Q - DIKI_UNKNOWN] = SDL_SCANCODE_Q;
keymap[DIKI_R - DIKI_UNKNOWN] = SDL_SCANCODE_R;
keymap[DIKI_S - DIKI_UNKNOWN] = SDL_SCANCODE_S;
keymap[DIKI_T - DIKI_UNKNOWN] = SDL_SCANCODE_T;
keymap[DIKI_U - DIKI_UNKNOWN] = SDL_SCANCODE_U;
keymap[DIKI_V - DIKI_UNKNOWN] = SDL_SCANCODE_V;
keymap[DIKI_W - DIKI_UNKNOWN] = SDL_SCANCODE_W;
keymap[DIKI_X - DIKI_UNKNOWN] = SDL_SCANCODE_X;
keymap[DIKI_Y - DIKI_UNKNOWN] = SDL_SCANCODE_Y;
keymap[DIKI_Z - DIKI_UNKNOWN] = SDL_SCANCODE_Z;
keymap[DIKI_0 - DIKI_UNKNOWN] = SDL_SCANCODE_0;
keymap[DIKI_1 - DIKI_UNKNOWN] = SDL_SCANCODE_1;
keymap[DIKI_2 - DIKI_UNKNOWN] = SDL_SCANCODE_2;
keymap[DIKI_3 - DIKI_UNKNOWN] = SDL_SCANCODE_3;
keymap[DIKI_4 - DIKI_UNKNOWN] = SDL_SCANCODE_4;
keymap[DIKI_5 - DIKI_UNKNOWN] = SDL_SCANCODE_5;
keymap[DIKI_6 - DIKI_UNKNOWN] = SDL_SCANCODE_6;
keymap[DIKI_7 - DIKI_UNKNOWN] = SDL_SCANCODE_7;
keymap[DIKI_8 - DIKI_UNKNOWN] = SDL_SCANCODE_8;
keymap[DIKI_9 - DIKI_UNKNOWN] = SDL_SCANCODE_9;
keymap[DIKI_F1 - DIKI_UNKNOWN] = SDL_SCANCODE_F1;
keymap[DIKI_F2 - DIKI_UNKNOWN] = SDL_SCANCODE_F2;
keymap[DIKI_F3 - DIKI_UNKNOWN] = SDL_SCANCODE_F3;
keymap[DIKI_F4 - DIKI_UNKNOWN] = SDL_SCANCODE_F4;
keymap[DIKI_F5 - DIKI_UNKNOWN] = SDL_SCANCODE_F5;
keymap[DIKI_F6 - DIKI_UNKNOWN] = SDL_SCANCODE_F6;
keymap[DIKI_F7 - DIKI_UNKNOWN] = SDL_SCANCODE_F7;
keymap[DIKI_F8 - DIKI_UNKNOWN] = SDL_SCANCODE_F8;
keymap[DIKI_F9 - DIKI_UNKNOWN] = SDL_SCANCODE_F9;
keymap[DIKI_F10 - DIKI_UNKNOWN] = SDL_SCANCODE_F10;
keymap[DIKI_F11 - DIKI_UNKNOWN] = SDL_SCANCODE_F11;
keymap[DIKI_F12 - DIKI_UNKNOWN] = SDL_SCANCODE_F12;
keymap[DIKI_ESCAPE - DIKI_UNKNOWN] = SDL_SCANCODE_ESCAPE;
keymap[DIKI_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_LEFT;
keymap[DIKI_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_RIGHT;
keymap[DIKI_UP - DIKI_UNKNOWN] = SDL_SCANCODE_UP;
keymap[DIKI_DOWN - DIKI_UNKNOWN] = SDL_SCANCODE_DOWN;
keymap[DIKI_CONTROL_L - DIKI_UNKNOWN] = SDL_SCANCODE_LCTRL;
keymap[DIKI_CONTROL_R - DIKI_UNKNOWN] = SDL_SCANCODE_RCTRL;
keymap[DIKI_SHIFT_L - DIKI_UNKNOWN] = SDL_SCANCODE_LSHIFT;
keymap[DIKI_SHIFT_R - DIKI_UNKNOWN] = SDL_SCANCODE_RSHIFT;
keymap[DIKI_ALT_L - DIKI_UNKNOWN] = SDL_SCANCODE_LALT;
keymap[DIKI_ALT_R - DIKI_UNKNOWN] = SDL_SCANCODE_RALT;
keymap[DIKI_META_L - DIKI_UNKNOWN] = SDL_SCANCODE_LGUI;
keymap[DIKI_META_R - DIKI_UNKNOWN] = SDL_SCANCODE_RGUI;
keymap[DIKI_SUPER_L - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
keymap[DIKI_SUPER_R - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
525
526
527
528
/* FIXME:Do we read hyper keys ?
* keymap[DIKI_HYPER_L - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
* keymap[DIKI_HYPER_R - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
*/
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
keymap[DIKI_TAB - DIKI_UNKNOWN] = SDL_SCANCODE_TAB;
keymap[DIKI_ENTER - DIKI_UNKNOWN] = SDL_SCANCODE_RETURN;
keymap[DIKI_SPACE - DIKI_UNKNOWN] = SDL_SCANCODE_SPACE;
keymap[DIKI_BACKSPACE - DIKI_UNKNOWN] = SDL_SCANCODE_BACKSPACE;
keymap[DIKI_INSERT - DIKI_UNKNOWN] = SDL_SCANCODE_INSERT;
keymap[DIKI_DELETE - DIKI_UNKNOWN] = SDL_SCANCODE_DELETE;
keymap[DIKI_HOME - DIKI_UNKNOWN] = SDL_SCANCODE_HOME;
keymap[DIKI_END - DIKI_UNKNOWN] = SDL_SCANCODE_END;
keymap[DIKI_PAGE_UP - DIKI_UNKNOWN] = SDL_SCANCODE_PAGEUP;
keymap[DIKI_PAGE_DOWN - DIKI_UNKNOWN] = SDL_SCANCODE_PAGEDOWN;
keymap[DIKI_CAPS_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_CAPSLOCK;
keymap[DIKI_NUM_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_NUMLOCKCLEAR;
keymap[DIKI_SCROLL_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_SCROLLLOCK;
keymap[DIKI_PRINT - DIKI_UNKNOWN] = SDL_SCANCODE_PRINTSCREEN;
keymap[DIKI_PAUSE - DIKI_UNKNOWN] = SDL_SCANCODE_PAUSE;
keymap[DIKI_KP_EQUAL - DIKI_UNKNOWN] = SDL_SCANCODE_KP_EQUALS;
keymap[DIKI_KP_DECIMAL - DIKI_UNKNOWN] = SDL_SCANCODE_KP_PERIOD;
keymap[DIKI_KP_0 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_0;
keymap[DIKI_KP_1 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_1;
keymap[DIKI_KP_2 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_2;
keymap[DIKI_KP_3 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_3;
keymap[DIKI_KP_4 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_4;
keymap[DIKI_KP_5 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_5;
keymap[DIKI_KP_6 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_6;
keymap[DIKI_KP_7 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_7;
keymap[DIKI_KP_8 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_8;
keymap[DIKI_KP_9 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_9;
keymap[DIKI_KP_DIV - DIKI_UNKNOWN] = SDL_SCANCODE_KP_DIVIDE;
keymap[DIKI_KP_MULT - DIKI_UNKNOWN] = SDL_SCANCODE_KP_MULTIPLY;
keymap[DIKI_KP_MINUS - DIKI_UNKNOWN] = SDL_SCANCODE_KP_MINUS;
keymap[DIKI_KP_PLUS - DIKI_UNKNOWN] = SDL_SCANCODE_KP_PLUS;
keymap[DIKI_KP_ENTER - DIKI_UNKNOWN] = SDL_SCANCODE_KP_ENTER;
keymap[DIKI_QUOTE_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_GRAVE; /* TLDE */
keymap[DIKI_MINUS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_MINUS; /* AE11 */
keymap[DIKI_EQUALS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_EQUALS; /* AE12 */
keymap[DIKI_BRACKET_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_RIGHTBRACKET; /* AD11 */
keymap[DIKI_BRACKET_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_LEFTBRACKET; /* AD12 */
keymap[DIKI_BACKSLASH - DIKI_UNKNOWN] = SDL_SCANCODE_BACKSLASH; /* BKSL */
keymap[DIKI_SEMICOLON - DIKI_UNKNOWN] = SDL_SCANCODE_SEMICOLON; /* AC10 */
keymap[DIKI_QUOTE_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_APOSTROPHE; /* AC11 */
keymap[DIKI_COMMA - DIKI_UNKNOWN] = SDL_SCANCODE_COMMA; /* AB08 */
keymap[DIKI_PERIOD - DIKI_UNKNOWN] = SDL_SCANCODE_PERIOD; /* AB09 */
keymap[DIKI_SLASH - DIKI_UNKNOWN] = SDL_SCANCODE_SLASH; /* AB10 */
keymap[DIKI_LESS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_NONUSBACKSLASH; /* 103rd */
576
}
577
578
579
static SDL_Keysym *
DirectFB_TranslateKey(_THIS, DFBWindowEvent * evt, SDL_Keysym * keysym)
580
{
581
SDL_DFB_DEVICEDATA(_this);
582
583
int kbd_idx = 0; /* Window events lag the device source KbdIndex(_this, evt->device_id); */
DFB_KeyboardData *kbd = &devdata->keyboard[kbd_idx];
584
585
586
587
588
589
keysym->scancode = SDL_SCANCODE_UNKNOWN;
if (kbd->map && evt->key_code >= kbd->map_adjust &&
evt->key_code < kbd->map_size + kbd->map_adjust)
keysym->scancode = kbd->map[evt->key_code - kbd->map_adjust];
590
591
if (keysym->scancode == SDL_SCANCODE_UNKNOWN ||
592
devdata->keyboard[kbd_idx].is_generic) {
593
594
if (evt->key_id - DIKI_UNKNOWN < SDL_arraysize(oskeymap))
keysym->scancode = oskeymap[evt->key_id - DIKI_UNKNOWN];
595
596
597
else
keysym->scancode = SDL_SCANCODE_UNKNOWN;
}
598
599
600
keysym->unicode =
(DFB_KEY_TYPE(evt->key_symbol) == DIKT_UNICODE) ? evt->key_symbol : 0;
601
602
if (keysym->unicode == 0 &&
(evt->key_symbol > 0 && evt->key_symbol < 255))
603
keysym->unicode = evt->key_symbol;
604
605
return keysym;
606
607
}
608
static SDL_Keysym *
609
DirectFB_TranslateKeyInputEvent(_THIS, DFBInputEvent * evt,
610
SDL_Keysym * keysym)
611
612
{
SDL_DFB_DEVICEDATA(_this);
613
614
int kbd_idx = KbdIndex(_this, evt->device_id);
DFB_KeyboardData *kbd = &devdata->keyboard[kbd_idx];
615
616
keysym->scancode = SDL_SCANCODE_UNKNOWN;
617
618
619
620
621
622
if (kbd->map && evt->key_code >= kbd->map_adjust &&
evt->key_code < kbd->map_size + kbd->map_adjust)
keysym->scancode = kbd->map[evt->key_code - kbd->map_adjust];
if (keysym->scancode == SDL_SCANCODE_UNKNOWN || devdata->keyboard[kbd_idx].is_generic) {
623
624
625
626
627
628
629
630
if (evt->key_id - DIKI_UNKNOWN < SDL_arraysize(oskeymap))
keysym->scancode = oskeymap[evt->key_id - DIKI_UNKNOWN];
else
keysym->scancode = SDL_SCANCODE_UNKNOWN;
}
keysym->unicode =
(DFB_KEY_TYPE(evt->key_symbol) == DIKT_UNICODE) ? evt->key_symbol : 0;
631
632
if (keysym->unicode == 0 &&
(evt->key_symbol > 0 && evt->key_symbol < 255))
633
634
635
636
keysym->unicode = evt->key_symbol;
return keysym;
}
637
638
static int
639
DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button)
640
{
641
switch (button) {
642
case DIBI_LEFT:
643
return 1;
644
case DIBI_MIDDLE:
645
return 2;
646
case DIBI_RIGHT:
647
return 3;
648
default:
649
return 0;
650
651
}
}
652
653
static DFBEnumerationResult
654
EnumKeyboards(DFBInputDeviceID device_id,
655
DFBInputDeviceDescription desc, void *callbackdata)
656
{
657
658
cb_data *cb = callbackdata;
DFB_DeviceData *devdata = cb->devdata;
659
#if USE_MULTI_API
660
SDL_Keyboard keyboard;
661
#endif
662
SDL_Keycode keymap[SDL_NUM_SCANCODES];
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
if (!cb->sys_kbd) {
if (cb->sys_ids) {
if (device_id >= 0x10)
return DFENUM_OK;
} else {
if (device_id < 0x10)
return DFENUM_OK;
}
} else {
if (device_id != DIDID_KEYBOARD)
return DFENUM_OK;
}
if ((desc.caps & DIDTF_KEYBOARD)) {
678
#if USE_MULTI_API
679
SDL_zero(keyboard);
680
SDL_AddKeyboard(&keyboard, devdata->num_keyboard);
681
#endif
682
683
devdata->keyboard[devdata->num_keyboard].id = device_id;
devdata->keyboard[devdata->num_keyboard].is_generic = 0;
684
if (!strncmp("X11", desc.name, 3))
685
686
687
688
689
690
691
692
693
{
devdata->keyboard[devdata->num_keyboard].map = xfree86_scancode_table2;
devdata->keyboard[devdata->num_keyboard].map_size = SDL_arraysize(xfree86_scancode_table2);
devdata->keyboard[devdata->num_keyboard].map_adjust = 8;
} else {
devdata->keyboard[devdata->num_keyboard].map = linux_scancode_table;
devdata->keyboard[devdata->num_keyboard].map_size = SDL_arraysize(linux_scancode_table);
devdata->keyboard[devdata->num_keyboard].map_adjust = 0;
}
694
695
696
SDL_DFB_LOG("Keyboard %d - %s\n", device_id, desc.name);
697
SDL_GetDefaultKeymap(keymap);
698
#if USE_MULTI_API
699
SDL_SetKeymap(devdata->num_keyboard, 0, keymap, SDL_NUM_SCANCODES);
700
701
702
#else
SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES);
#endif
703
704
devdata->num_keyboard++;
705
706
if (cb->sys_kbd)
return DFENUM_CANCEL;
707
708
}
return DFENUM_OK;
709
710
711
712
713
714
}
void
DirectFB_InitKeyboard(_THIS)
{
SDL_DFB_DEVICEDATA(_this);
715
716
cb_data cb;
717
718
719
DirectFB_InitOSKeymap(_this, &oskeymap[0], SDL_arraysize(oskeymap));
devdata->num_keyboard = 0;
720
721
cb.devdata = devdata;
722
if (devdata->use_linux_input) {
723
724
cb.sys_kbd = 0;
cb.sys_ids = 0;
725
SDL_DFB_CHECK(devdata->dfb->
726
EnumInputDevices(devdata->dfb, EnumKeyboards, &cb));
727
if (devdata->num_keyboard == 0) {
728
cb.sys_ids = 1;
729
730
SDL_DFB_CHECK(devdata->dfb->EnumInputDevices(devdata->dfb,
EnumKeyboards,
731
&cb));
732
}
733
734
} else {
cb.sys_kbd = 1;
735
SDL_DFB_CHECK(devdata->dfb->EnumInputDevices(devdata->dfb,
736
737
EnumKeyboards,
&cb));
738
}
739
740
}
741
742
743
void
DirectFB_QuitKeyboard(_THIS)
{
744
//SDL_DFB_DEVICEDATA(_this);
745
746
SDL_KeyboardQuit();
747
748
}