Mercurial > sdl-ios-xcode
annotate src/video/bwindow/SDL_sysevents.cc @ 4179:d7294b7c732d SDL-1.2
Date: Fri, 24 Apr 2009 17:47:07 +0200
From: Stefan Klug
Subject: Re: [SDL] SVN doesn't compile for wince
the patch applied for Revision 4483 was seemingly not checked for side
effects.
It broke the WinCE build.
The attached patch should fix these problems. I'm not using SDL 1.2 on
CE anymore, and therefore haven't tested the patch... but at least it
compiles ;-)
Regards Stefan
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 07 May 2009 12:40:16 +0000 |
parents | a1b03ba2fcd0 |
children | 0620847bf1a8 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
4159 | 3 Copyright (C) 1997-2009 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
907
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
907
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 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 | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
907
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
907
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
907
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
907
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
1
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1403
376665398b25
Catch the C++ and Objective C sources too...
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 #include <support/UTF8.h> | |
25 #include <stdio.h> | |
26 #include <string.h> | |
27 #include "SDL_error.h" | |
28 #include "SDL_events.h" | |
29 #include "SDL_BWin.h" | |
30 #include "SDL_lowvideo.h" | |
31 | |
3878 | 32 static SDLKey keymap[128]; |
33 int mouse_relative = 0; | |
0 | 34 extern "C" { |
35 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
36 #include "../../events/SDL_sysevents.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
37 #include "../../events/SDL_events_c.h" |
0 | 38 #include "SDL_sysevents_c.h" |
39 | |
40 void BE_PumpEvents(_THIS) | |
41 { | |
42 } | |
43 | |
44 void BE_InitOSKeymap(_THIS) | |
45 { | |
3878 | 46 for ( uint i=0; i<SDL_TABLESIZE(keymap); ++i ) |
47 keymap[i] = SDLK_UNKNOWN; | |
48 | |
49 keymap[0x01] = SDLK_ESCAPE; | |
50 keymap[B_F1_KEY] = SDLK_F1; | |
51 keymap[B_F2_KEY] = SDLK_F2; | |
52 keymap[B_F3_KEY] = SDLK_F3; | |
53 keymap[B_F4_KEY] = SDLK_F4; | |
54 keymap[B_F5_KEY] = SDLK_F5; | |
55 keymap[B_F6_KEY] = SDLK_F6; | |
56 keymap[B_F7_KEY] = SDLK_F7; | |
57 keymap[B_F8_KEY] = SDLK_F8; | |
58 keymap[B_F9_KEY] = SDLK_F9; | |
59 keymap[B_F10_KEY] = SDLK_F10; | |
60 keymap[B_F11_KEY] = SDLK_F11; | |
61 keymap[B_F12_KEY] = SDLK_F12; | |
62 keymap[B_PRINT_KEY] = SDLK_PRINT; | |
63 keymap[B_SCROLL_KEY] = SDLK_SCROLLOCK; | |
64 keymap[B_PAUSE_KEY] = SDLK_PAUSE; | |
65 keymap[0x11] = SDLK_BACKQUOTE; | |
66 keymap[0x12] = SDLK_1; | |
67 keymap[0x13] = SDLK_2; | |
68 keymap[0x14] = SDLK_3; | |
69 keymap[0x15] = SDLK_4; | |
70 keymap[0x16] = SDLK_5; | |
71 keymap[0x17] = SDLK_6; | |
72 keymap[0x18] = SDLK_7; | |
73 keymap[0x19] = SDLK_8; | |
74 keymap[0x1a] = SDLK_9; | |
75 keymap[0x1b] = SDLK_0; | |
76 keymap[0x1c] = SDLK_MINUS; | |
77 keymap[0x1d] = SDLK_EQUALS; | |
78 keymap[0x1e] = SDLK_BACKSPACE; | |
79 keymap[0x1f] = SDLK_INSERT; | |
80 keymap[0x20] = SDLK_HOME; | |
81 keymap[0x21] = SDLK_PAGEUP; | |
82 keymap[0x22] = SDLK_NUMLOCK; | |
83 keymap[0x23] = SDLK_KP_DIVIDE; | |
84 keymap[0x24] = SDLK_KP_MULTIPLY; | |
85 keymap[0x25] = SDLK_KP_MINUS; | |
86 keymap[0x26] = SDLK_TAB; | |
87 keymap[0x27] = SDLK_q; | |
88 keymap[0x28] = SDLK_w; | |
89 keymap[0x29] = SDLK_e; | |
90 keymap[0x2a] = SDLK_r; | |
91 keymap[0x2b] = SDLK_t; | |
92 keymap[0x2c] = SDLK_y; | |
93 keymap[0x2d] = SDLK_u; | |
94 keymap[0x2e] = SDLK_i; | |
95 keymap[0x2f] = SDLK_o; | |
96 keymap[0x30] = SDLK_p; | |
97 keymap[0x31] = SDLK_LEFTBRACKET; | |
98 keymap[0x32] = SDLK_RIGHTBRACKET; | |
99 keymap[0x33] = SDLK_BACKSLASH; | |
100 keymap[0x34] = SDLK_DELETE; | |
101 keymap[0x35] = SDLK_END; | |
102 keymap[0x36] = SDLK_PAGEDOWN; | |
103 keymap[0x37] = SDLK_KP7; | |
104 keymap[0x38] = SDLK_KP8; | |
105 keymap[0x39] = SDLK_KP9; | |
106 keymap[0x3a] = SDLK_KP_PLUS; | |
107 keymap[0x3b] = SDLK_CAPSLOCK; | |
108 keymap[0x3c] = SDLK_a; | |
109 keymap[0x3d] = SDLK_s; | |
110 keymap[0x3e] = SDLK_d; | |
111 keymap[0x3f] = SDLK_f; | |
112 keymap[0x40] = SDLK_g; | |
113 keymap[0x41] = SDLK_h; | |
114 keymap[0x42] = SDLK_j; | |
115 keymap[0x43] = SDLK_k; | |
116 keymap[0x44] = SDLK_l; | |
117 keymap[0x45] = SDLK_SEMICOLON; | |
118 keymap[0x46] = SDLK_QUOTE; | |
119 keymap[0x47] = SDLK_RETURN; | |
120 keymap[0x48] = SDLK_KP4; | |
121 keymap[0x49] = SDLK_KP5; | |
122 keymap[0x4a] = SDLK_KP6; | |
123 keymap[0x4b] = SDLK_LSHIFT; | |
124 keymap[0x4c] = SDLK_z; | |
125 keymap[0x4d] = SDLK_x; | |
126 keymap[0x4e] = SDLK_c; | |
127 keymap[0x4f] = SDLK_v; | |
128 keymap[0x50] = SDLK_b; | |
129 keymap[0x51] = SDLK_n; | |
130 keymap[0x52] = SDLK_m; | |
131 keymap[0x53] = SDLK_COMMA; | |
132 keymap[0x54] = SDLK_PERIOD; | |
133 keymap[0x55] = SDLK_SLASH; | |
134 keymap[0x56] = SDLK_RSHIFT; | |
135 keymap[0x57] = SDLK_UP; | |
136 keymap[0x58] = SDLK_KP1; | |
137 keymap[0x59] = SDLK_KP2; | |
138 keymap[0x5a] = SDLK_KP3; | |
139 keymap[0x5b] = SDLK_KP_ENTER; | |
140 keymap[0x5c] = SDLK_LCTRL; | |
141 keymap[0x5d] = SDLK_LALT; | |
142 keymap[0x5e] = SDLK_SPACE; | |
143 keymap[0x5f] = SDLK_RALT; | |
144 keymap[0x60] = SDLK_RCTRL; | |
145 keymap[0x61] = SDLK_LEFT; | |
146 keymap[0x62] = SDLK_DOWN; | |
147 keymap[0x63] = SDLK_RIGHT; | |
148 keymap[0x64] = SDLK_KP0; | |
149 keymap[0x65] = SDLK_KP_PERIOD; | |
150 keymap[0x66] = SDLK_LMETA; | |
151 keymap[0x67] = SDLK_RMETA; | |
152 keymap[0x68] = SDLK_MENU; | |
153 keymap[0x69] = SDLK_EURO; | |
154 keymap[0x6a] = SDLK_KP_EQUALS; | |
155 keymap[0x6b] = SDLK_POWER; | |
0 | 156 } |
157 | |
158 }; /* Extern C */ | |
3878 | 159 |
160 void SDL_BWin::DispatchMessage(BMessage *msg, BHandler *target) | |
161 { | |
162 switch (msg->what) { | |
163 case B_MOUSE_MOVED: | |
164 { | |
165 SDL_VideoDevice *view = current_video; | |
166 BPoint where; | |
167 int32 transit; | |
168 if (msg->FindPoint("where", &where) == B_OK && msg->FindInt32("be:transit", &transit) == B_OK) { | |
4012 | 169 int x, y; |
3878 | 170 |
4012 | 171 GetXYOffset(x, y); |
172 x = (int)where.x - x; | |
173 y = (int)where.y - y; | |
3878 | 174 |
4012 | 175 //BeSman: I need another method for cursor catching !!! |
176 if (view->input_grab != SDL_GRAB_OFF) | |
177 { | |
178 bool clipped = false; | |
179 if ( x < 0 ) { | |
180 x = 0; | |
181 clipped = true; | |
182 } else if ( x >= SDL_VideoSurface->w ) { | |
183 x = (SDL_VideoSurface->w-1); | |
184 clipped = true; | |
185 } | |
186 if ( y < 0 ) { | |
187 y = 0; | |
188 clipped = true; | |
189 } else if ( y >= SDL_VideoSurface->h ) { | |
190 y = (SDL_VideoSurface->h-1); | |
191 clipped = true; | |
192 } | |
193 if ( clipped ) { | |
194 BPoint edge; | |
195 GetXYOffset(edge.x, edge.y); | |
196 edge.x += x; | |
197 edge.y += y; | |
198 ConvertToScreen(&edge); | |
199 set_mouse_position((int)edge.x, (int)edge.y); | |
200 } | |
201 transit = B_INSIDE_VIEW; | |
202 } | |
3878 | 203 if (transit == B_EXITED_VIEW) { |
204 if ( SDL_GetAppState() & SDL_APPMOUSEFOCUS ) { | |
205 SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); | |
4012 | 206 be_app->SetCursor(B_HAND_CURSOR); |
3878 | 207 } |
208 } else { | |
4012 | 209 if ( !(SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { |
3878 | 210 SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); |
211 SDL_SetCursor(NULL); | |
212 } | |
213 | |
214 if ( mouse_relative ) { | |
4012 | 215 int half_w = (SDL_VideoSurface->w/2); |
216 int half_h = (SDL_VideoSurface->h/2); | |
217 x -= half_w; | |
218 y -= half_h; | |
3878 | 219 if ( x || y ) { |
4012 | 220 BPoint center; |
221 GetXYOffset(center.x, center.y); | |
222 center.x += half_w; | |
223 center.y += half_h; | |
3878 | 224 ConvertToScreen(¢er); |
225 set_mouse_position((int)center.x, (int)center.y); | |
226 SDL_PrivateMouseMotion(0, 1, x, y); | |
227 } | |
228 } else { | |
229 SDL_PrivateMouseMotion(0, 0, x, y); | |
230 } | |
231 } | |
232 } | |
233 break; | |
234 } | |
235 | |
236 case B_MOUSE_DOWN: | |
237 { | |
238 /* it looks like mouse down is send only for first clicked | |
239 button, each next is not send while last one is holded */ | |
240 int32 buttons; | |
241 int sdl_buttons = 0; | |
242 if (msg->FindInt32("buttons", &buttons) == B_OK) { | |
243 /* Add any mouse button events */ | |
244 if (buttons & B_PRIMARY_MOUSE_BUTTON) { | |
245 sdl_buttons |= SDL_BUTTON_LEFT; | |
246 } | |
247 if (buttons & B_SECONDARY_MOUSE_BUTTON) { | |
248 sdl_buttons |= SDL_BUTTON_RIGHT; | |
249 } | |
250 if (buttons & B_TERTIARY_MOUSE_BUTTON) { | |
251 sdl_buttons |= SDL_BUTTON_MIDDLE; | |
252 } | |
253 SDL_PrivateMouseButton(SDL_PRESSED, sdl_buttons, 0, 0); | |
254 | |
255 last_buttons = buttons; | |
256 } | |
257 break; | |
258 } | |
259 | |
260 case B_MOUSE_UP: | |
261 { | |
262 /* mouse up doesn't give which button was released, | |
263 only state of buttons (after release, so it's always = 0), | |
264 which is not what we need ;] | |
265 So we need to store button in mouse down, and restore | |
266 in mouse up :( | |
267 mouse up is (similarly to mouse down) send only for | |
268 first button down (ie. it's no send if we click another button | |
269 without releasing previous one first) - but that's probably | |
270 because of how drivers are written?, not BeOS itself. */ | |
271 int32 buttons; | |
272 int sdl_buttons = 0; | |
273 if (msg->FindInt32("buttons", &buttons) == B_OK) { | |
274 /* Add any mouse button events */ | |
275 if ((buttons ^ B_PRIMARY_MOUSE_BUTTON) & last_buttons) { | |
276 sdl_buttons |= SDL_BUTTON_LEFT; | |
277 } | |
278 if ((buttons ^ B_SECONDARY_MOUSE_BUTTON) & last_buttons) { | |
279 sdl_buttons |= SDL_BUTTON_RIGHT; | |
280 } | |
281 if ((buttons ^ B_TERTIARY_MOUSE_BUTTON) & last_buttons) { | |
282 sdl_buttons |= SDL_BUTTON_MIDDLE; | |
283 } | |
284 SDL_PrivateMouseButton(SDL_RELEASED, sdl_buttons, 0, 0); | |
285 | |
286 last_buttons = buttons; | |
287 } | |
288 break; | |
289 } | |
290 | |
291 case B_MOUSE_WHEEL_CHANGED: | |
292 { | |
293 float x, y; | |
294 x = y = 0; | |
295 if (msg->FindFloat("be:wheel_delta_x", &x) == B_OK && msg->FindFloat("be:wheel_delta_y", &y) == B_OK) { | |
4011
f5794774970d
Reverted mousewheel support in 1.2, since it breaks binary compatibility.
Sam Lantinga <slouken@libsdl.org>
parents:
4009
diff
changeset
|
296 if (x < 0 || y < 0) { |
f5794774970d
Reverted mousewheel support in 1.2, since it breaks binary compatibility.
Sam Lantinga <slouken@libsdl.org>
parents:
4009
diff
changeset
|
297 SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_WHEELDOWN, 0, 0); |
f5794774970d
Reverted mousewheel support in 1.2, since it breaks binary compatibility.
Sam Lantinga <slouken@libsdl.org>
parents:
4009
diff
changeset
|
298 SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_WHEELDOWN, 0, 0); |
f5794774970d
Reverted mousewheel support in 1.2, since it breaks binary compatibility.
Sam Lantinga <slouken@libsdl.org>
parents:
4009
diff
changeset
|
299 } else if (x > 0 || y > 0) { |
f5794774970d
Reverted mousewheel support in 1.2, since it breaks binary compatibility.
Sam Lantinga <slouken@libsdl.org>
parents:
4009
diff
changeset
|
300 SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_WHEELUP, 0, 0); |
f5794774970d
Reverted mousewheel support in 1.2, since it breaks binary compatibility.
Sam Lantinga <slouken@libsdl.org>
parents:
4009
diff
changeset
|
301 SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_WHEELUP, 0, 0); |
3878 | 302 } |
303 } | |
304 break; | |
305 } | |
306 | |
307 case B_KEY_DOWN: | |
308 case B_UNMAPPED_KEY_DOWN: /* modifier keys are unmapped */ | |
309 { | |
310 int32 key; | |
311 int32 modifiers; | |
312 int32 key_repeat; | |
313 /* Workaround for SDL message queue being filled too fast because of BeOS own key-repeat mechanism */ | |
314 if (msg->FindInt32("be:key_repeat", &key_repeat) == B_OK && key_repeat > 0) | |
315 break; | |
316 | |
317 if (msg->FindInt32("key", &key) == B_OK && msg->FindInt32("modifiers", &modifiers) == B_OK) { | |
318 SDL_keysym keysym; | |
319 keysym.scancode = key; | |
320 if (key < 128) { | |
321 keysym.sym = keymap[key]; | |
322 } else { | |
323 keysym.sym = SDLK_UNKNOWN; | |
324 } | |
325 /* FIX THIS? | |
326 it seems SDL_PrivateKeyboard() changes mod value | |
327 anyway, and doesn't care about what we setup here */ | |
328 keysym.mod = KMOD_NONE; | |
329 keysym.unicode = 0; | |
330 if (SDL_TranslateUNICODE) { | |
331 const char *bytes; | |
332 if (msg->FindString("bytes", &bytes) == B_OK) { | |
333 /* FIX THIS? | |
334 this cares only about first "letter", | |
335 so if someone maps some key to print | |
336 "BeOS rulez!" only "B" will be used. */ | |
337 keysym.unicode = Translate2Unicode(bytes); | |
338 } | |
339 } | |
340 SDL_PrivateKeyboard(SDL_PRESSED, &keysym); | |
341 } | |
342 break; | |
343 } | |
344 | |
345 case B_KEY_UP: | |
346 case B_UNMAPPED_KEY_UP: /* modifier keys are unmapped */ | |
347 { | |
348 int32 key; | |
349 int32 modifiers; | |
350 if (msg->FindInt32("key", &key) == B_OK && msg->FindInt32("modifiers", &modifiers) == B_OK) { | |
351 SDL_keysym keysym; | |
352 keysym.scancode = key; | |
353 if (key < 128) { | |
354 keysym.sym = keymap[key]; | |
355 } else { | |
356 keysym.sym = SDLK_UNKNOWN; | |
357 } | |
358 keysym.mod = KMOD_NONE; /* FIX THIS? */ | |
359 keysym.unicode = 0; | |
360 if (SDL_TranslateUNICODE) { | |
361 const char *bytes; | |
362 if (msg->FindString("bytes", &bytes) == B_OK) { | |
363 keysym.unicode = Translate2Unicode(bytes); | |
364 } | |
365 } | |
366 SDL_PrivateKeyboard(SDL_RELEASED, &keysym); | |
367 } | |
368 break; | |
369 } | |
370 | |
371 default: | |
372 /* move it after switch{} so it's always handled | |
373 that way we keep BeOS feautures like: | |
374 - CTRL+Q to close window (and other shortcuts) | |
375 - PrintScreen to make screenshot into /boot/home | |
376 - etc.. */ | |
377 //BDirectWindow::DispatchMessage(msg, target); | |
378 break; | |
379 } | |
380 BDirectWindow::DispatchMessage(msg, target); | |
381 } |