11. prosince 2010

Jak přidat vlastní rozložení klávesnice v Linuxu

Jsem zvyklý na svoje rozložení klávesnice - tedy svoje... standardní českou QWERTY z Windows. Bohužel toto rozložení není v Linuxu k dispozici. Vytvořil jsem tedy svoji úpravu linuxového CZ QWERTY rozložení, které odpovídá tomu, na které jsem zvyklý.
Protože občas zkouším různé distribuce, nebo naopak občas potřebuji nějaký Linux nainstalovat abych mohl dělat to, co ve Windows nemůžu, občas potřebuji znovu tohle rozložení nahrát do systému. Proto jsem si sepsal tenhle postup krok za krokem, abych to příště zas nemusel složitě vymýšlet a googlit.
Postup sedí na Debian-based distribuce, v ostatních se to může lišit, ale ty nepoužívám...
  1. Stáhnout soubor s upraveným rozložením
  2. Přepsat původní soubor cz v /usr/share/X11/xkb/symbols/
    # cd /usr/share/X11/xkb/symbols/
    # wget http://pub.gcm.cz/cz
    # mv cz cz.old
    # mv cz.1 cz
  3. Nyní je třeba systému říct, že máme nějaké další rozložení, aby bylo vidět v klikátku pro výběr rozložení. Tyto informace se nachází v souborech /usr/share/X11/xkb/rules/xorg.xml a /usr/share/X11/xkb/rules/xorg.lst.
  4. V souboru xorg.xml najdeme oblast týkající se českého rozložení (vyhledat v souboru Czechia) a do <variantlist> přidat nový tag:
    <variant>
      <configitem>
        <name>win</name>
        <description>qwerty (Windows version)</description>
      </configitem>
    </variant>
  5. V souboru xorg.lst najít opět oblast týkající se českých variant klávesnice (např. řádek začínající bksl) a někam tam přidat řádek
    win             cz: qwerty (Windows version)
  6. Krok 4 resp. 5 ještě můžeme zopakovat pro soubor evdev.xml resp. evdev.lst. Netuším, proč to samé musí být ve dvou souborech, ale pravděpodobně to bude mít nějaký historický význam.
  7. Nyní by mělo stačit restartovat X.org, a nový layout klávesnice by měl být přístupný v nastavení systému.
Ještě přikládám patch, který opatchuje všechny soubory správně:

diff -Naur xkb/rules/evdev.lst /usr/share/X11/xkb/rules/evdev.lst
--- xkb/rules/evdev.lst 2010-04-15 14:12:21.000000000 +0200
+++ /usr/share/X11/xkb/rules/evdev.lst 2010-12-11 21:36:40.719018001 +0100
@@ -367,6 +367,7 @@
   qwerty_bksl     cz: qwerty, extended Backslash
   ucw             cz: UCW layout (accented letters only)
   dvorak-ucw      cz: US Dvorak with CZ UCW support
+  win             cz: qwerty (Windows version)
   nodeadkeys      dk: Eliminate dead keys
   mac             dk: Macintosh
   mac_nodeadkeys  dk: Macintosh, eliminate dead keys
diff -Naur xkb/rules/evdev.xml /usr/share/X11/xkb/rules/evdev.xml
--- xkb/rules/evdev.xml 2010-04-15 14:12:21.000000000 +0200
+++ /usr/share/X11/xkb/rules/evdev.xml 2010-12-11 21:36:08.329018001 +0100
@@ -2101,6 +2101,12 @@
      <description>US Dvorak with CZ UCW support</description>
   </configItem>
  </variant>
+ <variant>
+   <configItem>
+     <name>win</name>
+     <description>qwerty (Windows version)</description>
+   </configItem>
+ </variant>
       </variantList>
     </layout>
     <layout>
diff -Naur xkb/rules/xfree86.lst /usr/share/X11/xkb/rules/xfree86.lst
--- xkb/rules/xfree86.lst 2010-04-15 14:12:21.000000000 +0200
+++ /usr/share/X11/xkb/rules/xfree86.lst 2010-12-11 21:17:24.769018003 +0100
@@ -367,6 +367,7 @@
   qwerty_bksl     cz: qwerty, extended Backslash
   ucw             cz: UCW layout (accented letters only)
   dvorak-ucw      cz: US Dvorak with CZ UCW support
+  win             cz: qwerty (Windows version)
   nodeadkeys      dk: Eliminate dead keys
   mac             dk: Macintosh
   mac_nodeadkeys  dk: Macintosh, eliminate dead keys
diff -Naur xkb/rules/xfree86.xml /usr/share/X11/xkb/rules/xfree86.xml
--- xkb/rules/xfree86.xml 2010-04-15 14:12:21.000000000 +0200
+++ /usr/share/X11/xkb/rules/xfree86.xml 2010-12-11 21:36:21.859018000 +0100
@@ -2101,6 +2101,12 @@
      <description>US Dvorak with CZ UCW support</description>
   </configItem>
  </variant>
+ <variant>
+   <configItem>
+     <name>win</name>
+     <description>qwerty (Windows version)</description>
+   </configItem>
+ </variant>
       </variantList>
     </layout>
     <layout>
diff -Naur xkb/rules/xorg.lst /usr/share/X11/xkb/rules/xorg.lst
--- xkb/rules/xorg.lst 2010-04-15 14:12:21.000000000 +0200
+++ /usr/share/X11/xkb/rules/xorg.lst 2010-12-11 21:17:24.769018003 +0100
@@ -367,6 +367,7 @@
   qwerty_bksl     cz: qwerty, extended Backslash
   ucw             cz: UCW layout (accented letters only)
   dvorak-ucw      cz: US Dvorak with CZ UCW support
+  win             cz: qwerty (Windows version)
   nodeadkeys      dk: Eliminate dead keys
   mac             dk: Macintosh
   mac_nodeadkeys  dk: Macintosh, eliminate dead keys
diff -Naur xkb/rules/xorg.xml /usr/share/X11/xkb/rules/xorg.xml
--- xkb/rules/xorg.xml 2010-04-15 14:12:21.000000000 +0200
+++ /usr/share/X11/xkb/rules/xorg.xml 2010-12-11 21:36:21.859018000 +0100
@@ -2101,6 +2101,12 @@
      <description>US Dvorak with CZ UCW support</description>
   </configItem>
  </variant>
+ <variant>
+   <configItem>
+     <name>win</name>
+     <description>qwerty (Windows version)</description>
+   </configItem>
+ </variant>
       </variantList>
     </layout>
     <layout>
diff -Naur xkb/symbols/cz /usr/share/X11/xkb/symbols/cz
--- xkb/symbols/cz 2010-04-15 14:12:22.000000000 +0200
+++ /usr/share/X11/xkb/symbols/cz 2010-12-11 22:10:22.709018003 +0100
@@ -172,3 +172,42 @@
 
     include "level3(ralt_switch)"
 };
+
+xkb_symbols "win" {
+        // This layout works exactly as Windows CZ QWERTY keyboard.
+
+        include "cz(basic)"
+        name[Group1]= "Czechia - windows qwerty";
+
+        key <AB01> { [  z,      Z,      NoSymbol,       NoSymbol ] };
+        key <AD06> { [  y,      Y,      NoSymbol,       NoSymbol ] };
+
+        key <AE01>      { [      plus, 1, exclam,            NoSymbol ] };
+        key <AE02>      { [    ecaron, 2, at,                NoSymbol ] };
+        key <AE03>      { [    scaron, 3, numbersign,        NoSymbol ] };
+        key <AE04>      { [    ccaron, 4, dollar,            NoSymbol ] };
+        key <AE05>      { [    rcaron, 5, percent,           NoSymbol ] };
+        key <AE06>      { [    zcaron, 6, asciicircum,       NoSymbol ] };
+        key <AE07>      { [    yacute, 7, ampersand,         NoSymbol ] };
+        key <AE08>      { [    aacute, 8, asterisk,          NoSymbol ] };
+        key <AE09>      { [    iacute, 9, parenleft,         NoSymbol ] };
+        key <AE10>      { [    eacute, 0, parenright,        NoSymbol ] };
+        key <AE11>      { [     equal,    percent,     NoSymbol,   dead_diaeresis ] };
+        key <AE12>      { [ dead_acute, dead_caron,  equal, plus ]      };
+        key <LSGT>      { [ dead_diaeresis, apostrophe, backslash, bar ] };
+
+        key <AD11>      { [    uacute,      slash,  bracketleft,    braceleft ] };
+        key <AD12>      { [ parenright,  parenleft, bracketright,  braceright ] };
+
+        key <AC10>      { [     uring,   quotedbl,       semicolon,     colon ] };
+        key <AC11>      { [   section,     exclam,   apostrophe,       ssharp ] };
+        key <AC12>      { [  EuroSign, dead_diaeresis, NoSymbol,     NoSymbol ] };
+        key <BKSL>      { [ dead_diaeresis, apostrophe, backslash,        bar ] };
+
+        key <AB08>      { [     comma,   question,         less,     NoSymbol ] };
+        key <AB09>      { [    period,      colon,      greater,     NoSymbol ] };
+        key <AB10>      { [     minus, underscore,     asterisk,     NoSymbol ] };
+
+        key <SPCE>      { [     space,      space,        space,        space ] };
+};
+