Mercurial > sdl-ios-xcode
annotate src/video/wscons/SDL_wsconsevents.c @ 1327:d12a63a8d95a
Resolved bug #130
Use XFilterEvent() to handle dead-key composition under X11
Cleaned up the code in preparation for 1.3 API changes
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 04 Feb 2006 08:35:11 +0000 |
parents | c9b51268668f |
children | 19418e4422cb |
rev | line source |
---|---|
1187 | 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:
1187
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
1187 | 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:
1187
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
1187 | 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:
1187
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
1187 | 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:
1187
diff
changeset
|
13 Lesser General Public License for more details. |
1187 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1187
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:
1187
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:
1187
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
1187 | 18 |
19 Sam Lantinga | |
20 slouken@libsdl.org | |
21 */ | |
22 | |
23 #include <sys/types.h> | |
24 #include <dev/wscons/wsdisplay_usl_io.h> | |
25 #include <sys/ioctl.h> | |
26 #include <fcntl.h> | |
27 #include <unistd.h> | |
28 #include <termios.h> | |
29 #include <errno.h> | |
30 #include <string.h> | |
31 | |
32 #include "SDL.h" | |
33 #include "SDL_sysevents.h" | |
34 #include "SDL_events_c.h" | |
35 #include "SDL_wsconsvideo.h" | |
36 #include "SDL_wsconsevents_c.h" | |
37 | |
38 static int posted = 0; | |
39 | |
40 int WSCONS_InitKeyboard(_THIS) | |
41 { | |
42 struct termios tty; | |
43 | |
44 if (ioctl(private->fd, WSKBDIO_GTYPE, &private->kbdType) == -1) { | |
45 WSCONS_ReportError("cannot get keyboard type: %s", strerror(errno)); | |
46 return -1; | |
47 } | |
48 | |
49 if (tcgetattr(private->fd, &private->saved_tty) == -1) { | |
50 WSCONS_ReportError("cannot get terminal attributes: %s", strerror(errno)); | |
51 return -1; | |
52 } | |
53 private->did_save_tty = 1; | |
54 tty = private->saved_tty; | |
55 tty.c_iflag = IGNPAR | IGNBRK; | |
56 tty.c_oflag = 0; | |
57 tty.c_cflag = CREAD | CS8; | |
58 tty.c_lflag = 0; | |
59 tty.c_cc[VTIME] = 0; | |
60 tty.c_cc[VMIN] = 1; | |
61 cfsetispeed(&tty, 9600); | |
62 cfsetospeed(&tty, 9600); | |
63 if (tcsetattr(private->fd, TCSANOW, &tty) < 0) { | |
64 WSCONS_ReportError("cannot set terminal attributes: %s", strerror(errno)); | |
65 return -1; | |
66 } | |
67 if (ioctl(private->fd, KDSKBMODE, K_RAW) == -1) { | |
68 WSCONS_ReportError("cannot set raw keyboard mode: %s", strerror(errno)); | |
69 return -1; | |
70 } | |
71 | |
72 return 0; | |
73 } | |
74 | |
75 void WSCONS_ReleaseKeyboard(_THIS) | |
76 { | |
77 if (private->fd != -1) { | |
78 if (ioctl(private->fd, KDSKBMODE, K_XLATE) == -1) { | |
79 WSCONS_ReportError("cannot restore keyboard to translated mode: %s", | |
80 strerror(errno)); | |
81 } | |
82 if (private->did_save_tty) { | |
83 if (tcsetattr(private->fd, TCSANOW, &private->saved_tty) < 0) { | |
84 WSCONS_ReportError("cannot restore keynoard attributes: %s", | |
85 strerror(errno)); | |
86 } | |
87 } | |
88 } | |
89 } | |
90 | |
91 static void updateMouse() | |
92 { | |
93 } | |
94 | |
95 static SDLKey keymap[128]; | |
96 | |
97 static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym) | |
98 { | |
99 keysym->scancode = scancode; | |
100 keysym->sym = SDLK_UNKNOWN; | |
101 keysym->mod = KMOD_NONE; | |
102 | |
103 if (scancode < SDL_TABLESIZE(keymap)) | |
104 keysym->sym = keymap[scancode]; | |
105 | |
106 if (keysym->sym == SDLK_UNKNOWN) | |
107 printf("Unknown mapping for scancode %d\n", scancode); | |
108 | |
109 return keysym; | |
110 } | |
111 | |
112 static void updateKeyboard(_THIS) | |
113 { | |
114 unsigned char buf[100]; | |
115 SDL_keysym keysym; | |
116 int n, i; | |
117 | |
118 if ((n = read(private->fd, buf, sizeof(buf))) > 0) { | |
119 for (i = 0; i < n; i++) { | |
120 char c = buf[i] & 0x7f; | |
121 if (c == 224) // special key prefix -- what should we do with it? | |
122 continue; | |
123 int release = (buf[i] & 0x80) != 0; | |
124 posted += SDL_PrivateKeyboard(release ? SDL_RELEASED : SDL_PRESSED, | |
125 TranslateKey(c, &keysym)); | |
126 } | |
127 } | |
128 } | |
129 | |
130 void WSCONS_PumpEvents(_THIS) | |
131 { | |
132 do { | |
133 posted = 0; | |
134 updateMouse(); | |
135 updateKeyboard(this); | |
136 } while (posted); | |
137 } | |
138 | |
139 void WSCONS_InitOSKeymap(_THIS) | |
140 { | |
141 int i; | |
142 | |
143 /* Make sure unknown keys are mapped correctly */ | |
144 for (i=0; i < SDL_TABLESIZE(keymap); i++) { | |
145 keymap[i] = SDLK_UNKNOWN; | |
146 } | |
147 | |
148 switch (private->kbdType) { | |
149 case WSKBD_TYPE_ZAURUS: | |
150 /* top row */ | |
151 keymap[2] = SDLK_1; | |
152 keymap[3] = SDLK_2; | |
153 keymap[4] = SDLK_3; | |
154 keymap[5] = SDLK_4; | |
155 keymap[6] = SDLK_5; | |
156 keymap[7] = SDLK_6; | |
157 keymap[8] = SDLK_7; | |
158 keymap[9] = SDLK_8; | |
159 keymap[10] = SDLK_9; | |
160 keymap[11] = SDLK_0; | |
161 keymap[14] = SDLK_BACKSPACE; | |
162 | |
163 /* second row */ | |
164 keymap[16] = SDLK_q; | |
165 keymap[17] = SDLK_w; | |
166 keymap[18] = SDLK_e; | |
167 keymap[19] = SDLK_r; | |
168 keymap[20] = SDLK_t; | |
169 keymap[21] = SDLK_y; | |
170 keymap[22] = SDLK_u; | |
171 keymap[23] = SDLK_i; | |
172 keymap[24] = SDLK_o; | |
173 keymap[25] = SDLK_p; | |
174 | |
175 /* third row */ | |
176 keymap[15] = SDLK_TAB; | |
177 keymap[30] = SDLK_a; | |
178 keymap[31] = SDLK_s; | |
179 keymap[32] = SDLK_d; | |
180 keymap[33] = SDLK_f; | |
181 keymap[34] = SDLK_g; | |
182 keymap[35] = SDLK_h; | |
183 keymap[36] = SDLK_j; | |
184 keymap[37] = SDLK_k; | |
185 keymap[38] = SDLK_l; | |
186 | |
187 /* fourth row */ | |
188 keymap[42] = SDLK_LSHIFT; | |
189 keymap[44] = SDLK_z; | |
190 keymap[45] = SDLK_x; | |
191 keymap[46] = SDLK_c; | |
192 keymap[47] = SDLK_v; | |
193 keymap[48] = SDLK_b; | |
194 keymap[49] = SDLK_n; | |
195 keymap[50] = SDLK_m; | |
196 keymap[54] = SDLK_RSHIFT; | |
197 keymap[28] = SDLK_RETURN; | |
198 | |
199 /* fifth row */ | |
200 keymap[56] = SDLK_LALT; | |
201 keymap[29] = SDLK_LCTRL; | |
202 /* keymap[56] = ; */ | |
203 keymap[0] = SDLK_LSUPER; | |
204 keymap[12] = SDLK_MINUS; | |
205 keymap[57] = SDLK_SPACE; | |
206 keymap[51] = SDLK_COMMA; | |
207 keymap[52] = SDLK_PERIOD; | |
208 | |
209 /* misc */ | |
210 keymap[59] = SDLK_F1; | |
211 keymap[60] = SDLK_F2; | |
212 keymap[61] = SDLK_F3; | |
213 keymap[62] = SDLK_F4; | |
214 keymap[63] = SDLK_F5; | |
215 keymap[1] = SDLK_ESCAPE; | |
216 /* keymap[28] = SDLK_KP_ENTER; */ | |
217 keymap[72] = SDLK_UP; | |
218 keymap[75] = SDLK_LEFT; | |
219 keymap[77] = SDLK_RIGHT; | |
220 keymap[80] = SDLK_DOWN; | |
221 break; | |
222 | |
223 default: | |
224 WSCONS_ReportError("Unable to map keys for keyboard type %u", | |
225 private->kbdType); | |
226 break; | |
227 } | |
228 } | |
229 | |
230 /* end of SDL_wsconsevents.c ... */ | |
231 |