Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
245 lines (214 loc) · 6.35 KB

SDL_wsconsevents.c

File metadata and controls

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