Mercurial > sdl-ios-xcode
comparison src/video/wscons/SDL_wsconsevents.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | 56f952883795 |
children | e27bdcc80744 |
comparison
equal
deleted
inserted
replaced
1894:c69cee13dd76 | 1895:c121d94672cb |
---|---|
22 #include "SDL_config.h" | 22 #include "SDL_config.h" |
23 | 23 |
24 #include <sys/types.h> | 24 #include <sys/types.h> |
25 #include <dev/wscons/wsdisplay_usl_io.h> | 25 #include <dev/wscons/wsdisplay_usl_io.h> |
26 #include <sys/ioctl.h> | 26 #include <sys/ioctl.h> |
27 #include <fcntl.h> | 27 #include <fcntl.h> |
28 #include <unistd.h> | 28 #include <unistd.h> |
29 #include <termios.h> | 29 #include <termios.h> |
30 #include <errno.h> | 30 #include <errno.h> |
31 #include <string.h> | 31 #include <string.h> |
32 | 32 |
33 #include "SDL.h" | 33 #include "SDL.h" |
34 #include "../../events/SDL_sysevents.h" | 34 #include "../../events/SDL_sysevents.h" |
35 #include "../../events/SDL_events_c.h" | 35 #include "../../events/SDL_events_c.h" |
36 #include "SDL_wsconsvideo.h" | 36 #include "SDL_wsconsvideo.h" |
37 #include "SDL_wsconsevents_c.h" | 37 #include "SDL_wsconsevents_c.h" |
38 | 38 |
39 static int posted = 0; | 39 static int posted = 0; |
40 | 40 |
41 int WSCONS_InitKeyboard(_THIS) | 41 int |
42 { | 42 WSCONS_InitKeyboard(_THIS) |
43 struct termios tty; | 43 { |
44 | 44 struct termios tty; |
45 if (ioctl(private->fd, WSKBDIO_GTYPE, &private->kbdType) == -1) { | 45 |
46 WSCONS_ReportError("cannot get keyboard type: %s", strerror(errno)); | 46 if (ioctl(private->fd, WSKBDIO_GTYPE, &private->kbdType) == -1) { |
47 return -1; | 47 WSCONS_ReportError("cannot get keyboard type: %s", strerror(errno)); |
48 } | 48 return -1; |
49 | 49 } |
50 if (tcgetattr(private->fd, &private->saved_tty) == -1) { | 50 |
51 WSCONS_ReportError("cannot get terminal attributes: %s", strerror(errno)); | 51 if (tcgetattr(private->fd, &private->saved_tty) == -1) { |
52 return -1; | 52 WSCONS_ReportError("cannot get terminal attributes: %s", |
53 } | 53 strerror(errno)); |
54 private->did_save_tty = 1; | 54 return -1; |
55 tty = private->saved_tty; | 55 } |
56 tty.c_iflag = IGNPAR | IGNBRK; | 56 private->did_save_tty = 1; |
57 tty.c_oflag = 0; | 57 tty = private->saved_tty; |
58 tty.c_cflag = CREAD | CS8; | 58 tty.c_iflag = IGNPAR | IGNBRK; |
59 tty.c_lflag = 0; | 59 tty.c_oflag = 0; |
60 tty.c_cc[VTIME] = 0; | 60 tty.c_cflag = CREAD | CS8; |
61 tty.c_cc[VMIN] = 1; | 61 tty.c_lflag = 0; |
62 cfsetispeed(&tty, 9600); | 62 tty.c_cc[VTIME] = 0; |
63 cfsetospeed(&tty, 9600); | 63 tty.c_cc[VMIN] = 1; |
64 if (tcsetattr(private->fd, TCSANOW, &tty) < 0) { | 64 cfsetispeed(&tty, 9600); |
65 WSCONS_ReportError("cannot set terminal attributes: %s", strerror(errno)); | 65 cfsetospeed(&tty, 9600); |
66 return -1; | 66 if (tcsetattr(private->fd, TCSANOW, &tty) < 0) { |
67 } | 67 WSCONS_ReportError("cannot set terminal attributes: %s", |
68 if (ioctl(private->fd, KDSKBMODE, K_RAW) == -1) { | 68 strerror(errno)); |
69 WSCONS_ReportError("cannot set raw keyboard mode: %s", strerror(errno)); | 69 return -1; |
70 return -1; | 70 } |
71 } | 71 if (ioctl(private->fd, KDSKBMODE, K_RAW) == -1) { |
72 | 72 WSCONS_ReportError("cannot set raw keyboard mode: %s", |
73 return 0; | 73 strerror(errno)); |
74 } | 74 return -1; |
75 | 75 } |
76 void WSCONS_ReleaseKeyboard(_THIS) | 76 |
77 { | 77 return 0; |
78 if (private->fd != -1) { | 78 } |
79 if (ioctl(private->fd, KDSKBMODE, K_XLATE) == -1) { | 79 |
80 WSCONS_ReportError("cannot restore keyboard to translated mode: %s", | 80 void |
81 strerror(errno)); | 81 WSCONS_ReleaseKeyboard(_THIS) |
82 } | 82 { |
83 if (private->did_save_tty) { | 83 if (private->fd != -1) { |
84 if (tcsetattr(private->fd, TCSANOW, &private->saved_tty) < 0) { | 84 if (ioctl(private->fd, KDSKBMODE, K_XLATE) == -1) { |
85 WSCONS_ReportError("cannot restore keynoard attributes: %s", | 85 WSCONS_ReportError |
86 strerror(errno)); | 86 ("cannot restore keyboard to translated mode: %s", |
87 } | 87 strerror(errno)); |
88 } | 88 } |
89 } | 89 if (private->did_save_tty) { |
90 } | 90 if (tcsetattr(private->fd, TCSANOW, &private->saved_tty) < 0) { |
91 | 91 WSCONS_ReportError |
92 static void updateMouse() | 92 ("cannot restore keynoard attributes: %s", |
93 strerror(errno)); | |
94 } | |
95 } | |
96 } | |
97 } | |
98 | |
99 static void | |
100 updateMouse() | |
93 { | 101 { |
94 } | 102 } |
95 | 103 |
96 static SDLKey keymap[128]; | 104 static SDLKey keymap[128]; |
97 | 105 |
98 static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym) | 106 static SDL_keysym * |
99 { | 107 TranslateKey(int scancode, SDL_keysym * keysym) |
100 keysym->scancode = scancode; | 108 { |
101 keysym->sym = SDLK_UNKNOWN; | 109 keysym->scancode = scancode; |
102 keysym->mod = KMOD_NONE; | 110 keysym->sym = SDLK_UNKNOWN; |
103 | 111 keysym->mod = KMOD_NONE; |
104 if (scancode < SDL_arraysize(keymap)) | 112 |
105 keysym->sym = keymap[scancode]; | 113 if (scancode < SDL_arraysize(keymap)) |
106 | 114 keysym->sym = keymap[scancode]; |
107 if (keysym->sym == SDLK_UNKNOWN) | 115 |
108 printf("Unknown mapping for scancode %d\n", scancode); | 116 if (keysym->sym == SDLK_UNKNOWN) |
109 | 117 printf("Unknown mapping for scancode %d\n", scancode); |
110 return keysym; | 118 |
111 } | 119 return keysym; |
112 | 120 } |
113 static void updateKeyboard(_THIS) | 121 |
114 { | 122 static void |
115 unsigned char buf[100]; | 123 updateKeyboard(_THIS) |
116 SDL_keysym keysym; | 124 { |
117 int n, i; | 125 unsigned char buf[100]; |
118 | 126 SDL_keysym keysym; |
119 if ((n = read(private->fd, buf, sizeof(buf))) > 0) { | 127 int n, i; |
120 for (i = 0; i < n; i++) { | 128 |
121 unsigned char c = buf[i] & 0x7f; | 129 if ((n = read(private->fd, buf, sizeof(buf))) > 0) { |
122 if (c == 224) // special key prefix -- what should we do with it? | 130 for (i = 0; i < n; i++) { |
123 continue; | 131 unsigned char c = buf[i] & 0x7f; |
124 posted += SDL_PrivateKeyboard((buf[i] & 0x80) ? SDL_RELEASED : SDL_PRESSED, | 132 if (c == 224) // special key prefix -- what should we do with it? |
125 TranslateKey(c, &keysym)); | 133 continue; |
126 } | 134 posted += |
127 } | 135 SDL_PrivateKeyboard((buf[i] & 0x80) ? SDL_RELEASED : |
128 } | 136 SDL_PRESSED, TranslateKey(c, &keysym)); |
129 | 137 } |
130 void WSCONS_PumpEvents(_THIS) | 138 } |
131 { | 139 } |
132 do { | 140 |
133 posted = 0; | 141 void |
134 updateMouse(); | 142 WSCONS_PumpEvents(_THIS) |
135 updateKeyboard(this); | 143 { |
136 } while (posted); | 144 do { |
137 } | 145 posted = 0; |
138 | 146 updateMouse(); |
139 void WSCONS_InitOSKeymap(_THIS) | 147 updateKeyboard(this); |
140 { | 148 } |
141 int i; | 149 while (posted); |
142 | 150 } |
143 /* Make sure unknown keys are mapped correctly */ | 151 |
144 for (i=0; i < SDL_arraysize(keymap); i++) { | 152 void |
145 keymap[i] = SDLK_UNKNOWN; | 153 WSCONS_InitOSKeymap(_THIS) |
146 } | 154 { |
147 | 155 int i; |
148 switch (private->kbdType) { | 156 |
157 /* Make sure unknown keys are mapped correctly */ | |
158 for (i = 0; i < SDL_arraysize(keymap); i++) { | |
159 keymap[i] = SDLK_UNKNOWN; | |
160 } | |
161 | |
162 switch (private->kbdType) { | |
149 #ifdef WSKBD_TYPE_ZAURUS | 163 #ifdef WSKBD_TYPE_ZAURUS |
150 case WSKBD_TYPE_ZAURUS: | 164 case WSKBD_TYPE_ZAURUS: |
151 /* top row */ | 165 /* top row */ |
152 keymap[2] = SDLK_1; | 166 keymap[2] = SDLK_1; |
153 keymap[3] = SDLK_2; | 167 keymap[3] = SDLK_2; |
154 keymap[4] = SDLK_3; | 168 keymap[4] = SDLK_3; |
155 keymap[5] = SDLK_4; | 169 keymap[5] = SDLK_4; |
156 keymap[6] = SDLK_5; | 170 keymap[6] = SDLK_5; |
157 keymap[7] = SDLK_6; | 171 keymap[7] = SDLK_6; |
158 keymap[8] = SDLK_7; | 172 keymap[8] = SDLK_7; |
159 keymap[9] = SDLK_8; | 173 keymap[9] = SDLK_8; |
160 keymap[10] = SDLK_9; | 174 keymap[10] = SDLK_9; |
161 keymap[11] = SDLK_0; | 175 keymap[11] = SDLK_0; |
162 keymap[14] = SDLK_BACKSPACE; | 176 keymap[14] = SDLK_BACKSPACE; |
163 | 177 |
164 /* second row */ | 178 /* second row */ |
165 keymap[16] = SDLK_q; | 179 keymap[16] = SDLK_q; |
166 keymap[17] = SDLK_w; | 180 keymap[17] = SDLK_w; |
167 keymap[18] = SDLK_e; | 181 keymap[18] = SDLK_e; |
168 keymap[19] = SDLK_r; | 182 keymap[19] = SDLK_r; |
169 keymap[20] = SDLK_t; | 183 keymap[20] = SDLK_t; |
170 keymap[21] = SDLK_y; | 184 keymap[21] = SDLK_y; |
171 keymap[22] = SDLK_u; | 185 keymap[22] = SDLK_u; |
172 keymap[23] = SDLK_i; | 186 keymap[23] = SDLK_i; |
173 keymap[24] = SDLK_o; | 187 keymap[24] = SDLK_o; |
174 keymap[25] = SDLK_p; | 188 keymap[25] = SDLK_p; |
175 | 189 |
176 /* third row */ | 190 /* third row */ |
177 keymap[15] = SDLK_TAB; | 191 keymap[15] = SDLK_TAB; |
178 keymap[30] = SDLK_a; | 192 keymap[30] = SDLK_a; |
179 keymap[31] = SDLK_s; | 193 keymap[31] = SDLK_s; |
180 keymap[32] = SDLK_d; | 194 keymap[32] = SDLK_d; |
181 keymap[33] = SDLK_f; | 195 keymap[33] = SDLK_f; |
182 keymap[34] = SDLK_g; | 196 keymap[34] = SDLK_g; |
183 keymap[35] = SDLK_h; | 197 keymap[35] = SDLK_h; |
184 keymap[36] = SDLK_j; | 198 keymap[36] = SDLK_j; |
185 keymap[37] = SDLK_k; | 199 keymap[37] = SDLK_k; |
186 keymap[38] = SDLK_l; | 200 keymap[38] = SDLK_l; |
187 | 201 |
188 /* fourth row */ | 202 /* fourth row */ |
189 keymap[42] = SDLK_LSHIFT; | 203 keymap[42] = SDLK_LSHIFT; |
190 keymap[44] = SDLK_z; | 204 keymap[44] = SDLK_z; |
191 keymap[45] = SDLK_x; | 205 keymap[45] = SDLK_x; |
192 keymap[46] = SDLK_c; | 206 keymap[46] = SDLK_c; |
193 keymap[47] = SDLK_v; | 207 keymap[47] = SDLK_v; |
194 keymap[48] = SDLK_b; | 208 keymap[48] = SDLK_b; |
195 keymap[49] = SDLK_n; | 209 keymap[49] = SDLK_n; |
196 keymap[50] = SDLK_m; | 210 keymap[50] = SDLK_m; |
197 keymap[54] = SDLK_RSHIFT; | 211 keymap[54] = SDLK_RSHIFT; |
198 keymap[28] = SDLK_RETURN; | 212 keymap[28] = SDLK_RETURN; |
199 | 213 |
200 /* fifth row */ | 214 /* fifth row */ |
201 keymap[56] = SDLK_LALT; | 215 keymap[56] = SDLK_LALT; |
202 keymap[29] = SDLK_LCTRL; | 216 keymap[29] = SDLK_LCTRL; |
203 /* keymap[56] = ; */ | 217 /* keymap[56] = ; */ |
204 keymap[0] = SDLK_LSUPER; | 218 keymap[0] = SDLK_LSUPER; |
205 keymap[12] = SDLK_MINUS; | 219 keymap[12] = SDLK_MINUS; |
206 keymap[57] = SDLK_SPACE; | 220 keymap[57] = SDLK_SPACE; |
207 keymap[51] = SDLK_COMMA; | 221 keymap[51] = SDLK_COMMA; |
208 keymap[52] = SDLK_PERIOD; | 222 keymap[52] = SDLK_PERIOD; |
209 | 223 |
210 /* misc */ | 224 /* misc */ |
211 keymap[59] = SDLK_F1; | 225 keymap[59] = SDLK_F1; |
212 keymap[60] = SDLK_F2; | 226 keymap[60] = SDLK_F2; |
213 keymap[61] = SDLK_F3; | 227 keymap[61] = SDLK_F3; |
214 keymap[62] = SDLK_F4; | 228 keymap[62] = SDLK_F4; |
215 keymap[63] = SDLK_F5; | 229 keymap[63] = SDLK_F5; |
216 keymap[1] = SDLK_ESCAPE; | 230 keymap[1] = SDLK_ESCAPE; |
217 /* keymap[28] = SDLK_KP_ENTER; */ | 231 /* keymap[28] = SDLK_KP_ENTER; */ |
218 keymap[72] = SDLK_UP; | 232 keymap[72] = SDLK_UP; |
219 keymap[75] = SDLK_LEFT; | 233 keymap[75] = SDLK_LEFT; |
220 keymap[77] = SDLK_RIGHT; | 234 keymap[77] = SDLK_RIGHT; |
221 keymap[80] = SDLK_DOWN; | 235 keymap[80] = SDLK_DOWN; |
222 break; | 236 break; |
223 #endif /* WSKBD_TYPE_ZAURUS */ | 237 #endif /* WSKBD_TYPE_ZAURUS */ |
224 | 238 |
225 default: | 239 default: |
226 WSCONS_ReportError("Unable to map keys for keyboard type %u", | 240 WSCONS_ReportError("Unable to map keys for keyboard type %u", |
227 private->kbdType); | 241 private->kbdType); |
228 break; | 242 break; |
229 } | 243 } |
230 } | 244 } |
231 | 245 |
232 /* end of SDL_wsconsevents.c ... */ | 246 /* end of SDL_wsconsevents.c ... */ |
233 | 247 /* vi: set ts=4 sw=4 expandtab: */ |