Mercurial > sdl-ios-xcode
annotate src/video/cybergfx/SDL_amigaevents.c @ 1585:980d2a0dc2a3
Date: Tue, 4 Mar 2003 15:05:31 -0800
From: "Jim"
Subject: [SDL] Frame Buffer patches...
Okay I'm new at patch generation - so please tell me if there's a better way
I could have done this.
Attached are two patch files generated with 'cvs diff -u'
SDL-fb-open-lock.patch applies to SDL_fbvideo.c
Modifies the open loop to check /dev/fb/0 found on devfs...
Modifies the lock code to return failure if the current virtual terminal
is not the one opened for frame buffer writing...
Lock would hang forever if switched away (ctrl-alt-F1) ...
SDL-fb-mousedrv-screensave.patch applies to SDL_fbevents.c
Switches default mouse mode based on SDL_MOUSEDRV - currently only
accepts PS2 - otherwise default is MS Mouse.
When the screen is switched - exisiting code (wrapped in ifdef
SAVE_SCREEN_COTENTS) would save the wrong bit of the screen....
( I run frame buffer 1600x1200, the size I requested was 800x600 - the
save would save the top 800 lines (non biased) and restore them... Adding
screen->offset fixed that )
However, if that option is not set, then a call to SDL_UpdateRect (full
screen) is made. (which may have had it's contents changed since the screen
is not entirely locked because of lock-failure patch)
Jim
[patches slightly tweaked for SDL 1.2.10]
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Wed, 22 Mar 2006 07:48:22 +0000 |
parents | d910939febfa |
children | 782fd950bd46 c121d94672cb |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
3 Copyright (C) 1997-2006 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:
769
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:
769
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:
769
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:
769
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:
769
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:
769
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:
21
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 /* Handle the event stream, converting Amiga events into SDL events */ | |
25 #include "SDL.h" | |
26 | |
27 #include "SDL_syswm.h" | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
28 #include "../SDL_sysvideo.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
29 #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
|
30 #include "../../events/SDL_events_c.h" |
0 | 31 #include "SDL_cgxvideo.h" |
32 #include "SDL_cgxmodes_c.h" | |
33 #include "SDL_cgximage_c.h" | |
34 #include "SDL_cgxwm_c.h" | |
35 #include "SDL_amigaevents_c.h" | |
36 | |
37 | |
38 /* The translation tables from an Amiga keysym to a SDL keysym */ | |
39 static SDLKey MISC_keymap[256]; | |
40 SDL_keysym *amiga_TranslateKey(int code, SDL_keysym *keysym); | |
41 struct IOStdReq *ConReq=NULL; | |
42 struct MsgPort *ConPort=NULL; | |
43 | |
44 /* Note: The X server buffers and accumulates mouse motion events, so | |
45 the motion event generated by the warp may not appear exactly as we | |
46 expect it to. We work around this (and improve performance) by only | |
47 warping the pointer when it reaches the edge, and then wait for it. | |
48 */ | |
49 #define MOUSE_FUDGE_FACTOR 8 | |
50 | |
51 #if 0 | |
52 | |
53 static inline int amiga_WarpedMotion(_THIS, struct IntuiMessage *m) | |
54 { | |
55 int w, h, i; | |
56 int deltax, deltay; | |
57 int posted; | |
58 | |
59 w = SDL_VideoSurface->w; | |
60 h = SDL_VideoSurface->h; | |
61 deltax = xevent->xmotion.x - mouse_last.x; | |
62 deltay = xevent->xmotion.y - mouse_last.y; | |
63 #ifdef DEBUG_MOTION | |
64 printf("Warped mouse motion: %d,%d\n", deltax, deltay); | |
65 #endif | |
66 mouse_last.x = xevent->xmotion.x; | |
67 mouse_last.y = xevent->xmotion.y; | |
68 posted = SDL_PrivateMouseMotion(0, 1, deltax, deltay); | |
69 | |
70 if ( (xevent->xmotion.x < MOUSE_FUDGE_FACTOR) || | |
71 (xevent->xmotion.x > (w-MOUSE_FUDGE_FACTOR)) || | |
72 (xevent->xmotion.y < MOUSE_FUDGE_FACTOR) || | |
73 (xevent->xmotion.y > (h-MOUSE_FUDGE_FACTOR)) ) { | |
74 /* Get the events that have accumulated */ | |
75 while ( XCheckTypedEvent(SDL_Display, MotionNotify, xevent) ) { | |
76 deltax = xevent->xmotion.x - mouse_last.x; | |
77 deltay = xevent->xmotion.y - mouse_last.y; | |
78 #ifdef DEBUG_MOTION | |
79 printf("Extra mouse motion: %d,%d\n", deltax, deltay); | |
80 #endif | |
81 mouse_last.x = xevent->xmotion.x; | |
82 mouse_last.y = xevent->xmotion.y; | |
83 posted += SDL_PrivateMouseMotion(0, 1, deltax, deltay); | |
84 } | |
85 mouse_last.x = w/2; | |
86 mouse_last.y = h/2; | |
87 XWarpPointer(SDL_Display, None, SDL_Window, 0, 0, 0, 0, | |
88 mouse_last.x, mouse_last.y); | |
89 for ( i=0; i<10; ++i ) { | |
90 XMaskEvent(SDL_Display, PointerMotionMask, xevent); | |
91 if ( (xevent->xmotion.x > | |
92 (mouse_last.x-MOUSE_FUDGE_FACTOR)) && | |
93 (xevent->xmotion.x < | |
94 (mouse_last.x+MOUSE_FUDGE_FACTOR)) && | |
95 (xevent->xmotion.y > | |
96 (mouse_last.y-MOUSE_FUDGE_FACTOR)) && | |
97 (xevent->xmotion.y < | |
98 (mouse_last.y+MOUSE_FUDGE_FACTOR)) ) { | |
99 break; | |
100 } | |
101 #ifdef DEBUG_XEVENTS | |
102 printf("Lost mouse motion: %d,%d\n", xevent->xmotion.x, xevent->xmotion.y); | |
103 #endif | |
104 } | |
105 #ifdef DEBUG_XEVENTS | |
106 if ( i == 10 ) { | |
107 printf("Warning: didn't detect mouse warp motion\n"); | |
108 } | |
109 #endif | |
110 } | |
111 return(posted); | |
112 } | |
113 | |
114 #endif | |
115 | |
116 static int amiga_GetButton(int code) | |
117 { | |
118 switch(code) | |
119 { | |
120 case IECODE_MBUTTON: | |
121 return SDL_BUTTON_MIDDLE; | |
122 case IECODE_RBUTTON: | |
123 return SDL_BUTTON_RIGHT; | |
124 default: | |
125 return SDL_BUTTON_LEFT; | |
126 } | |
127 } | |
128 | |
129 static int amiga_DispatchEvent(_THIS,struct IntuiMessage *msg) | |
130 { | |
131 int class=msg->Class,code=msg->Code; | |
132 int posted; | |
133 | |
134 posted = 0; | |
135 switch (class) { | |
136 /* Gaining mouse coverage? */ | |
137 case IDCMP_ACTIVEWINDOW: | |
138 posted = SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); | |
139 break; | |
140 | |
141 /* Losing mouse coverage? */ | |
142 case IDCMP_INACTIVEWINDOW: | |
143 posted = SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); | |
144 break; | |
145 #if 0 | |
146 /* Gaining input focus? */ | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
147 case IDCMP_ACTIVEWINDOW: |
0 | 148 posted = SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS); |
149 | |
150 /* Queue entry into fullscreen mode */ | |
151 switch_waiting = 0x01 | SDL_FULLSCREEN; | |
152 switch_time = SDL_GetTicks() + 1500; | |
153 break; | |
154 | |
155 /* Losing input focus? */ | |
156 case IDCMP_INACTIVEWINDOW: | |
157 posted = SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS); | |
158 | |
159 /* Queue leaving fullscreen mode */ | |
160 switch_waiting = 0x01; | |
161 switch_time = SDL_GetTicks() + 200; | |
162 break; | |
163 #endif | |
164 /* Mouse motion? */ | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
165 case IDCMP_MOUSEMOVE: |
0 | 166 if ( SDL_VideoSurface ) { |
167 posted = SDL_PrivateMouseMotion(0, 0, | |
168 msg->MouseX-SDL_Window->BorderLeft, | |
169 msg->MouseY-SDL_Window->BorderTop); | |
170 } | |
171 break; | |
172 | |
173 /* Mouse button press? */ | |
174 case IDCMP_MOUSEBUTTONS: | |
175 | |
176 if(!(code&IECODE_UP_PREFIX)) | |
177 { | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
178 posted = SDL_PrivateMouseButton(SDL_PRESSED, |
0 | 179 amiga_GetButton(code), 0, 0); |
180 } | |
181 /* Mouse button release? */ | |
182 else | |
183 { | |
184 code&=~IECODE_UP_PREFIX; | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
185 posted = SDL_PrivateMouseButton(SDL_RELEASED, |
0 | 186 amiga_GetButton(code), 0, 0); |
187 } | |
188 break; | |
189 | |
190 case IDCMP_RAWKEY: | |
191 | |
192 /* Key press? */ | |
193 | |
194 if( !(code&IECODE_UP_PREFIX) ) | |
195 { | |
196 SDL_keysym keysym; | |
197 posted = SDL_PrivateKeyboard(SDL_PRESSED, | |
198 amiga_TranslateKey(code, &keysym)); | |
199 } | |
200 else | |
201 { | |
202 /* Key release? */ | |
203 | |
204 SDL_keysym keysym; | |
205 code&=~IECODE_UP_PREFIX; | |
206 | |
207 /* Check to see if this is a repeated key */ | |
208 /* if ( ! X11_KeyRepeat(SDL_Display, &xevent) ) */ | |
209 | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
210 posted = SDL_PrivateKeyboard(SDL_RELEASED, |
0 | 211 amiga_TranslateKey(code, &keysym)); |
212 } | |
213 break; | |
214 /* Have we been iconified? */ | |
215 #if 0 | |
216 case UnmapNotify: { | |
217 #ifdef DEBUG_XEVENTS | |
218 printf("UnmapNotify!\n"); | |
219 #endif | |
220 posted=SDL_PrivateAppActive(0, SDL_APPACTIVE|SDL_APPINPUTFOCUS); | |
221 } | |
222 break; | |
223 | |
224 /* Have we been restored? */ | |
225 | |
226 case MapNotify: { | |
227 #ifdef DEBUG_XEVENTS | |
228 printf("MapNotify!\n"); | |
229 #endif | |
230 | |
231 posted = SDL_PrivateAppActive(1, SDL_APPACTIVE); | |
232 | |
233 if ( SDL_VideoSurface && | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
234 (SDL_VideoSurface->flags & SDL_FULLSCREEN) ) |
0 | 235 { |
236 CGX_EnterFullScreen(this); | |
237 } else { | |
238 X11_GrabInputNoLock(this, this->input_grab); | |
239 } | |
240 if ( SDL_VideoSurface ) { | |
241 CGX_RefreshDisplay(this); | |
242 } | |
243 } | |
244 break; | |
245 case Expose: | |
246 if ( SDL_VideoSurface && (xevent.xexpose.count == 0) ) { | |
247 CGX_RefreshDisplay(this); | |
248 } | |
249 break; | |
250 #endif | |
251 | |
252 /* Have we been resized? */ | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
253 case IDCMP_NEWSIZE: |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
254 SDL_PrivateResize(SDL_Window->Width-SDL_Window->BorderLeft-SDL_Window->BorderRight, |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
255 SDL_Window->Height-SDL_Window->BorderTop-SDL_Window->BorderBottom); |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
256 |
0 | 257 break; |
258 | |
259 /* Have we been requested to quit? */ | |
260 case IDCMP_CLOSEWINDOW: | |
261 posted = SDL_PrivateQuit(); | |
262 break; | |
263 | |
264 /* Do we need to refresh ourselves? */ | |
265 | |
266 default: { | |
267 /* Only post the event if we're watching for it */ | |
268 if ( SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE ) { | |
269 SDL_SysWMmsg wmmsg; | |
270 | |
271 SDL_VERSION(&wmmsg.version); | |
272 #if 0 | |
273 wmmsg.subsystem = SDL_SYSWM_CGX; | |
274 wmmsg.event.xevent = xevent; | |
275 #endif | |
276 posted = SDL_PrivateSysWMEvent(&wmmsg); | |
277 } | |
278 } | |
279 break; | |
280 } | |
281 ReplyMsg((struct Message *)msg); | |
282 | |
283 | |
284 return(posted); | |
285 } | |
286 | |
287 void amiga_PumpEvents(_THIS) | |
288 { | |
289 int pending; | |
290 struct IntuiMessage *m; | |
291 | |
292 /* Keep processing pending events */ | |
293 pending = 0; | |
294 while ( m=(struct IntuiMessage *)GetMsg(SDL_Window->UserPort) ) { | |
295 amiga_DispatchEvent(this,m); | |
296 ++pending; | |
297 } | |
298 } | |
299 | |
300 void amiga_InitKeymap(void) | |
301 { | |
302 int i; | |
303 | |
304 /* Map the miscellaneous keys */ | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
305 for ( i=0; i<SDL_arraysize(MISC_keymap); ++i ) |
0 | 306 MISC_keymap[i] = SDLK_UNKNOWN; |
307 | |
308 /* These X keysyms have 0xFF as the high byte */ | |
309 MISC_keymap[65] = SDLK_BACKSPACE; | |
310 MISC_keymap[66] = SDLK_TAB; | |
311 MISC_keymap[70] = SDLK_CLEAR; | |
312 MISC_keymap[70] = SDLK_DELETE; | |
313 MISC_keymap[68] = SDLK_RETURN; | |
314 // MISC_keymap[XK_Pause&0xFF] = SDLK_PAUSE; | |
315 MISC_keymap[69] = SDLK_ESCAPE; | |
316 MISC_keymap[70] = SDLK_DELETE; | |
317 /* | |
318 SDLK_SPACE = 32, | |
319 SDLK_MINUS = 45, | |
320 SDLK_LESS = 60, | |
321 SDLK_COMMA = 44, | |
322 SDLK_PERIOD = 46, | |
323 SDLK_0 = 48, | |
324 SDLK_1 = 49, | |
325 SDLK_2 = 50, | |
326 SDLK_3 = 51, | |
327 SDLK_4 = 52, | |
328 SDLK_5 = 53, | |
329 SDLK_6 = 54, | |
330 SDLK_7 = 55, | |
331 SDLK_8 = 56, | |
332 SDLK_9 = 57, | |
333 SDLK_BACKQUOTE = 96, | |
334 SDLK_BACKSLASH = 92, | |
335 SDLK_a = 97, | |
336 SDLK_b = 98, | |
337 SDLK_c = 99, | |
338 SDLK_d = 100, | |
339 SDLK_e = 101, | |
340 SDLK_f = 102, | |
341 SDLK_g = 103, | |
342 SDLK_h = 104, | |
343 SDLK_i = 105, | |
344 SDLK_j = 106, | |
345 SDLK_k = 107, | |
346 SDLK_l = 108, | |
347 SDLK_m = 109, | |
348 SDLK_n = 110, | |
349 SDLK_o = 111, | |
350 SDLK_p = 112, | |
351 SDLK_q = 113, | |
352 SDLK_r = 114, | |
353 SDLK_s = 115, | |
354 SDLK_t = 116, | |
355 SDLK_u = 117, | |
356 SDLK_v = 118, | |
357 SDLK_w = 119, | |
358 SDLK_x = 120, | |
359 SDLK_y = 121, | |
360 SDLK_z = 122, | |
361 */ | |
362 MISC_keymap[15] = SDLK_KP0; /* Keypad 0-9 */ | |
363 MISC_keymap[29] = SDLK_KP1; | |
364 MISC_keymap[30] = SDLK_KP2; | |
365 MISC_keymap[31] = SDLK_KP3; | |
366 MISC_keymap[45] = SDLK_KP4; | |
367 MISC_keymap[46] = SDLK_KP5; | |
368 MISC_keymap[47] = SDLK_KP6; | |
369 MISC_keymap[61] = SDLK_KP7; | |
370 MISC_keymap[62] = SDLK_KP8; | |
371 MISC_keymap[63] = SDLK_KP9; | |
372 MISC_keymap[60] = SDLK_KP_PERIOD; | |
373 MISC_keymap[92] = SDLK_KP_DIVIDE; | |
374 MISC_keymap[93] = SDLK_KP_MULTIPLY; | |
375 MISC_keymap[74] = SDLK_KP_MINUS; | |
376 MISC_keymap[94] = SDLK_KP_PLUS; | |
377 MISC_keymap[67] = SDLK_KP_ENTER; | |
378 // MISC_keymap[XK_KP_Equal&0xFF] = SDLK_KP_EQUALS; | |
379 | |
380 MISC_keymap[76] = SDLK_UP; | |
381 MISC_keymap[77] = SDLK_DOWN; | |
382 MISC_keymap[78] = SDLK_RIGHT; | |
383 MISC_keymap[79] = SDLK_LEFT; | |
384 /* | |
385 MISC_keymap[XK_Insert&0xFF] = SDLK_INSERT; | |
386 MISC_keymap[XK_Home&0xFF] = SDLK_HOME; | |
387 MISC_keymap[XK_End&0xFF] = SDLK_END; | |
388 */ | |
389 // Mappati sulle parentesi del taastierino | |
390 MISC_keymap[90] = SDLK_PAGEUP; | |
391 MISC_keymap[91] = SDLK_PAGEDOWN; | |
392 | |
393 MISC_keymap[80] = SDLK_F1; | |
394 MISC_keymap[81] = SDLK_F2; | |
395 MISC_keymap[82] = SDLK_F3; | |
396 MISC_keymap[83] = SDLK_F4; | |
397 MISC_keymap[84] = SDLK_F5; | |
398 MISC_keymap[85] = SDLK_F6; | |
399 MISC_keymap[86] = SDLK_F7; | |
400 MISC_keymap[87] = SDLK_F8; | |
401 MISC_keymap[88] = SDLK_F9; | |
402 MISC_keymap[89] = SDLK_F10; | |
403 // MISC_keymap[XK_F11&0xFF] = SDLK_F11; | |
404 // MISC_keymap[XK_F12&0xFF] = SDLK_F12; | |
405 // MISC_keymap[XK_F13&0xFF] = SDLK_F13; | |
406 // MISC_keymap[XK_F14&0xFF] = SDLK_F14; | |
407 // MISC_keymap[XK_F15&0xFF] = SDLK_F15; | |
408 | |
409 // MISC_keymap[XK_Num_Lock&0xFF] = SDLK_NUMLOCK; | |
410 MISC_keymap[98] = SDLK_CAPSLOCK; | |
411 // MISC_keymap[XK_Scroll_Lock&0xFF] = SDLK_SCROLLOCK; | |
412 MISC_keymap[97] = SDLK_RSHIFT; | |
413 MISC_keymap[96] = SDLK_LSHIFT; | |
414 MISC_keymap[99] = SDLK_LCTRL; | |
415 MISC_keymap[99] = SDLK_LCTRL; | |
416 MISC_keymap[101] = SDLK_RALT; | |
417 MISC_keymap[100] = SDLK_LALT; | |
418 // MISC_keymap[XK_Meta_R&0xFF] = SDLK_RMETA; | |
419 // MISC_keymap[XK_Meta_L&0xFF] = SDLK_LMETA; | |
420 MISC_keymap[103] = SDLK_LSUPER; /* Left "Windows" */ | |
421 MISC_keymap[102] = SDLK_RSUPER; /* Right "Windows */ | |
422 | |
423 MISC_keymap[95] = SDLK_HELP; | |
424 } | |
425 | |
426 SDL_keysym *amiga_TranslateKey(int code, SDL_keysym *keysym) | |
427 { | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
428 #ifdef STORMC4_WOS |
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
429 static struct Library *KeymapBase=NULL; /* Linking failed in WOS version if ConsoleDevice was used */ |
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
430 #else |
0 | 431 static struct Library *ConsoleDevice=NULL; |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
432 #endif |
0 | 433 |
434 /* Get the raw keyboard scancode */ | |
435 keysym->scancode = code; | |
436 keysym->sym = MISC_keymap[code]; | |
437 | |
438 #ifdef DEBUG_KEYS | |
439 fprintf(stderr, "Translating key 0x%.4x (%d)\n", xsym, xkey->keycode); | |
440 #endif | |
441 /* Get the translated SDL virtual keysym */ | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
442 if ( keysym->sym==SDLK_UNKNOWN ) |
0 | 443 { |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
444 #ifdef STORMC4_WOS |
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
445 if(!KeymapBase) |
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
446 #else |
0 | 447 if(!ConsoleDevice) |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
448 #endif |
0 | 449 { |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
450 #ifdef STORMC4_WOS |
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
451 KeymapBase=OpenLibrary("keymap.library", 0L); |
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
452 #else |
0 | 453 if(ConPort=CreateMsgPort()) |
454 { | |
455 if(ConReq=CreateIORequest(ConPort,sizeof(struct IOStdReq))) | |
456 { | |
457 if(!OpenDevice("console.device",-1,(struct IORequest *)ConReq,0)) | |
458 ConsoleDevice=(struct Library *)ConReq->io_Device; | |
459 else | |
460 { | |
461 DeleteIORequest(ConReq); | |
462 ConReq=NULL; | |
463 } | |
464 } | |
465 else | |
466 { | |
467 DeleteMsgPort(ConPort); | |
468 ConPort=NULL; | |
469 } | |
470 } | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
471 #endif |
0 | 472 } |
473 | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
474 #ifdef STORMC4_WOS |
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
475 if(KeymapBase) |
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
476 #else |
0 | 477 if(ConsoleDevice) |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
478 #endif |
0 | 479 { |
480 struct InputEvent event; | |
481 long actual; | |
482 char buffer[5]; | |
483 | |
484 event.ie_Qualifier=0; | |
485 event.ie_Class=IECLASS_RAWKEY; | |
486 event.ie_SubClass=0L; | |
487 event.ie_Code=code; | |
488 event.ie_X=event.ie_Y=0; | |
489 event.ie_EventAddress=NULL; | |
490 event.ie_NextEvent=NULL; | |
491 event.ie_Prev1DownCode=event.ie_Prev1DownQual=event.ie_Prev2DownCode=event.ie_Prev2DownQual=0; | |
492 | |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
493 #ifdef STORMC4_WOS |
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
494 if( (actual=MapRawKey(&event,buffer,5,NULL))>=0) |
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
495 #else |
0 | 496 if( (actual=RawKeyConvert(&event,buffer,5,NULL))>=0) |
255
dcb5e869f8b5
Updated Amiga port by Gabriele Greco
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
497 #endif |
0 | 498 { |
499 if(actual>1) | |
500 { | |
501 D(bug("Warning (%ld) character conversion!\n",actual)); | |
502 } | |
503 else if(actual==1) | |
504 { | |
505 keysym->sym=*buffer; | |
506 D(bug("Converted rawcode %ld to <%lc>\n",code,*buffer)); | |
507 // Bufferizzo x le successive chiamate! | |
508 MISC_keymap[code]=*buffer; | |
509 } | |
510 } | |
511 } | |
512 | |
513 } | |
514 keysym->mod = KMOD_NONE; | |
515 | |
516 /* If UNICODE is on, get the UNICODE value for the key */ | |
517 keysym->unicode = 0; | |
518 if ( SDL_TranslateUNICODE ) { | |
519 #if 0 | |
520 static XComposeStatus state; | |
521 /* Until we handle the IM protocol, use XLookupString() */ | |
522 unsigned char keybuf[32]; | |
523 if ( XLookupString(xkey, (char *)keybuf, sizeof(keybuf), | |
524 NULL, &state) ) { | |
525 keysym->unicode = keybuf[0]; | |
526 } | |
527 #endif | |
528 } | |
529 return(keysym); | |
530 } | |
531 | |
532 void amiga_InitOSKeymap(_THIS) | |
533 { | |
534 amiga_InitKeymap(); | |
535 } |