Хочу Вам розпов╕сти, як Ви в 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 ╕ насолоджуватися потр╕йною розкладкою клав╕атури. Ваша робота в середовищ╕ Linux буде ще на один крок менше в╕др╕знятися в╕д роботи у середовищ╕ MS Windows, а, можливо, нав╕ть в дечому ╖╖ полегшувати.
Тарас Бродович, 2003