March 20th, 2006

bird

XKB & три языка

Caps - лат<->рус, Ctrl+Caps - укр->рус<->укр.
Не по Паскалю.


# cat types/nx_types 
partial default xkb_types "nx_types" {
  include "complete"
  type "CAPS" {
    modifiers = Shift+Control;
    map[Shift] = Level2;
    map[Control] = Level3;
    level_name[Level1] = "Base";
    level_name[Level2] = "Shift";
    level_name[Level3] = "Control";
  };
};



# cat symbols/nx_group 
partial modifier_keys
xkb_symbols "nx_caps_toggle" {
  key   <CAPS> {
    type = "CAPS",
    actions[Group1] = [ LockGroup(group=2), LockMods(mods=Lock), LockGroup(group=3) ],
    actions[Group2] = [ LockGroup(group=1), LockMods(mods=Lock), LockGroup(group=3) ],
    actions[Group3] = [ LockGroup(group=1), LockMods(mods=Lock), LockGroup(group=2) ]
  };
};


В конфиге иксов писать:


  XkbKeycodes "xfree86+aliases(qwerty)"
  XkbTypes "nx_types"
  XkbCompat "complete+leds(scroll)"
## для xorg 6.9.0 надо писать: complete+ledscroll(group_lock). -- 2006-07-12
  XkbSymbols "pc/pc(pc105)+pc/us+pc/ru:2+pc/ua:3+nx_group(nx_caps_toggle)"
## для xorg 7.2 надо писать: pc+us+ru:2+ua:3+nx_group(nx_caps_toggle). -- 2007-08-10
  XkbGeometry "pc(pc105)"


Или подключать на ходу:
/usr/local/bin/xkbcomp ~/lib/xkbmap1 "$DISPLAY"

$ less lib/xkbmap1
xkb_keymap {
        xkb_keycodes  { include "xfree86+aliases(qwerty)"       };
        xkb_types     { include "nx_types"      };
        xkb_compat    { include "complete+ledscroll(group_lock)" };
        xkb_symbols   { include "pc+us+ru:2+ua:3+nx_group(nx_caps_toggle)" };
        xkb_geometry  { include "pc(pc105)"     };
};


У xxkb не забыть выключить two_state.

P.S. А всё-таки путаница этот ваш XKB.

P.P.S. До досовского драйвера не дотянул - там запоминалось, какая из местных групп была выбрана перед латинской, и восстанавливалась она же; у меня всегда переходит на русскую. Но сначала мне было облом думать это, а потом я чуть переделал схему и решил, что мне это не нужно.

UPD: P.S.[3]: странно себя ведут приложения если на эту раскладку переключено на ходу: SIGSEGV, однако.

UPD[2006-07-12]: см. выше про 6.9.0

UPD[2007-08-10]: для Xorg 7.2 на фряхе путь - /usr/local/share/X11/xkb

UPD[2012-09-13]: OpenSuSE: /var/lib/xkb/compiled удалять - залипает скомпилированная версия