Quando premete un tasto, il controller interno della tastiera spedisce una serie di valori (ScanCodes) al kernel. Esistono in commercio delle tastiere programmabili, ovvero delle tastiere con cui è possibile modificare gli scancode generati. Vedremo anche che ci sono molti altri modi meno dispendiosi, oltre che cambiare tastiera, per poter associare effetti diversi ai tasti. Infatti Linux stratifica la gestione della tastiera, definendo tre categorie di gestione. Queste tre categorie, o modi, possono essere impostati dalle applicazioni.
Quando il kernel viene posto in questa modalità, non fa altro che passare, tali e quali, gli scancode al programma che ne ha fatto richiesta. Programmi che hanno questo comportamento sono, per esempio, X(1) e squake (Quake per svgalib).
Potete vedere gli scancode della vostra tastiera semplicemente facendo
un showkey -s
.
Altrimenti il kernel converte gli scancodes in eventi detti KeyCode composti da un flag, che indica se è un evento di tasto premuto o di tasto rilasciato, e da un numero identificativo del tasto stesso, tra l'altro seguendo l'ordine logico della tastiera, ovvero [Esc]=1, [F1]=2, ... Non esistono combinazioni. Anche il premere il tasto [Alt] o [Ctrl] genera un KeyCode, mentre premere in contemporanea più tasti genera semplicemente più KeyCode di pressione corrispondenti.
Queste informazioni possono essere passate direttamente all'applicazione
che ne fa richiesta in KeyCode mode. Non è molto usuale, infatti
l'unica applicazione a me nota è showkey(1) che senza
l'opzione -s
serve proprio a fare vedere i KeyCode.
I KeyCode vengono filtrati dal kernel attraverso la KeyMap, ovvero una tabella di conversione. Non è un eufemismo, si tratta di una particolare tabella, un file di testo, che contiene tutte le conversioni KeyCode->KeySym. Questa conversione genera in uscita caratteri o stringhe (dette sequenze di escape, ovvero stringhe di caratteri che cominciano sempre con il carattere ASCII 27) seguendo lo standard VT100, ovvero lo standard che Linux adotta per i suoi terminali virtuali, o virtual console.
Fanno parte di questa categoria la stragrande maggioranza degli applicativi, a partire da shell, editor e programmi vari.
Possiamo agire al livello 3, modificando la KeyMap, per
poter ottenere tutto quello che vogliamo. Per fare questo è sufficiente
impartire il comando loadkeys it.map
.
Se nessuno dei due comandi funzionasse (rispondono ``cannot load file
it.map''), allora evidentemente si ha una distribuzione molto vecchia di Linux,
oppure non si è correttamente installato il file.
Non resta altro che prenderlo dal più vicino sito internet o BBS e copiarlo
nella directory dove sono presenti le altre keytables, in Debian
/usr/share/keytables
.
Debian in fase di installazione chiede quale tastiera si vuole installare, ed è addirittura possibile utilizzare la tastiera italiana in fase di installazione. Se occorresse fare delle riconfigurazioni, basta eseguire il comando kbdconfig, che fa tutto da solo ed è autoesplicativo. Le altre distribuzioni avranno sistemi simili per configurare la tastiera.
Questa KeyMap inoltre supporta alcune aggiunte molto comode per i programmatori, come le parentesi graffe, il carattere tilde e il carattere apice inverso ottenuti premendo rispettivamente [AltGr+8], [AltGr+9], [AltGr+0] e [AltGr+'].
Se qulcuno volesse usare una keymap particolare, realizzata da Lorenzo Maria
Catucci (
lorenzo@argon.roma2.infn.it),
che permette di utilizzare anche le lettere maiuscole accentate e che corregge
il posizionamento delle accentate filosoficamente sbagliato dai tempi dei PC
IBM la può trovare su
ftp://argon.roma2.infn.it/pub/linux. Per installarla basta
decomprimerla (con gzip -d it.map.gz
e copiarla nella directory
/usr/share/keytables
o dovunque ci siano le altre keytables con un
nome consistente (magari, in onore all'autore, it-lmc.map
e rilanciare la
procedura di configurazione della tastiera; dovrebbe ora comparire tra le
opzioni, e quindi basta sceglierla e uscire.
Nella stessa directory è presente un it.map.readme
che spiega come fare e
un file Xmodmap-105.it che permette di avere gli stessi effetti sotto X
utilizzando la vecchia gestione della tastiera (ovvero con xmodmap(1).
Inoltre, per chi vule continuare ad usare la vecchia gestione, può essere
utile il programma xkeycaps(1).
Questa tastiera definisce il tasto Compose come [Ctrl+.], ovvero premendo, in sequenza, [Ctrl+.] (Compose), ['] e [I] si ottiene ``Í''; a questo punto dovreste aver capito, e produrre gli altri non dovrebbe essere difficile. Nelle tastiere a 105 tasti, quelle di W95, per capirsi, il tasto Compose è direttamente mappato su quello di apertura del menú.
Altro programma utile oltre al già citato showkey(1) è dumpkey(1) che produce in output la tabella di conversione corrente. Si considerano utili letture le manpage di questi programmi.
Come abbiamo già accennato in precedenza, X(1) si riporta in modalità ScanCode, ovvero va ad interagire direttamente con l'hardware, il controller della tastiera.
Inoltre di recente (dalla versione 3.2 in poi...) XFree ha completamente cambiato la gestione della tastiera, aggiungendo una estensione che si chiama ``XKeyboard'', e qualche astrusa voce in più nel file di configurazione.
Il problema è che xf86config(1) che non riesce più a gestire in fase di configurazione automatica la tastiera italiana (o meglio, per trovare uno straccio di riferimento all'Italia occorre navigare per un po' tra complicate opzioni...), ma niente paura.
Si può benissimo completare la configurazione scegliendo una tastiera
predefinita (come quella americana) e poi editare il file
/etc/X11/XF86Config
aggiungendo o modificando le informazioni:
Section "Keyboard" [...] LeftAlt Meta RightAlt ModeShift # ovviamente se avete una tastiera W95 # al posto di pc102 ci va pc105! # XkbRules "xfree86" XkbModel "pc102" XkbLayout "it" EndSection
Le prime due righe, in particolare, servono ad avvisare X che abbiamo intenzione di usare [AltGr] come modificatore ModeShift per poter utilizzare, come siamo abituati, parentesi quadre, at e diesis. (Non vi ricordate? Era una di quelle imbarazzanti domande che vi ha posto xf86config(1)...)
Questa definizione di tastiera è leggermente diversa (come disposizione dei tasti ``nascosti'') di quella in console (ad esempio le parentesi graffe sono ora in [AltGr+7], [AltGr+0]); ci sono già delle definizioni che correggono queste diferenze (la migliore di Andrea Baldoni, abaldoni@xcal.net), ma nessuna mette la parola fine al problema. Mentre un gruppo di lavoro Debian sta studiando la questione, e quindi preferisco aspettare.
Un problema noioso, che però non riguarda solo la tastiera italiana, è che in X gli effetti della pressione dei tasti BackSpace e Canc coincidono (ambedue fanno Del, ovvero cancellano il carattere sul cursore). Occorre quindi modificare gli effetti associati a BS e DEL, e in mancanza di una definizione di tastiera italiana completa, utilizziamo il vecchio metodo, ovvero il programma xmodmap.
I metodi sono 2:
O si crea un file ~/.Xmodmap
così fatto:
keycode 22 = BackSpace keycode 107 = Delete
e si controlla che il proprio ~/.xinitrc
o il generale
/etc/X11/xinit/xinitrc
abbia una riga del tipo
usermodmap=$HOME/.Xmodmap if [ -f $usermodmap ]; then xmodmap $usermodmap fi
oppure si inseriscono direttamente in ~/.xinitrc
o
/etc/X11/xinit/xinitrc
le righe:
# map the [BackSpace] key to the BackSpace keysym. xmodmap -e "keycode 22 = BackSpace" # map the [Delete] key to the Delete keysym. xmodmap -e "keycode 107 = Delete"
che eseguono direttamente la reinizializzazione.
ATTENZIONE che /etc/X11/xinit/xinitrc
o
~/.xinitrc
devono avere sempre come ultima riga
eseguibile il nome del window manager, di solito fvwm(1), altrimenti
X esce appena eseguito la lista di elementi nei suddetti file.
Consiglio caldamente, se si vuole fare il proprio
~/.xinitrc
, di copiarlo da quello generale e fare
SOLO AGGIUNTE!!!
Inoltre è da notare che se si usa xdm(1) per accedere a X, tutti questi
comandi (e specialmente le chiamate a xmodmap) vanno inserite nel file
~/.xsession
.
A differenza di .xinitrc
,
.xsession
deve essere un file
eseguibile, e qundi è conveniente aggiungere in testa a .xinitrc
(come
prima) la riga magica #!/bin/bash
, renderlo eseguibile
(con chmod u+x .xinitrc
) e quindi fare un link tra .xinitrc
e
.xsession
, per editare un file solo...
Inoltre alcune distribuzioni adottano il nome di .Xresources
in luogo di
.Xdefaults
, e quindi occorre stare attenti a questa eventualità; anche
qui un link tra i due file risolve ogni dubbio.
Il problema che resta da risolvere è quello degli xterm(1) o simili. Questi sono degli emulatori di terminale che intercettano gli eventi di pressione in X e li filtrano facendoli arrivare alla applicazione che gira nell'xterm. Il brutto della faccenda è che spesso nel fare questo perdono pezzi per strada, è il risultato è che non si riesce a far andare BS e DEL contemporaneamente in console, in X e in un xterm.
Ma anche qui la soluzione, anche se non completamente funzionante, c'è, presa e adattata dal Linux Journal.
Per tutti quei programmi che utilizzano terminfo, e se usate Debian tutti
i programmi utilizzano terminfo, dovrebbe bastare mettere una cosa del genere
nel proprio ~/.Xdefaults
:
XTerm*ttyModes: erase ^H XTerm*VT100.Translations: #override\n\ <Key>BackSpace: string(0x7F)\n\ <Key>Delete: string("\033[3~")\n\ <Key>Home: string("\033[1~")\n\ <Key>End: string("\033[4~")\n\ Ctrl<Key>Prior: string("\033[40~")\n\ Ctrl<Key>Next: string("\033[41~") nxterm*VT100.Translations: #override\n\ <Key>BackSpace: string(0x7F)\n\ <Key>Delete: string(0x1b) string("[3~")\n\ <Key>Home: string(0x1b) string("[1~")\n\ <Key>End: string(0x1b) string("[4~")\n\ Ctrl<Key>Prior: string(0x1b) string("[40~")\n\ Ctrl<Key>Next: string(0x1b) string("[41~")
Questo tende a far funzionare tutto, a parte (e misteriosamente) cose come xcoral o textedit, che continuano a fare solo BackSpace. A questo punto credo che sia un problema di quei programmi... Magari segnalatemi i programmi che fanno i capricci, ed ovviamente le relative soluzioni.
Inoltre mi hanno detto che rxvt(1), ovvero un emulatore di terminale alternativo e piú leggero di xterm, si comporta meglio, ovvero è piú simile a una Linux console. È appena ripartito lo sviluppo, quindi vi consiglio di prendere l'ultima versione.
Per programmi (o sistemi) che usano ancora /etc/termcap
è molto
probabile che occorra una correzione della definizione di xterm. Purtroppo non
ho, in questo momento, per le mani una patch funzionante. Chiunque abbia già
risolto il problema me la può inviare e verrà allegata, anche se patch di
grosse dimensioni non credo possano essere mai aggiunte a questo howto.
Per comprendere meglio queste cose sono letture consigliate le manpage di termcap(5) e terminfo(5), oltre a quanto già riportato qui sotto.
Ulteriori informazioni, specialmente se si vuole migliorare la gestione della tastiera (aggiungere i tasti cursore in determinate applicazioni, macro ai tasti funzione, ...), si possono trovare in:
Esiste inoltre la kbd.FAQ contenuta nel ``pacchetto KBD'' di gestione
della tastiera, che dovrebbe essere già stata installata da qualche parte
(di solito /usr/doc/kbd
).