Хочу Вам розповісти, як Ви в X-Window System можете мати три і більше розкладок.

Для прикладу я використав файли за допомогою яких я зробив три розкладки: англійську, українську та російську з переключанням за допомогою правих клавіш CTRL-SHIFT.

Почнемо з того, що Ви повинні в наступний файл en_ua_ru, який повинен знаходитися в директорії /usr/X11R6/lib/X11/xkb/symbols/pc внести подані нижче дані:

partial default alphanumeric_keys xkb_symbols "basic"
{
name[Group1] = "US";
name[Group2] = "UA";
name[Group3] = "RU";

key <TLDE> { [ grave, asciitilde ], [ Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ], [ Cyrillic_io, Cyrillic_IO ] }; // 41
key <AE01> { [ 1, exclam ], [ 1, exclam ], [ 1, exclam ] }; // 2
key <AE02> { [ 2, at ], [ 2, quotedbl ], [ 2, quotedbl ] }; // 3
key <AE03> { [ 3, numbersign ], [ 3, numerosign ], [ 3, numerosign ] }; // 4
key <AE04> { [ 4, dollar ], [ 4, asterisk ], [ 4, asterisk ] }; // 5
key <AE05> { [ 5, percent ], [ 5, percent ], [ 5, percent ] }; // 6
key <AE06> { [ 6, asciicircum ], [ 6, colon ], [ 6, colon ] }; // 7
key <AE07> { [ 7, ampersand ], [ 7, question ], [ 7, question ] }; // 8
key <AE08> { [ 8, asterisk ], [ 8, asterisk ], [ 8, asterisk ] }; // 9
key <AE09> { [ 9, parenleft ], [ 9, parenleft ], [ 9, parenleft ] }; // 10
key <AE10> { [ 0, parenright ], [ 0, parenright ], [ 0, parenright ] }; // 11
key <AE11> { [ minus, underscore ], [ minus, underscore ], [ minus, underscore ] }; // 12
key <AE12> { [ equal, plus ], [ equal, plus ], [ equal, plus ] }; // 13
key <BKSL> { [ backslash, bar ], [ backslash, slash ], [ backslash, slash ] }; // 43

key <AD01> { [ q, Q ], [ Cyrillic_shorti, Cyrillic_SHORTI ], [ Cyrillic_shorti, Cyrillic_SHORTI ] }; // 16
key <AD02> { [ w, W ], [ Cyrillic_tse, Cyrillic_TSE ], [ Cyrillic_tse, Cyrillic_TSE ] }; // 17
key <AD03> { [ e, E ], [ Cyrillic_u, Cyrillic_U ], [ Cyrillic_u, Cyrillic_U ] }; // 18
key <AD04> { [ r, R ], [ Cyrillic_ka, Cyrillic_KA ], [ Cyrillic_ka, Cyrillic_KA ] }; // 19
key <AD05> { [ t, T ], [ Cyrillic_ie, Cyrillic_IE ], [ Cyrillic_ie, Cyrillic_IE ] }; // 20
key <AD06> { [ y, Y ], [ Cyrillic_en, Cyrillic_EN ], [ Cyrillic_en, Cyrillic_EN ] }; // 21
key <AD07> { [ u, U ], [ Cyrillic_ghe, Cyrillic_GHE ], [ Cyrillic_ghe, Cyrillic_GHE ] }; // 22
key <AD08> { [ i, I ], [ Cyrillic_sha, Cyrillic_SHA ], [ Cyrillic_sha, Cyrillic_SHA ] }; // 23
key <AD09> { [ o, O ], [ Cyrillic_shcha, Cyrillic_SHCHA ], [ Cyrillic_shcha, Cyrillic_SHCHA ] }; // 24
key <AD10> { [ p, P ], [ Cyrillic_ze, Cyrillic_ZE ], [ Cyrillic_ze, Cyrillic_ZE ] }; // 25
key <AD11> { [ bracketleft, braceleft ], [ Cyrillic_ha, Cyrillic_HA ], [ Cyrillic_ha, Cyrillic_HA ] }; // 26
key <AD12> { [ bracketright, braceright ], [ Ukrainian_yi, Ukrainian_YI ], [ Cyrillic_hardsign, Cyrillic_HARDSIGN ] }; // 27
key <AC01> { [ a, A ], [ Cyrillic_ef, Cyrillic_EF ], [ Cyrillic_ef, Cyrillic_EF ] }; // 30
key <AC02> { [ s, S ], [ Ukrainian_i, Ukrainian_I ], [ Cyrillic_yeru, Cyrillic_YERU ] }; // 31
key <AC03> { [ d, D ], [ Cyrillic_ve, Cyrillic_VE ], [ Cyrillic_ve, Cyrillic_VE ] }; // 32
key <AC04> { [ f, F ], [ Cyrillic_a, Cyrillic_A ], [ Cyrillic_a, Cyrillic_A ] }; // 33
key <AC05> { [ g, G ], [ Cyrillic_pe, Cyrillic_PE ], [ Cyrillic_pe, Cyrillic_PE ] }; // 34
key <AC06> { [ h, H ], [ Cyrillic_er, Cyrillic_ER ], [ Cyrillic_er, Cyrillic_ER ] }; // 35
key <AC07> { [ j, J ], [ Cyrillic_o, Cyrillic_O ], [ Cyrillic_o, Cyrillic_O ] }; // 36
key <AC08> { [ k, K ], [ Cyrillic_el, Cyrillic_EL ], [ Cyrillic_el, Cyrillic_EL ] }; // 37
key <AC09> { [ l, L ], [ Cyrillic_de, Cyrillic_DE ], [ Cyrillic_de, Cyrillic_DE ] }; // 38
key <AC10> { [ semicolon, colon ], [ Cyrillic_zhe, Cyrillic_ZHE ], [ Cyrillic_zhe, Cyrillic_ZHE ] }; // 39
key <AC11> { [ apostrophe, quotedbl ], [ Ukrainian_ie, Ukrainian_IE ], [ Cyrillic_e, Cyrillic_E ] }; // 40

key <AB01> { [ z, Z ], [ Cyrillic_ya, Cyrillic_YA ], [ Cyrillic_ya, Cyrillic_YA ] }; // 44
key <AB02> { [ x, X ], [ Cyrillic_che, Cyrillic_CHE ], [ Cyrillic_che, Cyrillic_CHE ] }; // 45
key <AB03> { [ c, C ], [ Cyrillic_es, Cyrillic_ES ], [ Cyrillic_es, Cyrillic_ES ] }; // 46
key <AB04> { [ v, V ], [ Cyrillic_em, Cyrillic_EM ], [ Cyrillic_em, Cyrillic_EM ] }; // 47
key <AB05> { [ b, B ], [ Cyrillic_i, Cyrillic_I ], [ Cyrillic_i, Cyrillic_I ] }; // 48
key <AB06> { [ n, N ], [ Cyrillic_te, Cyrillic_TE ], [ Cyrillic_te, Cyrillic_TE ] }; // 49
key <AB07> { [ m, M ], [ Cyrillic_softsign, Cyrillic_SOFTSIGN ], [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };// 50
key <AB08> { [ comma, less ], [ Cyrillic_be, Cyrillic_BE ], [ Cyrillic_be, Cyrillic_BE ] }; // 51
key <AB09> { [ period, greater ], [ Cyrillic_yu, Cyrillic_YU ], [ Cyrillic_yu, Cyrillic_YU ] }; // 52
key <AB10> { [ slash, question ], [ period, comma ], [ period, comma ] }; // 53
};

Тепер я детальніше розкажу про цей файл. Можливо Ви вже здогадалися, як дані в ньому розташовані. Перші три лінійки описують назви груп, в лапках Ви можете задати будь-яку зрозумілу Вам назву.

Далі іде набір секцій key <....> { [ ], [ ], [ ] }; Саме ця секція і дозволить Вам мати декілька розкладок. Отже, є три і більше груп в квадратних дужках, кожна з яких описує коди, які будуть генеруватися системою при натисканні тієї чи іншої клавіші. Назва, яка обмежена символами <....>, означає назву клавіші у внутрішньому форматі X-Window. Ці назви та їх коди Ви зможете знайти у файлі /usr/X11R6/lib/X11/xkb/keycodes/xfree86. Як Ви можете зауважити в цьому файлі кожному імені присвоюється якийсь числовий код. Що це за коди?

default xkb_keycodes "xfree86" {
     include "xfree86(basic)"
     <BKSL> =  51;
     <LSGT> =  94;
};
xkb_keycodes "basic" {
     minimum= 8;
     maximum= 255;

     <TLDE> =  49;
     <AE01> =  10;    <AE02> =  11;    <AE03> =  12;    <AE04> =  13;
     <AE05> =  14;    <AE06> =  15;    <AE07> =  16;    <AE08> =  17;
     <AE09> =  18;    <AE10> =  19;    <AE11> =  20;    <AE12> =  21;
     <BKSP> =  22;

     <TAB>  =  23;
     <AD01> =  24;    <AD02> =  25;    <AD03> =  26;    <AD04> =  27;
     <AD05> =  28;    <AD06> =  29;    <AD07> =  30;    <AD08> =  31;
     <AD09> =  32;    <AD10> =  33;    <AD11> =  34;    <AD12> =  35;
     <RTRN> =  36;

     <CAPS> =  66;
     <AC01> =  38;    <AC02> =  39;    <AC03> =  40;    <AC04> =  41;
     <AC05> =  42;    <AC06> =  43;    <AC07> =  44;    <AC08> =  45;
     <AC09> =  46;    <AC10> =  47;    <AC11> =  48;

     <LFSH> =  50;
     <AB01> =  52;    <AB02> =  53;    <AB03> =  54;    <AB04> =  55;
     <AB05> =  56;    <AB06> =  57;    <AB07> =  58;    <AB08> =  59;
     <AB09> =  60;    <AB10> =  61;    <RTSH> =  62;

     <LALT> =  64;    <LCTL> =  37;    <SPCE> =  65;    <RCTL> = 109;
     <RALT> = 113;    <LWIN> = 115;    <RWIN> = 116;    <MENU> = 117;
     <ESC>  =   9;

     <FK01> =  67;    <FK02> =  68;    <FK03> =  69;    <FK04> =  70;
     <FK05> =  71;    <FK06> =  72;    <FK07> =  73;    <FK08> =  74;
     <FK09> =  75;    <FK10> =  76;    <FK11> =  95;    <FK12> =  96;

     <PRSC> = 111;    <SYRQ> =  92;    <SCLK> =  78;    <PAUS> = 110;
     <BRK>  = 114;    <INS>  = 106;    <HOME> =  97;    <PGUP> =  99;
     <DELE> = 107;    <END>  = 103;    <PGDN> = 105;    <UP>   =  98;
     <LEFT> = 100;    <DOWN> = 104;    <RGHT> = 102;    <NMLK> =  77;
     <KPDV> = 112;    <KPMU> =  63;    <KPSU> =  82;

     <KP7>  =  79;    <KP8>  =  80;    <KP9>  =  81;    <KPAD> =  86;
     <KP4>  =  83;    <KP5>  =  84;    <KP6>  =  85;    <KP1>  =  87;
     <KP2>  =  88;    <KP3>  =  89;    <KPEN> = 108;    <KP0>  =  90;
     <KPDL> =  91;

     <FK13> = 118;    <FK14> = 119;    <FK15> = 120;    <FK16> =  121;
     <FK17> = 122;    <KPDC> = 123;
};

На рисунку нижче я подаю розкладку стандартної клавіатури. На ньому нанесено числові та символьні дані. Числові дані у верхньому правому кутку клавіш - це скан-код, який генерується клавіатурою. Ці коди можна отримати командою showkey. Ну, а символьні коди я подав для легшого орієнтування в процесі створення розкладки.

Як можна використати цей рисунок для розробки свого файлу з розкладками клавіатури? Берете код клавіші, який Вам потрібно змінити, додаєте до нього число 8 і отримуєте код, який буде згенеровано X-Window. Далі в квадратних дужках вказуєте назву символів, які будуть згенеровані при нормальному стані клавіатури і при натисненій клавіші Shift для кожної з розкладок, які Ви вирішили собі розробити.

Наприклад Ви хочете поміняти символ, який генерується при натисканні клавіші "s" в українській розкладці.

З рисунка берете код клавіші, який дорівнює 31 додаєте 8 і отримуєте код 39. Далі з файлу, де описані клавішні коди, шукаєте якому імені присвоєно код 39 - це буде <AC02>. Тепер в групі, що розташована в других квадратних дужках і яка в моєму прикладі відповідає за українську розкладку, міняєте назви символів та ті, які бажаєте.

// 31
key <AC02> { [ s, S ], [ Ukrainian_i, Ukrainian_I ], [ Cyrillic_yeru, Cyrillic_YERU ] };

Чому я Вас заставляю займатися арифметикою, подумаєте Ви? А тому, що коди з рисунка відповідають скан-кодам клавіш у консольному режимі, тобто цей рисунок містить подвійну інформацію.

А тепер перевірте секцію InputDevice у Вашому /etc/X11/Xf86Config файлі, яка відповідає за клавіатуру і виправте її так, як подано нижче.

Section "InputDevice"
Identifier "Keyboard Turbo-Stream"
Driver     "keyboard"
Option     "XkbRules"    "xfree86"
Option     "XkbModel"    "microsoft"
Option     "XkbLayout"   "en_ua_ru"
Option     "XkbOptions"  "grp:ctrl_shift_toggle"
EndSection

Опція XkbLayout повинна вказувати ім'я файла який містить щойно розроблену Вами розкладку клавіатури.

Тепер Ви можете встановити пакет xxkb для візуального інформування про розкладку, яку Ви в даний момент використовуєте і звірте нижчеподаний конфігураційний файл з тим, який є у Вас.

XXkb.group.base: 1 - вказує на основну розкладку.
XXkb.group.alt:  2 - вказує на додаткові розкладки. Ліва кнопка мишки
XXkb.group.alt:  3 - вибирає між основною і додатковою, а права вибирає між додатковими розкладками.

XXkb.mainwindow.enable:   yes
XXkb.mainwindow.appicon:  no
XXkb.mainwindow.geometry: 48x48
XXkb.mainwindow.xpm.1:    en48.xpm
XXkb.mainwindow.xpm.2:    ua48.xpm
XXkb.mainwindow.xpm.3:    ru48.xpm
XXkb.mainwindow.xpm.4:

XXkb.button.enable:   yes
XXkb.button.geometry: 15x15-40+5
XXkb.button.gravity:  NorthEast
XXkb.button.xpm.1:    en15.xpm
XXkb.button.xpm.2:    ua15.xpm
XXkb.button.xpm.3:    ru15.xpm
XXkb.button.xpm.4:

От і все. Тепер можете вантажити X-Window і насолоджуватися потрійною розкладкою клавіатури.

Джерело

Налаштування розкладок X-Window System