Relazione tra layout della tastiera e xmodmap


12

Sto usando Xubuntu. Prima dell'accesso posso scegliere un layout di tastiera. Sto usando xmodmapper rimappare alcune chiavi.

Sono interessato a due cose:

  1. Come cambia lo stato della mappatura della tastiera (a) quando accendo il laptop, (b) durante il processo di avvio e (c) eseguo l'accesso al sistema (in queste tre fasi) e quando si lavora con il sistema (accesso).
  2. Cosa causa quali simboli verranno visualizzati sullo schermo (e i tasti di controllo inviati) durante le singole fasi. Quando premo un tasto, invia un segnale al driver della tastiera (?) E quindi ci deve essere un processo decisionale (applicazioni e file di configurazione) che determina quali simboli verranno visualizzati. La risposta a questa domanda dovrebbe essere l'elenco di applicazioni e percorsi per quei file di configurazione (sono particolarmente interessato a Ubuntu (sistema basato su Debian), ma puoi descrivere qualche altro sistema, ma Ubuntu è preferito).

Risposte:


25

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/keymapse caricati con il loadkeyscomando. 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.


Grazie per la grande spiegazione e nuove informazioni. Sai quali applicazioni vengono avviate nel processo di avvio (upstart o initscript) che prende la decisione sulla tastiera e cosa succede al login nella fase Posso scegliere il layout. Quale programma interagisce con esso e dove è archiviato nel filesystem? Dopo il login xmodmap o xkb sovrascriveranno il layout predefinito scelto durante il processo di login?
xralf,

La keymap del kernel, come ho detto, è caricata loadkeysda uno degli script init. grep loadkeys /etc/init.d/*rivela il file keymap.sh. X11 ha il suo keymap che è stato tradizionalmente caricato da Xmodmap in esecuzione da uno degli script di avvio di Xsession. Al giorno d'oggi, con XKB utilizzato al posto di Xmodmap, il keymap predefinito è impostato in Xorg.conf tramite le varie opzioni di Xkb o tramite HAL. Una volta caricato Gnome o KDE Display Manager, possono caricare il proprio layout tramite il setxkbmapcomando. L'ambiente desktop di un utente potrebbe anche impostare un layout diverso all'accesso.
penguin359

Ho provato il comando grep loadkeys /etc/init.d/*e locate keymap.she non è stato trovato. Anche il file Xorg.conf non è stato trovato. Dipende dalla mia versione di Ubuntu che è 10.04?
xralf,

Che tipo di evento riceverà la finestra? Un evento con KEYSYM e quindi l'applicazione trasforma KEYSYM in testo, in che modo? Xorg fornisce un'interfaccia IPC / RPC per le app per convertire KEYSYM in testo? O l'app deve farlo da sola?
炸鱼 薯条 德里克
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.