Precedente Successivo Indice

2. La Tastiera

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 scancodes 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.

ScanCode (Raw) Mode

Quando il kernel viene posto in questa modalità, non fa altro che passare, tali e quali, gli scancodes al programma che ne ha fatto richiesta. Programmi che hanno questo comportamento sono, per esempio, X(1) e DOOM.

Potete vedere gli scancodes della vostra tastiera semplicemente facendo un showkey -s.

KeyCode (Medium Raw) Mode

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 passati 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.

KeySim Mode

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->KeySim. Questa conversione genera in uscita caratteri o stringhe (dette sequenze di escape, ovvero stringhe di caratteri che cominciano sempre con il carattere ASCII 26) seguendo lo standard VT100, ovvero lo standard che Linux adotta per i suoi terminali virtuali, o virtual consoles.

Fanno parte di questa categoria la stragrande maggioranza degli applicativi, a partire da shells, editors e programmi vari.

2.1 Console

Come abbiamo visto, possiamo agire al livello 3, modificando la KeyMap, per poter ottenere tutto quello che vogliamo. É sufficiente impartire il comando loadkeys it.map oppure loadkeys /usr/lib/kbd/keytables/it.map per riconfigurare la tastiera.

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 /usr/lib/kbd/keytables.

Di solito conviene aggiungere questo comando nel file /etc/rc.d/rc.local, in modo che venga eseguito ad ogni avvio del SO. Nelle ultimissime distribuzioni è possibile, alternativamente, creare un file /etc/rc.d/rc.keymap. init(8) si preoccuperà di eseguirlo automaticamente ad ogni avvio del sistema.

Il programma di setup della slackware permette di scegliere la KeyMap e di installarla automaticamente. Di solito, per mancanza di spazio fisico sul disco ``root'', non è possibile utilizzare la tastiera italiana nella fase di installazione. Completata l'installazione, e comunque possibile sceglierla eseguendo setup e rifacendo la configurazione del sistema.

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+'].

Ovviamente la modifica della tabella interessa tutto il sistema, anche se solitamente anche un utente comune può compiere questa operazione. Si consiglia quindi, quando comporti problemi di sicurezza, di impedire l'esecuzione dei programmi citati a utenti diversi da root, agendo sui permessi di esecuzione dei file.

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 manpages di questi programmi.

2.2 XFree86

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.

X inoltre utilizza le sue convenzioni per la gestione dei tasti, ovviamente diversa da quella di Linux. X associa ad ogni tasto un codice (e fin qui niente di diverso), assieme a dei modifiers, ovvero dei modificatori, ovvero dei flags che indicano la contemporanea pressione dei tasti CTRL, ALT, SHIFT, META, SUPER, HYPER.

Tutti i codici associati ai tasti possono essere visti nel file /usr/lib/X11/XKeysymDB. Occhio che non è un file di gestione della tastiera, ma solo un database di nomi di tasti!!! Insomma, non picchignate... Tutte queste cose possono essere anche viste utilizzando il programma xev(1), che monitorizza e visualizza tutti gli eventi di X.

Quello che dobbiamo fare è solo 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)...)

A tal fine è bene che ci sia una cosa come questa nel vostro /etc/XF86Config


        Section "Keyboard"

        [...]

        LeftAlt     Meta
        RightAlt    ModeShift

        EndSection

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 i KeySym associati a BS e DEL.

I metodi sono 2:

O si crea un file $(HOME)/.Xmodmap così fatto:


        keycode 22 = BackSpace
        keycode 107 = Delete

e si fa in modo che il proprio $(HOME)/.xinitrc o il generale /var/X11R6/lib/xinit/xinitrc abbia una riga del tipo


        usermodmap=$HOME/.Xmodmap

        if [ -f $usermodmap ]; then
                xmodmap $usermodmap
        fi

Oppure inserire direttamente in $(HOME)/.xinitrc o /var/X11R6/lib/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 /var/X11R6/lib/xinit/xinitrc o $(HOME)/.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 $(HOME)/.xinitrc, di copiarlo da quello generale e fare SOLO AGGIUNTE!!!

Ovviamente xmodmap(1) non fa altro che associare KeySym a X KeyCodes, come il buon vecchio loadkeys.

2.3 Per maggiori informazioni

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 dalla slackware (di solito /usr/doc/keytables).


Precedente Successivo Indice