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