GNU/Linux >> Znalost Linux >  >> Linux

Vztah rozložení klávesnice a Xmodmap?

Používám Xubuntu. Před přihlášením si mohu vybrat rozložení klávesnice. Používám xmodmap pro přemapování některých klíčů.

Zajímají mě dvě věci:

  1. Jak se změní stav mapování klávesnice (a) když zapnu notebook, (b) během procesu spouštění a (c) přihlášení do systému (v těchto třech fázích) a při práci se systémem (přihlášení ).
  2. Co způsobuje, které symboly se zobrazí na obrazovce (a odešlou ovládací tlačítka) během jednotlivých fází. Když stisknu nějakou klávesu, vyšle nějaký signál do ovladače klávesnice(?) a pak musí existovat nějaký rozhodovací proces (aplikace a konfigurační soubory), který určí, jaké symboly se zobrazí. Odpovědí na tuto otázku by měl být seznam aplikací a cesty k těmto konfiguračním souborům (obzvláště mě zajímá Ubuntu (systém založený na Debianu), ale můžete popsat nějaký jiný systém, ale preferuje se Ubuntu).

Přijatá odpověď:

Jsou zde dvě vrstvy, mapování KEYCODE na KEYSYM a mapování KEYSYM na text. Existuje více vrstev, pokud počítáte jádro, které musí mapovat skenovací kódy klávesnice AT na KEYCODE ve stylu XT nebo HID kód USB klávesnice na KEYCODE. KEYCODE je jednoduše 8bitové celé číslo bez znaménka, které jádro operačního systému předá serveru X11. Může se lišit mezi operačními systémy, jako je Linux a Solaris. Na Linuxu jsou tyto KEYCODE obvykle stejné jako na starých klávesnicích XT PC. Novější počítače s klávesnicemi AT, PS/2 nebo USB obvykle pouze mapují tyto klávesnice na starý kód XT pro klíč, aby byl život jednoduchý.

Nezpracované kódy klávesnice, ať už se jedná o XT, AT, PS/2 nebo USB, představují fyzické umístění na klávesnici. Klávesnice XT odešle pouze jedno 8bitové číslo při stisknutí nebo uvolnění klávesy. Klávesa q na americké/britské klávesnici XT posílá číslo 16. Na francouzské klávesnici je stejná fyzická klávesa označena a, ale stále posílá 16. Skutečný význam jí přiřazují vyšší vrstvy operačního systému. Po uvolnění klávesy na klávesnici XT se odešle stejný kód klávesy plus 128. V tomto příkladu, když je stisknuto q, je odeslána 16, ale při uvolnění je odesláno číslo 142 (16+128). Klávesnice AT používají skenovací kódy, které jsou řadou čísel a mohou být poměrně dlouhé. Uvolnění klíčů přidává další kódy. Například skenovací kód pro Pauza je E1, 1D, 45, E1, 9D, C5. Většina operačních systémů včetně DOS, Windows, Linux, FreeBSD a BIOS mapuje skenovací kódy na mnohem jednodušší skenovací kódy ve stylu XT. Usnadňuje také podporu novějších klávesnic, které používají různé kódy, jako jsou klávesnice USB, které odesílají kódy HID. Všechny kódy jsou operačním systémem mapovány na stejnou konzistentní sadu kódů, než je uvidí X11 nebo aplikace.

Související:Jak grepovat to či ono (2 věci) v souboru?

X11 tuto část procesu nezná, pouze získá KEYCODE z jádra a použije své vlastní mapování pro převod tohoto KEYCODE na KEYSYM. Xmodmap je standardní nástroj pro ovládání tohoto mapování. Velká část chování mapování klávesnice je konfigurovatelná, ale existuje několik speciálních případů, jako je Num Lock, Mode Switch a Caps Lock/Shift Lock, které jsou pevně zakódovány do X11. Další aspekty, jako je Shift, jsou ve skutečnosti konfigurovatelné. Libovolná klávesa může být namapována tak, aby fungovala jako shift, na rozdíl od přepínání režimů nebo Num Lock.

KEYCODE představují fyzické klíče zaslané jádrem operačního systému. Každý KEYCODE může mapovat na 8 možných KEYSYMů. Používají se pouze 4 a někdy se nazývají úrovně 1-4. Úroveň 1 určuje KEYSYM, který se vytiskne, když nejsou aktivní žádné modifikátory. Často se jedná o malá písmena a číslice. Modifikátory jsou KEYCODE, které upravují KEYSYM generovaný jinými KEYCODE, když je modifikátor aktivní (stisknutý nebo zapnutý). Kódy modifikátorů jsou také ovládány pomocí Xmodmap. Úroveň 2 určuje KEYSYM, který má být odeslán, když je stisknut modifikátor Shift. Úroveň 3 se aktivuje vždy, když stisknete přepínač režimu KEYSYM. Úroveň 4 se aktivuje, když je aktivní jak tlačítko Shift, tak přepínač režimu.

Jakmile je KEYSYM vygenerován, může být interpretován přímo, ale nejčastěji bude převeden na text. Ne všechny KEYSYM se změní na text nebo mohou ovlivnit pouze budoucí KEYSYM. Jedním příkladem je Shift_L, samozřejmě, který nemá žádné textové zastoupení, ale existuje také řada KEYSYMů, které se používají k sestavení dalšího znaku. Jejich seznam v mém systému je pod /usr/share/X11/locale/en_US.UTF-8/Compose . Jedním takovým příkladem je dead_acute KEYSYM, který se po stisknutí pokusí převést další KEYSYM na písmeno s akutním diakritikou. Existuje standardní mapování pro přeměnu KEYSYMs na Unicode.

Nyní, když toto vše bylo řečeno, všimněte si, že Xmodmap je zastaralý a nahrazený XKB, který je mnohem sofistikovanější. To má vliv na to, jak jsou KEYCODE mapovány na KEYSYM, ale ne na to, jak jádro generuje KEYCODE, ani na to, jak jsou KEYSYM konvertovány na text nebo složeny, které jsou stále stejné. XKB lze zakázat obnovením chování Xmodmap. Má také vrstvu kompatibility pro podporu Xmodmap, ale může mít problémy, protože není zcela kompatibilní. Pravidla XKB jsou pod /usr/share/X11/xkb/ a jsou mnohem sofistikovanější. Jinde je dobrá dokumentace o tom, jak generuje rozložení klávesnice pro mapování KEYCODE na KEYSYMs.

Pokud jde o linuxovou konzoli, má své vlastní rozložení klávesnice, které je uloženo v /usr/share/keymaps a načte se pomocí loadkeys příkaz. V systému BIOS a dřívějších fázích zavaděče, včetně GRUB2, je mapování klávesnice jakékoli číslo, na které se BIOS rozhodne klíč namapovat.

Související:Debian – Openssl upgradováno přes apt-get, `openssl version` zobrazuje předchozí verzi?
Linux
  1. Změna rozložení/mapování klávesnice na konzole (tty) i na X agnostickým způsobem X/konzole?

  2. Kombinace mapovacích klíčů s Xmodmap?

  3. Změnit rozložení klávesnice v Lightdm?

  1. Xmodmap Shift + Keycode pro vytvoření Keysym?

  2. Vynutit prázdnou obrazovku a ignorovat vstup?

  3. Emacs, Linux a mezinárodní rozložení klávesnice

  1. Linux:změna rozložení klávesnice za běhu

  2. Rozložení klávesnice Xephyr

  3. Přemapujte klíče bez xmodmap nebo jakýchkoli nástrojů X