Contents of /trunk/xorg-old/patches-6.8.2-r10/9001_all_4.3.0-lnx-evdev-keyboard-v2.patch
Parent Directory | Revision Log
Revision 167 -
(show annotations)
(download)
Tue May 8 20:58:51 2007 UTC (17 years, 4 months ago) by niro
File size: 10093 byte(s)
Tue May 8 20:58:51 2007 UTC (17 years, 4 months 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 | +} |