Ci sono due livelli qui, da KEYCODE a KEYSYM e da KEYSYM a testo. Ci sono più livelli se contate il kernel, che deve mappare gli scancodes della tastiera AT su un KEYCODE in stile XT o un codice HID della tastiera USB su un KEYCODE. Un KEYCODE è semplicemente un numero intero senza segno a 8 bit che il kernel di un sistema operativo passa al server X11. Può variare tra sistemi operativi come Linux e Solaris. Su Linux, questi KEYCODE hanno in genere lo stesso numero utilizzato sulle vecchie tastiere per PC XT. I computer più recenti con tastiere AT, PS / 2 o USB in genere eseguono il mapping di quelle tastiere al vecchio codice XT affinché la chiave semplifichi la vita.
I codici tastiera grezzi, siano essi XT, AT, PS / 2 o USB, rappresentano una posizione fisica su una tastiera. La tastiera XT invia un solo numero a 8 bit alla pressione o al rilascio di un tasto. Il tasto q su una tastiera XT statunitense / britannica invia il numero 16. Su una tastiera francese lo stesso tasto fisico è etichettato a, ma invia comunque 16. Sono i livelli superiori nel sistema operativo che gli assegnano un significato reale. Quando un tasto viene rilasciato su una tastiera XT, viene inviato lo stesso codice tasto più 128. Per questo esempio, quando si preme q, viene inviato un 16, ma al rilascio viene inviato il numero 142 (16 + 128). Le tastiere AT utilizzano scancodes che sono una serie di numeri e possono diventare piuttosto lunghi. I rilasci chiave aggiungono codici aggiuntivi. Ad esempio, lo scancode per Pause è E1, 1D, 45, E1, 9D, C5. La maggior parte dei sistemi operativi tra cui DOS, Windows, Linux, FreeBSD, e il BIOS tutti mappano gli scancodes in scancodes molto più semplici in stile XT. Inoltre, semplifica il supporto di tastiere più recenti che utilizzano codici diversi come tastiere USB che inviano codici HID. Tutti i codici vengono mappati sullo stesso insieme coerente di codici dal sistema operativo prima che X11 o l'applicazione li veda.
X11 ignora questa parte del processo, ottiene semplicemente KEYCODE dal kernel e applica la propria mappatura per convertire quel KEYCODE in KEYSYM. Xmodmap è lo strumento standard per controllare tale mappatura. Gran parte del comportamento della mappatura della tastiera è configurabile, ma ci sono molti casi speciali come Bloc Num, Selettore di modalità e Bloc maiusc / Blocco maiuscole che sono codificati in X11. Altri aspetti come Shift sono in realtà configurabili. Qualsiasi tasto può essere mappato per agire come shift, a differenza di Mode Switch o Num Lock.
I KEYCODE rappresentano le chiavi fisiche inviate dal kernel del sistema operativo. Ogni KEYCODE può essere associato a 8 possibili KEYSYM. Ne vengono utilizzati solo 4 e talvolta vengono chiamati livelli 1-4. Il livello 1 specifica KEYSYM che viene stampato quando non sono attivi modificatori. Si tratta spesso di lettere e cifre minuscole. I modificatori sono KEYCODE che modificano il KEYSYM generato da altri KEYCODE quando il modificatore è attivo (premuto o attivato). Anche i codici chiave del modificatore sono controllati tramite Xmodmap. Il livello 2 specifica un KEYSYM da inviare quando si preme il modificatore del turno. Il livello 3 viene attivato ogni volta che si preme il selettore di modalità KEYSYM. Il livello 4 viene attivato quando sono attivi sia un tasto shift che un interruttore di modalità.
Una volta generato un KEYSYM, questo può essere interpretato direttamente, ma molto spesso verrà convertito in testo. Non tutti i KEYSYM si trasformano in testo o possono influire solo su un KEYSYM futuro. Un esempio è Shift_L, ovviamente, che non ha una rappresentazione testuale, ma ci sono anche un certo numero di KEYSYM usati per comporre un altro personaggio. Un elenco di questi sul mio sistema è sotto /usr/share/X11/locale/en_US.UTF-8/Compose
. Uno di questi esempi è il KEYSYM dead_acute che, quando premuto, tenterà di convertire il KEYSYM successivo in una lettera accentata acuta. Esiste una mappatura standard per trasformare KEYSYM in Unicode.
Ora che tutto ciò è stato detto, nota che Xmodmap è obsoleto e sostituito da XKB che è molto più sofisticato. Ciò influisce sul modo in cui i KEYCODE sono associati ai KEYSYM, ma non sul modo in cui il kernel genera i KEYCODE né sul modo in cui i KEYSYM vengono convertiti in testo o composti, il che è sempre lo stesso. XKB può essere disabilitato ripristinando il comportamento di Xmodmap. Ha anche un livello di compatibilità per supportare Xmodmap, ma può avere problemi in quanto non è completamente compatibile. Le regole XKB sono sotto /usr/share/X11/xkb/
e sono molto più sofisticate. C'è altra buona documentazione altrove su come genera layout di tastiera per la mappatura di KEYCODE su KEYSYMs.
Per quanto riguarda la console Linux, ha i suoi layout di tastiera che sono memorizzati /usr/share/keymaps
e caricati con il loadkeys
comando. Quando si trova nel BIOS e nelle fasi precedenti del boot loader, incluso GRUB2, la mappatura della tastiera è qualunque sia il numero a cui il BIOS decide di mappare la chiave.