C'è un modo migliore!
Al momento, il driver di input raccomandato per X11 è xf86-input-libinput, per cui non sto più mantenendo questa patch.
Per fortuna, esiste un metodo molto più semplice per ottenere lo stesso risultato: si può dire al kernel di rimappare i tasti, separatamente per ciascuna tastiera, tramite il "HW DB" di udev.
In /etc/udev/hwdb.d/50-apple-kbd.hwdb ho scritto:
evdev:input:b0003v05ACp0221* KEYBOARD_KEY_ff0003=insert # fn -> insert
(Attenzione: la seconda riga deve iniziare con esattamente 1 carattere "spazio" (0x20))
Questa pagina di documentazione di Arch (in Inglese) spiega il tutto in dettaglio.
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 non 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 dal file xorg.conf. Il mio contiene:
Section "InputClass" Identifier "keyboard-generic" Driver "evdev" Option "XkbOptions" "compose:ralt,altwin:meta_win,terminate:ctrl_alt_bksp" MatchIsKeyboard "on" EndSection Section "InputClass" Identifier "keyboard-apple-alu" Driver "evdev" Option "XkbLayout" "dakkar" Option "XkbModel" "applealu_iso" Option "XkbVariant" "dvorak-apple-al" Option "event_key_remap" "464=118 120=210 204=211" MatchIsKeyboard "on" MatchProduct "Apple, Inc Apple Keyboard" EndSection
(I dettagli sul mio layout di tastiera stanno altrove.