Od wersji 2.1 XFree86 zainicjuje swój układ klawiatury z układu linuxowego, na tyle na ile można. Linux jednak miał 16 pozycji na klawisz (jedna na każdą kombinację modyfikatorów Shift, AltGr, Ctrl, Alt) a obecnie 256 pozycji na klawisz, podczas gdy X ma cztery pozycje na klawisz (jedna na każdą kombinację Shift i Mod), tak więc część informacji musi się zgubić.
X najpierw czyta plik Xconfig, gdzie można znależć definicje
klawiszy LeftAlt, RightAlt, RightCtl, ScrollLock keys takie jak Meta,
ModeShift, Compose, ModeLock czy ScrollLock - patrz X386keybd(1),
później XFree86kbd(1).
Za Mod przyjmuje się lewy Alt, chyba że prawy Ctrl zdefiniowano jako ModeShift lub ModeLock, w którym to przypadku przyjmuje się prawy Ctrl, lub chyba że tak zdefiniowano prawy Alt, w którym to przypadku przyjmuje się prawy Alt. Ustala to w jaki sposób cztery znaczenia klawisza pod XFree86 są wybierane z szesnastu znaczeń linuxowych. Zauważ że dzisiaj Linux domyślnie nie rozróżnia pomiędzy dwoma klawiszami Ctrl i Shift. X jednak rozróżnia.
Następnie czytany jest układ klawiatury z jądra i poczynione zostają oczywiste odpowiednie przypisania pod X. Przypisania "klawiszy czynnościowych" - Show_Memory, Show_State, Show_Registers, Last_Console, Console_n, Scroll_Backward, Scroll_Forward, Caps_On and Boot są ignorowane, tak samo jak klawisze diakrytyk i klawisze blokujące klawiaturę w określonym trybie [locks] (z wyjątkiem ShiftLock), oraz klawisze "ASCII-x"
Później używane są definicje z pliku Xconfig. Tak więc definicja
klawisza Compose z Xconfig weźmie górę nad wartością znajdującą
się w układzie klawiatury Linuxa.
Co dzieje się z ciągami znaków skojarzonymi z klawiszami funkcyjnymi?
Nic. X nie posiada takiej koncepcji (ale możliwe jest zdefiniowanie
łańcuchów znaków dla klawiszy funkcyjnych w xterm - zauważ jednak
że najpierw otrzymuje te klawisze program zarządzający oknami).
Nie wiem jak przekonać xterm że powinien używać układu klawiatury
X w czasie naciskania Alt; wydaje się że po prostu patrzy na swój zasób
eightBitInput, i zależnie od tego jaką ma wartość logiczną albo
ustawia ósmy bit znaku, albo wypisuje dodatkowy znak Escape (tak jak
setmetamode(1) robi na konsoli).