Rimappatura dei codici in xf86-input-evdev

Altre lingue

Il driver xf86-input-evdev che viene di serie con xorg usa soltanto i keycode tra 8 e 255, ignorando tutti gli altri. Questo funziona per la maggior parte dei casi (chi ha mai visto una tastiera con più di 247 tasti?), ma causa problemi quando i keycode con sono consecutivi.

Ad esempio, la tastiera Apple Alluminio (ID USB 05ac:0221) emette qualche codice oltre 255: il tasto "fn" è 464. Altri hanno trovato altri casi, e li hanno segnalati come bug.

Siccome la tastiera mi serve funzionante, e come dico io, ho fatto l'unica cosa sensata: ho clonato il repository e ho modificato il codice.

La mia modifica aggiunge un'opzione di configurazione, chiamata event_key_remap. Il valore deve essere una lista (separata da spazi) di "assegnamenti" nella forma $evdev_code = $x11_code; il $evdev_code può essere ottenuto con showkey -k, il $x11_code può essere trovato nel file /usr/share/X11/xkb/keycodes/evdev (o dove la vostra distribuzione l'ha messo)

L'implementazione è piuttosto semplice: crea una tabella dalla configurazione; la tabella non è implementata come un semplice array, visto che in quel caso allocherei 64KiB per device (evdev usa 16 bit per un evento "tasto"). Invece, alloco "pagine" di 256 byte, e solo le pagine che servono. In questo modo, i device senza rimappature occupano solo un puntatore in più nelle loro strutture, e i device con pochi codici da mappare occupano 256 byte in più.

Ovviamente, la configurazione può essere impostata sia dal file xorg.conf sia tramite HAL. Il mio file /etc/hal/fdi/policy/10-x11-input.fdi contiene:

<?xml version="1.0" encoding="utf-8"?>
<deviceinfo version="0.2">
 <match key="info.capabilities" contains="input.keyboard">
  <append key="input.x11_options.XkbOptions" type="strlist">compose:ralt</append>
  <append key="input.x11_options.XkbOptions" type="strlist">altwin:meta_win</append>
 </match>
 <match key="input.product" string="Apple, Inc Apple Keyboard">
  <merge key="input.x11_options.XkbLayout" type="string">dakkar</merge>
  <merge key="input.x11_options.XkbModel" type="string">evdev</merge>
  <merge key="input.x11_options.XkbVariant" type="string">dvorak-apple-al</merge>
  <merge key="input.x11_options.event_key_remap" type="string">464=118 120=210 204=211</merge>
 </match>
</deviceinfo>

(I dettagli sul mio layout di tastiera stanno altrove.

DateCreato: 2009-09-15 12:49:41 Ultima modifica: 2009-09-15 13:26:42