Magellan Linux

Contents of /trunk/xorg-old/patches-6.8.2-r10/9001_all_4.3.0-lnx-evdev-keyboard-v2.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 167 - (show annotations) (download)
Tue May 8 20:58:51 2007 UTC (17 years ago) by niro
File size: 10093 byte(s)
-import

1 Version 2 by Alan Swanson <swanson@ukfsn.org>
2 Restores case insensitivity of Option "Protocol" "Standard"
3 http://bugs.gentoo.org/show_bug.cgi?id=63568
4 -Donnie Berkholz <spyderous@gentoo.org>
5 11 Oct. 2004
6
7 diff -ur build-tree/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kbd.c xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kbd.c
8 --- build-tree/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kbd.c 2003-03-26 19:53:47.000000000 -0500
9 +++ xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kbd.c 2003-03-15 08:46:16.000000000 -0500
10 @@ -22,6 +22,7 @@
11 #include "xf86OSKbd.h"
12 #include "atKeynames.h"
13 #include "lnx_kbd.h"
14 +#include "lnx_evdev.h"
15
16 #define KBC_TIMEOUT 250 /* Timeout in ms for sending to keyboard controller */
17
18 @@ -481,8 +482,8 @@
19 return TRUE;
20 }
21
22 -Bool
23 -xf86OSKbdPreInit(InputInfoPtr pInfo)
24 +static Bool
25 +stdKbdPreInit(InputInfoPtr pInfo, char *protocol)
26 {
27 KbdDevPtr pKbd = pInfo->private;
28
29 @@ -532,3 +533,377 @@
30 #endif
31 return TRUE;
32 }
33 +
34 +typedef struct _evdevKbdRec {
35 + int packetSize;
36 + char *buffer;
37 + evdevDriver evdev;
38 +} evdevKbdRec, *evdevKbdPtr;
39 +
40 +static void
41 +evdevKbdReadInput(InputInfoPtr pInfo)
42 +{
43 + KbdDevPtr pKbd;
44 + evdevKbdPtr evdevKbd;
45 + struct input_event *ev;
46 + int n;
47 + int code;
48 +
49 + pKbd = (KbdDevPtr) pInfo->private;
50 + evdevKbd = pKbd->private;
51 + ev = (struct input_event *) evdevKbd->buffer;
52 +
53 + if (pInfo->fd == -1)
54 + return;
55 +
56 + do {
57 + n = read(pInfo->fd, ev, sizeof(struct input_event));
58 + if (n == -1) {
59 + xf86Msg(X_ERROR, "%s: Error in reading! (%s) Disabiling.\n",
60 + pInfo->name, strerror(errno));
61 + RemoveEnabledDevice(pInfo->fd);
62 + close (pInfo->fd);
63 + pInfo->dev->public.on = FALSE;
64 + pInfo->fd = -1;
65 + return;
66 + }
67 + if (n != sizeof(struct input_event)) {
68 + xf86Msg(X_WARNING, "%s: incomplete packet, size %d\n", pInfo->name, n);
69 + return;
70 + }
71 +
72 + switch (ev->type) {
73 + case EV_KEY:
74 + if ((ev->code <= EV_KEY_RESERVED)||(ev->code >= EV_KEY_UNKNOWN))
75 + break;
76 + switch (ev->code) {
77 + case EV_KEY_103RD:
78 + case EV_KEY_102ND:
79 + case EV_KEY_LINEFEED:
80 + case EV_KEY_MACRO:
81 + case EV_KEY_MUTE:
82 + case EV_KEY_VOLUMEDOWN:
83 + case EV_KEY_VOLUMEUP:
84 + case EV_KEY_POWER:
85 + case EV_KEY_KPPLUSMINUS:
86 + case EV_KEY_F18:
87 + case EV_KEY_F19:
88 + case EV_KEY_F20:
89 + case EV_KEY_F21:
90 + case EV_KEY_F22:
91 + case EV_KEY_F23:
92 + case EV_KEY_F24:
93 + case EV_KEY_KPCOMMA:
94 + case EV_KEY_COMPOSE:
95 + code = KEY_UNKNOWN;
96 + break;
97 + case EV_KEY_F13:
98 + code = KEY_F13;
99 + break;
100 + case EV_KEY_F14:
101 + code = KEY_F14;
102 + break;
103 + case EV_KEY_F15:
104 + code = KEY_F15;
105 + break;
106 + case EV_KEY_F16:
107 + code = KEY_F16;
108 + break;
109 + case EV_KEY_F17:
110 + code = KEY_F17;
111 + break;
112 + case EV_KEY_KPENTER:
113 + code = KEY_KP_Enter;
114 + break;
115 + case EV_KEY_RIGHTCTRL:
116 + code = KEY_RCtrl;
117 + break;
118 + case EV_KEY_KPSLASH:
119 + code = KEY_KP_Divide;
120 + break;
121 + case EV_KEY_SYSRQ:
122 + code = KEY_SysReqest;
123 + break;
124 + case EV_KEY_RIGHTALT:
125 + code = KEY_AltLang;
126 + break;
127 + case EV_KEY_HOME:
128 + code = KEY_Home;
129 + break;
130 + case EV_KEY_UP:
131 + code = KEY_Up;
132 + break;
133 + case EV_KEY_PAGEUP:
134 + code = KEY_PgUp;
135 + break;
136 + case EV_KEY_LEFT:
137 + code = KEY_Left;
138 + break;
139 + case EV_KEY_RIGHT:
140 + code = KEY_Right;
141 + break;
142 + case EV_KEY_END:
143 + code = KEY_End;
144 + break;
145 + case EV_KEY_DOWN:
146 + code = KEY_Down;
147 + break;
148 + case EV_KEY_PAGEDOWN:
149 + code = KEY_PgDown;
150 + break;
151 + case EV_KEY_INSERT:
152 + code = KEY_Insert;
153 + break;
154 + case EV_KEY_DELETE:
155 + code = KEY_Delete;
156 + break;
157 + case EV_KEY_KPEQUAL:
158 + code = KEY_KP_Equal;
159 + break;
160 + case EV_KEY_PAUSE:
161 + code = KEY_Pause;
162 + break;
163 + case EV_KEY_LEFTMETA:
164 + code = KEY_LMeta;
165 + break;
166 + case EV_KEY_RIGHTMETA:
167 + code = KEY_RMeta;
168 + break;
169 + default:
170 + code = ev->code;
171 + break;
172 + }
173 + if (code >= 127)
174 + code = KEY_UNKNOWN;
175 +
176 + if (ev->value)
177 + pKbd->PostEvent(pInfo, code, TRUE);
178 + else
179 + pKbd->PostEvent(pInfo, code, FALSE);
180 + break;
181 + }
182 + } while (xf86WaitForInput(pInfo->fd, 0));
183 +
184 + return;
185 +}
186 +
187 +static int
188 +evdevKbdInit(InputInfoPtr pInfo, int what)
189 +{
190 + KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
191 + evdevKbdPtr evdevKbd = (evdevKbdPtr) pKbd->private;
192 +
193 + evdevKbd->evdev.name = xf86SetStrOption(pInfo->options,"Dev Name",NULL);
194 + evdevKbd->evdev.phys = xf86SetStrOption(pInfo->options,"Dev Phys",NULL);
195 + evdevKbd->evdev.cb_data = pInfo->dev;
196 + evdevKbd->evdev.callback = pInfo->device_control;
197 + if (!evdevNewDriver (&evdevKbd->evdev)) {
198 + xf86Msg(X_ERROR, "%s: cannot register with evdev brain\n", pInfo->name);
199 + return BadRequest;
200 + }
201 + if ((pInfo->fd = evdevGetFDForDriver (&evdevKbd->evdev)) == -1) {
202 + xf86Msg(X_ERROR, "%s: cannot open input device\n", pInfo->name);
203 + return BadRequest;
204 + }
205 +
206 + close(pInfo->fd);
207 + pInfo->fd = -1;
208 +
209 + return Success;
210 +}
211 +
212 +static int
213 +evdevKbdOn(InputInfoPtr pInfo, int what)
214 +{
215 + KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
216 + evdevKbdPtr evdevKbd = (evdevKbdPtr) pKbd->private;
217 + unsigned long mask;
218 +
219 + if ((pInfo->fd = evdevGetFDForDriver (&evdevKbd->evdev)) == -1) {
220 + xf86Msg(X_ERROR, "%s: cannot open input device (name: '%s', phys: '%s')\n", pInfo->name, evdevKbd->evdev.name, evdevKbd->evdev.phys);
221 + return BadRequest;
222 + }
223 + /*
224 + * Grab the keyboard for ourselves.
225 + */
226 + if (ioctl(pInfo->fd, EVIOCGMASK, &mask) < 0) {
227 + xf86Msg(X_INFO, "%s: unable to use input device masking '%s', trying grabbing.\n", pInfo->name, strerror(errno));
228 + if (ioctl(pInfo->fd, EVIOCGRAB, 1) < 0) {
229 + xf86Msg(X_ERROR, "%s: unable to grab device '%s', you may have problems.\n", pInfo->name, strerror(errno));
230 + }
231 + return Success;
232 + }
233 +
234 + mask |= BIT(2);
235 + ioctl(pInfo->fd, EVIOCSMASK, mask);
236 +
237 + ioctl(pInfo->fd, EVIOCGDMASK, &mask);
238 + mask &= ~BIT(0);
239 + mask |= BIT(2);
240 + ioctl(pInfo->fd, EVIOCSDMASK, mask);
241 + xf86Msg(X_INFO, "%s: Using input device masking.\n", pInfo->name);
242 +
243 + return Success;
244 +}
245 +
246 +static int
247 +evdevKbdOff(InputInfoPtr pInfo, int what)
248 +{
249 + if (pInfo->fd != -1) {
250 + unsigned long mask;
251 +
252 + if (ioctl(pInfo->fd, EVIOCGDMASK, &mask) >= 0) {
253 + mask |= BIT(0);
254 + ioctl(pInfo->fd, EVIOCSDMASK, mask);
255 + }
256 +
257 + close (pInfo->fd);
258 + pInfo->fd = -1;
259 + }
260 + return Success;
261 +}
262 +
263 +static void
264 +evdevSoundBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
265 +{
266 +}
267 +
268 +static void
269 +evdevSetKbdLeds(InputInfoPtr pInfo, int leds)
270 +{
271 + struct input_event event;
272 +
273 + memset(&event, 0, sizeof(event));
274 + event.type = EV_LED;
275 + event.code = EV_LED_CAPSL;
276 + event.value = (leds & XLED1) ? 1 : 0;
277 + write(pInfo->fd, (char *) &event, sizeof(event));
278 +
279 + event.type = EV_LED;
280 + event.code = EV_LED_NUML;
281 + event.value = (leds & XLED2) ? 1 : 0;
282 + write(pInfo->fd, (char *) &event, sizeof(event));
283 +
284 + event.type = EV_LED;
285 + event.code = EV_LED_SCROLLL;
286 + event.value = (leds & XLED3) ? 1 : 0;
287 + write(pInfo->fd, (char *) &event, sizeof(event));
288 +
289 + event.type = EV_LED;
290 + event.code = EV_LED_COMPOSE;
291 + event.value = (leds & XLED4) ? 1 : 0;
292 + write(pInfo->fd, (char *) &event, sizeof(event));
293 +}
294 +
295 +static int
296 +evdevGetKbdLeds(InputInfoPtr pInfo)
297 +{
298 + unsigned long evleds[NBITS(EV_LED_MAX)];
299 + int leds = 0;
300 +
301 + ioctl(pInfo->fd, EVIOCGLED(sizeof(evleds)), &evleds);
302 + if (test_bit(EV_LED_CAPSL, evleds))
303 + leds |= XLED1;
304 +
305 + if (test_bit(EV_LED_NUML, evleds))
306 + leds |= XLED2;
307 +
308 + if (test_bit(EV_LED_SCROLLL, evleds))
309 + leds |= XLED3;
310 +
311 + if (test_bit(EV_LED_COMPOSE, evleds))
312 + leds |= XLED4;
313 +
314 + return leds;
315 +}
316 +
317 +static void
318 +evdevSetKbdRepeat(InputInfoPtr pInfo, char rad)
319 +{
320 + KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
321 + int rep_info[2];
322 +
323 + rep_info[0] = pKbd->delay;
324 + rep_info[1] = pKbd->rate * 10;
325 + ioctl(pInfo->fd, EVIOCSREP, rep_info);
326 +}
327 +
328 +static int
329 +evdevGetSpecialKey(InputInfoPtr pInfo, int scanCode)
330 +{
331 + return scanCode;
332 +}
333 +
334 +static Bool
335 +evdevOpenKeyboard(InputInfoPtr pInfo)
336 +{
337 + return TRUE;
338 +}
339 +
340 +static Bool
341 +evdevKbdPreInit(InputInfoPtr pInfo, char *protocol)
342 +{
343 + KbdDevPtr pKbd = pInfo->private;
344 + evdevKbdPtr evdevKbd;
345 + xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
346 +
347 + pKbd->private = evdevKbd = xcalloc(sizeof(evdevKbdRec), 1);
348 +
349 + xf86Msg(X_ERROR, "%s: pInfo->dev: %p\n", pInfo->name, pInfo->dev);
350 +
351 + if (pKbd->private == NULL) {
352 + xf86Msg(X_ERROR, "%s: cannot allocate buffer\n", pInfo->name);
353 + return FALSE;
354 + }
355 +
356 + evdevKbd->buffer = xcalloc(sizeof(struct input_event),1);
357 +
358 + if (evdevKbd->buffer == NULL) {
359 + xf86Msg(X_ERROR, "%s: cannot allocate buffer\n", pInfo->name);
360 + xfree(evdevKbd);
361 + return FALSE;
362 + }
363 +
364 + if (!evdevStart (pInfo->drv)) {
365 + xf86Msg(X_ERROR, "%s: cannot start evdev brain\n", pInfo->name);
366 + xfree(evdevKbd);
367 + xfree(evdevKbd->buffer);
368 + return FALSE;
369 + }
370 +
371 + pKbd->KbdInit = evdevKbdInit;
372 + pKbd->KbdOn = evdevKbdOn;
373 + pKbd->KbdOff = evdevKbdOff;
374 + pKbd->Bell = evdevSoundBell;
375 + pKbd->SetLeds = evdevSetKbdLeds;
376 + pKbd->GetLeds = evdevGetKbdLeds;
377 + pKbd->SetKbdRepeat = evdevSetKbdRepeat;
378 + pKbd->KbdGetMapping = KbdGetMapping;
379 + pKbd->SpecialKey = SpecialKey;
380 +
381 + pKbd->RemapScanCode = NULL;
382 + pKbd->GetSpecialKey = evdevGetSpecialKey;
383 +
384 + pKbd->OpenKeyboard = evdevOpenKeyboard;
385 + pKbd->vtSwitchSupported = FALSE;
386 + pInfo->read_input = evdevKbdReadInput;
387 +
388 + return TRUE;
389 +}
390 +
391 +Bool
392 +xf86OSKbdPreInit(InputInfoPtr pInfo)
393 +{
394 + char *protocol;
395 + Bool ret;
396 +
397 + protocol = xf86SetStrOption(pInfo->options, "Protocol", NULL);
398 +
399 + if (xf86NameCmp(protocol, "evdev") == 0)
400 + ret = evdevKbdPreInit(pInfo, protocol);
401 + else
402 + ret = stdKbdPreInit(pInfo, protocol);
403 +
404 + xfree(protocol);
405 + return ret;
406 +}