e14743d1 |
1 | /* |
2 | SDL - Simple DirectMedia Layer |
3 | Copyright (C) 1997-2009 Sam Lantinga |
4 | |
5 | This library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 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 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with this library; if not, write to the Free Software |
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
18 | |
19 | Sam Lantinga |
20 | slouken@libsdl.org |
21 | */ |
22 | #include "SDL_config.h" |
23 | |
24 | /* |
25 | * Atari keyboard events manager, using Gemdos |
26 | * |
27 | * Patrice Mandin |
28 | */ |
29 | |
30 | /* Mint includes */ |
31 | #include <mint/osbind.h> |
32 | #include <mint/cookie.h> |
33 | |
34 | #include "../../events/SDL_sysevents.h" |
35 | #include "../../events/SDL_events_c.h" |
36 | |
37 | #include "SDL_atarikeys.h" |
38 | #include "SDL_atarievents_c.h" |
39 | #include "SDL_xbiosevents_c.h" |
40 | #include "SDL_ataridevmouse_c.h" |
41 | |
42 | /* To save state of keyboard */ |
43 | |
44 | static unsigned char gemdos_currentkeyboard[ATARIBIOS_MAXKEYS]; |
45 | static unsigned char gemdos_previouskeyboard[ATARIBIOS_MAXKEYS]; |
46 | static SDL_bool use_dev_mouse = SDL_FALSE; |
47 | |
48 | #ifndef DEV_BUSY |
49 | enum { |
50 | DEV_BUSY=0, |
51 | DEV_READY |
52 | }; |
53 | #endif |
54 | |
55 | static void UpdateSpecialKeys(int special_keys_state); |
56 | |
57 | void AtariGemdos_InitOSKeymap(_THIS) |
58 | { |
59 | int i, vectors_mask; |
60 | unsigned long dummy; |
61 | |
62 | SDL_memset(gemdos_currentkeyboard, 0, sizeof(gemdos_currentkeyboard)); |
63 | SDL_memset(gemdos_previouskeyboard, 0, sizeof(gemdos_previouskeyboard)); |
64 | |
65 | use_dev_mouse = (SDL_AtariDevMouse_Open()!=0) ? SDL_TRUE : SDL_FALSE; |
66 | |
67 | vectors_mask = ATARI_XBIOS_JOYSTICKEVENTS; /* XBIOS joystick events */ |
68 | if (!use_dev_mouse) { |
69 | vectors_mask |= ATARI_XBIOS_MOUSEEVENTS; /* XBIOS mouse events */ |
70 | } |
71 | /* if (Getcookie(C_MiNT, &dummy)==C_FOUND) { |
72 | vectors_mask = 0; |
73 | }*/ |
74 | SDL_AtariXbios_InstallVectors(vectors_mask); |
75 | } |
76 | |
77 | void AtariGemdos_PumpEvents(_THIS) |
78 | { |
79 | int i; |
80 | SDL_keysym keysym; |
81 | |
82 | /* Update pressed keys */ |
83 | SDL_memset(gemdos_currentkeyboard, 0, ATARIBIOS_MAXKEYS); |
84 | |
85 | while (Cconis()!=DEV_BUSY) { |
86 | unsigned long key_pressed; |
87 | key_pressed=Cnecin(); |
88 | gemdos_currentkeyboard[(key_pressed>>16)&(ATARIBIOS_MAXKEYS-1)]=0xFF; |
89 | } |
90 | |
91 | /* Read special keys */ |
92 | UpdateSpecialKeys(Kbshift(-1)); |
93 | |
94 | /* Now generate events */ |
95 | for (i=0; i<ATARIBIOS_MAXKEYS; i++) { |
96 | /* Key pressed ? */ |
97 | if (gemdos_currentkeyboard[i] && !gemdos_previouskeyboard[i]) |
98 | SDL_PrivateKeyboard(SDL_PRESSED, |
99 | SDL_Atari_TranslateKey(i, &keysym, SDL_TRUE)); |
100 | |
101 | /* Key unpressed ? */ |
102 | if (gemdos_previouskeyboard[i] && !gemdos_currentkeyboard[i]) |
103 | SDL_PrivateKeyboard(SDL_RELEASED, |
104 | SDL_Atari_TranslateKey(i, &keysym, SDL_FALSE)); |
105 | } |
106 | |
107 | if (use_dev_mouse) { |
108 | SDL_AtariDevMouse_PostMouseEvents(this, SDL_TRUE); |
109 | } else { |
110 | SDL_AtariXbios_PostMouseEvents(this, SDL_TRUE); |
111 | } |
112 | |
113 | /* Will be previous table */ |
114 | SDL_memcpy(gemdos_previouskeyboard, gemdos_currentkeyboard, sizeof(gemdos_previouskeyboard)); |
115 | } |
116 | |
117 | static void UpdateSpecialKeys(int special_keys_state) |
118 | { |
119 | #define UPDATE_SPECIAL_KEYS(numbit,scancode) \ |
120 | { \ |
121 | if (special_keys_state & (1<<(numbit))) { \ |
122 | gemdos_currentkeyboard[scancode]=0xFF; \ |
123 | } \ |
124 | } |
125 | |
126 | UPDATE_SPECIAL_KEYS(K_RSHIFT, SCANCODE_RIGHTSHIFT); |
127 | UPDATE_SPECIAL_KEYS(K_LSHIFT, SCANCODE_LEFTSHIFT); |
128 | UPDATE_SPECIAL_KEYS(K_CTRL, SCANCODE_LEFTCONTROL); |
129 | UPDATE_SPECIAL_KEYS(K_ALT, SCANCODE_LEFTALT); |
130 | UPDATE_SPECIAL_KEYS(K_CAPSLOCK, SCANCODE_CAPSLOCK); |
131 | } |
132 | |
133 | void AtariGemdos_ShutdownEvents(void) |
134 | { |
135 | SDL_AtariXbios_RestoreVectors(); |
136 | if (use_dev_mouse) { |
137 | SDL_AtariDevMouse_Close(); |
138 | } |
139 | } |