Mercurial > sdl-ios-xcode
comparison src/video/directfb/SDL_DirectFB_events.c @ 167:cb384ef627f6
Added support for DirectFB video on Linux (thanks Denis!)
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 04 Sep 2001 22:53:46 +0000 |
parents | |
children | e8157fcb3114 |
comparison
equal
deleted
inserted
replaced
166:39877400bd1e | 167:cb384ef627f6 |
---|---|
1 /* | |
2 SDL - Simple DirectMedia Layer | |
3 Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga | |
4 | |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 of the License, or (at your option) any later version. | |
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 | |
13 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
20 slouken@devolution.com | |
21 */ | |
22 | |
23 #ifdef SAVE_RCSID | |
24 static char rcsid = | |
25 "@(#) $Id$"; | |
26 #endif | |
27 | |
28 /* Handle the event stream, converting DirectFB input events into SDL events */ | |
29 | |
30 #include <sys/types.h> | |
31 #include <sys/time.h> | |
32 #include <stdlib.h> | |
33 #include <stdio.h> | |
34 #include <unistd.h> | |
35 #include <fcntl.h> | |
36 #include <termios.h> | |
37 | |
38 #include <directfb.h> | |
39 | |
40 #include "SDL.h" | |
41 #include "SDL_sysevents.h" | |
42 #include "SDL_sysvideo.h" | |
43 #include "SDL_events_c.h" | |
44 #include "SDL_DirectFB_video.h" | |
45 #include "SDL_DirectFB_events.h" | |
46 | |
47 /* The translation tables from a DirectFB keycode to a SDL keysym */ | |
48 static SDLKey keymap[256]; | |
49 static SDL_keysym *DirectFB_TranslateKey (DFBInputEvent *ev, SDL_keysym *keysym); | |
50 static int DirectFB_TranslateButton (DFBInputEvent *ev); | |
51 | |
52 static int posted = 0; | |
53 | |
54 | |
55 void DirectFB_PumpEvents (_THIS) | |
56 { | |
57 DFBInputEvent evt; | |
58 | |
59 while (HIDDEN->inputbuffer->GetEvent (HIDDEN->inputbuffer, &evt) == DFB_OK) | |
60 { | |
61 SDL_keysym keysym; | |
62 | |
63 switch (evt.type) | |
64 { | |
65 case DIET_BUTTONPRESS: | |
66 posted += SDL_PrivateMouseButton(SDL_PRESSED, | |
67 DirectFB_TranslateButton (&evt), 0, 0); | |
68 break; | |
69 case DIET_BUTTONRELEASE: | |
70 posted += SDL_PrivateMouseButton(SDL_RELEASED, | |
71 DirectFB_TranslateButton (&evt), 0, 0); | |
72 break; | |
73 case DIET_KEYPRESS: | |
74 posted += SDL_PrivateKeyboard(SDL_PRESSED, DirectFB_TranslateKey(&evt, &keysym)); | |
75 break; | |
76 case DIET_KEYRELEASE: | |
77 posted += SDL_PrivateKeyboard(SDL_RELEASED, DirectFB_TranslateKey(&evt, &keysym)); | |
78 break; | |
79 case DIET_AXISMOTION: | |
80 if (evt.flags & DIEF_AXISREL) | |
81 { | |
82 if (evt.axis == DIAI_X) | |
83 posted += SDL_PrivateMouseMotion(0, 1, evt.axisrel, 0); | |
84 else if (evt.axis == DIAI_Y) | |
85 posted += SDL_PrivateMouseMotion(0, 1, 0, evt.axisrel); | |
86 } | |
87 break; | |
88 default: | |
89 ; | |
90 } | |
91 } | |
92 } | |
93 | |
94 void DirectFB_InitOSKeymap (_THIS) | |
95 { | |
96 int i; | |
97 | |
98 /* Initialize the DirectFB key translation table */ | |
99 for (i=0; i<SDL_TABLESIZE(keymap); ++i) | |
100 keymap[i] = SDLK_UNKNOWN; | |
101 | |
102 keymap[DIKC_A] = SDLK_a; | |
103 keymap[DIKC_B] = SDLK_b; | |
104 keymap[DIKC_C] = SDLK_c; | |
105 keymap[DIKC_D] = SDLK_d; | |
106 keymap[DIKC_E] = SDLK_e; | |
107 keymap[DIKC_F] = SDLK_f; | |
108 keymap[DIKC_G] = SDLK_g; | |
109 keymap[DIKC_H] = SDLK_h; | |
110 keymap[DIKC_I] = SDLK_i; | |
111 keymap[DIKC_J] = SDLK_j; | |
112 keymap[DIKC_K] = SDLK_k; | |
113 keymap[DIKC_L] = SDLK_l; | |
114 keymap[DIKC_M] = SDLK_m; | |
115 keymap[DIKC_N] = SDLK_n; | |
116 keymap[DIKC_O] = SDLK_o; | |
117 keymap[DIKC_P] = SDLK_p; | |
118 keymap[DIKC_Q] = SDLK_q; | |
119 keymap[DIKC_R] = SDLK_r; | |
120 keymap[DIKC_S] = SDLK_s; | |
121 keymap[DIKC_T] = SDLK_t; | |
122 keymap[DIKC_U] = SDLK_u; | |
123 keymap[DIKC_V] = SDLK_v; | |
124 keymap[DIKC_W] = SDLK_w; | |
125 keymap[DIKC_X] = SDLK_x; | |
126 keymap[DIKC_Y] = SDLK_y; | |
127 keymap[DIKC_Z] = SDLK_z; | |
128 | |
129 keymap[DIKC_0] = SDLK_0; | |
130 keymap[DIKC_1] = SDLK_1; | |
131 keymap[DIKC_2] = SDLK_2; | |
132 keymap[DIKC_3] = SDLK_3; | |
133 keymap[DIKC_4] = SDLK_4; | |
134 keymap[DIKC_5] = SDLK_5; | |
135 keymap[DIKC_6] = SDLK_6; | |
136 keymap[DIKC_7] = SDLK_7; | |
137 keymap[DIKC_8] = SDLK_8; | |
138 keymap[DIKC_9] = SDLK_9; | |
139 | |
140 keymap[DIKC_F1] = SDLK_F1; | |
141 keymap[DIKC_F2] = SDLK_F2; | |
142 keymap[DIKC_F3] = SDLK_F3; | |
143 keymap[DIKC_F4] = SDLK_F4; | |
144 keymap[DIKC_F5] = SDLK_F5; | |
145 keymap[DIKC_F6] = SDLK_F6; | |
146 keymap[DIKC_F7] = SDLK_F7; | |
147 keymap[DIKC_F8] = SDLK_F8; | |
148 keymap[DIKC_F9] = SDLK_F9; | |
149 keymap[DIKC_F10] = SDLK_F10; | |
150 keymap[DIKC_F11] = SDLK_F11; | |
151 keymap[DIKC_F12] = SDLK_F12; | |
152 | |
153 keymap[DIKC_ESCAPE] = SDLK_ESCAPE; | |
154 keymap[DIKC_LEFT] = SDLK_LEFT; | |
155 keymap[DIKC_RIGHT] = SDLK_RIGHT; | |
156 keymap[DIKC_UP] = SDLK_UP; | |
157 keymap[DIKC_DOWN] = SDLK_DOWN; | |
158 keymap[DIKC_CTRL] = SDLK_LCTRL; | |
159 keymap[DIKC_SHIFT] = SDLK_LSHIFT; | |
160 keymap[DIKC_ALT] = SDLK_LALT; | |
161 keymap[DIKC_ALTGR] = SDLK_RALT; | |
162 keymap[DIKC_TAB] = SDLK_TAB; | |
163 keymap[DIKC_ENTER] = SDLK_RETURN; | |
164 keymap[DIKC_SPACE] = SDLK_SPACE; | |
165 keymap[DIKC_BACKSPACE] = SDLK_BACKSPACE; | |
166 keymap[DIKC_INSERT] = SDLK_INSERT; | |
167 keymap[DIKC_DELETE] = SDLK_DELETE; | |
168 keymap[DIKC_HOME] = SDLK_HOME; | |
169 keymap[DIKC_END] = SDLK_END; | |
170 keymap[DIKC_PAGEUP] = SDLK_PAGEUP; | |
171 keymap[DIKC_PAGEDOWN] = SDLK_PAGEDOWN; | |
172 keymap[DIKC_CAPSLOCK] = SDLK_CAPSLOCK; | |
173 keymap[DIKC_NUMLOCK] = SDLK_NUMLOCK; | |
174 keymap[DIKC_SCRLOCK] = SDLK_SCROLLOCK; | |
175 keymap[DIKC_PRINT] = SDLK_PRINT; | |
176 keymap[DIKC_PAUSE] = SDLK_PAUSE; | |
177 keymap[DIKC_KP_DIV] = SDLK_KP_DIVIDE; | |
178 keymap[DIKC_KP_MULT] = SDLK_KP_MULTIPLY; | |
179 keymap[DIKC_KP_MINUS] = SDLK_KP_MINUS; | |
180 keymap[DIKC_KP_PLUS] = SDLK_KP_PLUS; | |
181 keymap[DIKC_KP_ENTER] = SDLK_KP_ENTER; | |
182 | |
183 keymap[DIKC_OK] = SDLK_RETURN; | |
184 keymap[DIKC_CANCEL] = SDLK_BREAK; | |
185 keymap[DIKC_CLEAR] = SDLK_DELETE; | |
186 keymap[DIKC_POWER] = SDLK_POWER; | |
187 keymap[DIKC_POWER2] = SDLK_POWER; | |
188 keymap[DIKC_MENU] = SDLK_MENU; | |
189 keymap[DIKC_HELP] = SDLK_HELP; | |
190 keymap[DIKC_BACK] = SDLK_ESCAPE; | |
191 } | |
192 | |
193 | |
194 static SDL_keysym *DirectFB_TranslateKey (DFBInputEvent *ev, SDL_keysym *keysym) | |
195 { | |
196 /* Set the keysym information */ | |
197 keysym->scancode = ev->keycode; | |
198 keysym->mod = KMOD_NONE; | |
199 keysym->unicode = 0; | |
200 | |
201 if (ev->key_ascii > 0 && ev->key_ascii < 128) | |
202 keysym->sym = ev->key_ascii; | |
203 else | |
204 keysym->sym = keymap[ev->keycode]; | |
205 | |
206 return keysym; | |
207 } | |
208 | |
209 static int DirectFB_TranslateButton (DFBInputEvent *ev) | |
210 { | |
211 switch (ev->button) | |
212 { | |
213 case DIBI_LEFT: | |
214 return 1; | |
215 case DIBI_MIDDLE: | |
216 return 2; | |
217 case DIBI_RIGHT: | |
218 return 3; | |
219 default: | |
220 return 0; | |
221 } | |
222 } |