Хочу Вам розповісти, як Ви в 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 і насолоджуватися потрійною розкладкою клавіатури.