4. Modificare il file tabella di conversione (keytable)

Indice di questa sezione

Il Kernel di Linux comprende il codice compilato defkeymap.c, il quale è generato con l'utility loadkeys(1) partendo dal file defkeymap.map. Entrambi i file sono inclusi nella directory src/linux/drivers/char.

Al fine di modificare il file defkeymap.map ce ne facciamo una copia locale con

# cp defkeymap.map my_keytable.map ; oppure
# dumpkeys > my_keytable.map

C'è anche un'ampia raccolta di file di configurazione della tastiera nella directory /usr/lib/kbd/keytables, dalla quale defkeymap.map può essere copiato e usato come file src/linux/drivers/char/defkeymap.map nel vostro sistema.

Il metodo che usa l'utility dumpkeys(1) è raccomandato perché può accadere che il vostro Kernel sia già stato modificato o creato per voi con un differente defkeymap.map rispetto a quello che potreste trovare nei sorgenti.

Leggiamo ora il contenuto del file my_defkeymap.map. Non ci sono più di 300 linee di codice e vi possiamo trovare 3 gruppi di dichiarazioni: il primo gruppo consiste in linee con la parola "keycode", anche preceduta da altre parole come "alt", "control", ecc.; nel secondo gruppo troviamo la parola "string"; il terzo ed ultimo gruppo consiste in linee con la parola "compose".

Altre informazioni sulla sintassi di keytables(5) possono essere reperite tramite il comando

% man keytables

4.1 Esempio di modifica del file tabella di conversione

Come esempio dell'assegnazione di una stringa-macro alla pressione di un tasto Funzione facciamo in modo che la combinazione [Ctrl+F1] chiami l'esecuzione del nostro Shell-script "/usr/local/bin/key_macro".

Prima di tutto dovremmo vedere qual è il codice del tasto Funzione [F1]. Possiamo usare l'utility showkey(1) per trovare tale codice, premendo [F1]. Altrimenti possiamo cercare la stringa "F1" nel file my_keytable.map, col risultato di ottenere la seguente linea:

keycode 59 = F1

Questa suggerisce che il codice per il tasto Funzione [F1] è 59. Inoltre definisce il fatto che, dopo aver premuto [F1], il driver di tastiera manda in uscita la stringa denotata dal codice stringa "F1". Per vederne il contenuto si può cercare sempre all'interno di questo file "string F1" e si trova:

string F1 = "\033[[A"

Cioè, dopo aver premuto [F1], il driver di tastiera manda "Esc[[A" (senza spazi).

Non bisognerebbe combiare questa stringa perché alcune applicazioni basano su di essa l'azione di F1 come valore di default.

Comunque possiamo definire una nuova macro per la combinazione [Ctrl+F1], la quale non è riservata dal Kernel per altri usi speciali. Per vedere i codici del tasto [F1] premuto assieme a [Ctrl], [Shift] o con altri modificatori, possiamo cercare nel file my_keytable.map il codice 59 tramite

# grep 59 my_keytable.map

Nel caso in cui non vi sia alcuna linea con "control keycode 59" allora possiamo usare [Ctrl+F1] senza problemi (si può procedere anche se è presente una linea con "shift control keycode 59").

Aggiungiamo la seguente linea al file my_keytable.map:

control keycode 59 = key_symbol

dove "key_symbol" definirebbe l'azione della combinazione [Ctrl+F1]. Linux 1.2.* ammette un'allocazione dinamica delle stringhe, ma la stringa "key_symbol" può essere scelta solo tra un insieme ben definito di nomi. Tra gli altri sono permessi i simboli-tasto F1-F246. Nel mio sistema F21 non era usato nel file my_keytable.map ma ognuno dovrebbe ispezionare il proprio e scegliere il simbolo-tasto opportuno. Nel nostro esempio si può quindi concludere con la linea

   string F21 = "/usr/local/bin/key_macro\n" 
Riassumendo, abbiamo apportato due cambiamenti al file di partenza my_keytable.map: abbiamo dichiarato la nuova stringa F21 e abbiamo deciso che la combinazione [Ctrl+F1] chiamerà l'esecuzione del contenuto della stringa 21.

4.2 Modifica temporanea della configurazione della tastiera

Dopo aver opportunamente modificato il file my_keytable.map possiamo copiarne i cambiamenti al driver di tastiera del Kernel, usando l'utility loadkeys(1):

% loadkeys my_keytable.map

La modifica al driver di tastiera del Kernel è concessa a chiunque abbia l'accesso in lettura al dispositivo "/dev/console".
Per verificare che i cambiamenti voluti siano stati effettivamente installati possiamo usare l'utility dumpkeys(1) e controllare il valore di F21, ad esempio

% dumpkeys |grep F21

Si ottiene:

   keycode 59 = F1          F11       Console_13 F21
   string F21 = "/usr/local/bin/key_macro\012"

la quale va bene perché "012", o LF, è equivalente a "\n".
Ora, premendo [Ctrl+F1] dovrebbe avvenire la chiamata allo Shell script "/usr/local/bin/key_macro", come desiderato.

4.3 Modifica permanente

I cambiamenti imposti da loadkeys(1) al driver di tastiera del Kernel rimangono effettivi solo fino al successivo reboot (o fino alla successiva chiamata a loadkeys).

(N.d.T.: Per una modifica permanente) possiamo aggiungere a /etc/rc.d/rc.local la chiamata a loadkeys con argomento il nostro my_keytable.map. Altrimenti, è possibile modificare src/linux/drivers/char/defkeymap.c e relinkare il Kernel con i nuovi valori di default.

Non si dovrebbe modificare manualmente il file defkeymap.c ma, piuttosto, generarlo tramite l'utility loadkeys(1):

# mv defkeymap.c defkeymap.c.ORIG
# loadkeys --mktable my_keytable.map > defkeymap.c

Poi si dovrebbe creare il nuovo Kernel essenzialmente ponendosi alla radice dei sorgenti di Linux e usando make(1).
Infine, per mezzo di lilo(1) dovremmo installare e riavviare il nuovo Kernel.


Capitolo Successivo, Capitolo Precedente

Indice di questo capitolo, Indice generale

Inizio del documento, Inizio di questo Capitolo