Previous Next Contents

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

ScanCode (Raw) Mode

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.

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

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

2.1 Console

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.

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.

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 del terzo incomodo...

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.

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


Previous Next Contents