Шукати в цьому блозі

понеділок, 21 вересня 2009 р.

Игры с xkbcomp

Господа, как же мне не нравится циклическое переключение раскладок клавиатуры. Циклически это как? Это когда за английским следует русский, за русским украинский, за украинским опять английский и т.д.
До чего-же упрощается жизнь когда привыкаешь к асимметричному переключению раскладок. Это когда переключению в каждую раскладку соответствует своя комбинация.
Например, хотите английский - нажмите CapsLock (очень часто-густо нужная клавиша, правда?), русский - Shift + CapsLock, украинский Ctrl + CapsLock. Кажется неудобным? Как бы не так! Когда привыкните - не сможете больше отвыкнуть.
Так как же это сделать в любимых X'ах? На самом деле не просто, а очень просто. Изначально, года четыре назад, я просто как обезьяна скопировал у sash-kan'а маленький keymap, которым сейчас с удовольствием готов поделиться дальше [gz, bz2, xz]:
xkb_keymap {
    xkb_keycodes { include "evdev+aliases(qwerty)" };
    xkb_geometry { include "pc(pc104)" };
    xkb_types    {
        include "complete"
        type "THREE_GROUPS" {
            modifiers = Shift+Control+Alt;
            map[None] = Level1;
            map[Shift] = Level2;
            map[Control] = Level3;
            map[Control+Shift] = Level4;
            map[Alt] = Level5;
            level_name[Level1] = "Base";
            level_name[Level2] = "Shift";
            level_name[Level3] = "Ctrl";
            level_name[Level4] = "Ctrl Shift";
            level_name[Level5] = "Alt";
        };
    };
    xkb_compatibility { include "complete" };
    xkb_symbols {
        include "pc+us+ru:2+ua:3+us(dvorak):4+level3(menu_switch)+inet(evdev)"
        replace key <CAPS>
        {
            type = "THREE_GROUPS",
            actions[Group1]=[LockGroup(group=1), LockGroup(group=2), LockGroup(group=3), LockMods(modifiers=Lock), LockGroup(group=4)]
        };
    };
};

Собственно "изюминка" тут даже невооружённым взглядом заметна. Ну и ещё. Безусловно этот конфиг в каждой секции можно дополнить другими определениями - это всего лишь обычный keymap который скармливается xkbcomp'у.
Чтобы этот конфиг отрабатывал каждый раз при входе в Ваш любимый DE, сохраните вышеприведённый конфиг, скажем, в /usr/share/X11/xkb/keymap/three_groups и нарисуйте примерно такой скрипт в /etc/X11/Xsession.d/60xkb-lang:
(
cd /usr/share/X11/xkb/ && xkbcomp keymap/three_groups $DISPLAY &>/dev/null
)

true
Маленькая заметка напоследок. Уже несколько раз при обновлении любимого Debian'а сталкивался с проблемой, что разработчики что-то переписывали-переопределяли в xkb в результате чего надо было заново и заново пытаться перелопатить конфиг в поиске нужной комбинации include в symbols. Огромное спасибо sash-kan'у который натолкнул сегодня меня на следующую мысль:
$ xkbcomp $DISPLAY - | less
Просто сегодня в очередной раз обновился и с расстройством обнаружил, что у меня не отрабатывают клавиши Up, Down, Left, Right, Home и т.д. когда компилится вышеуказанный keymap. Но при этом великолепно работают при, так сказать, установках "по-умолчанию" в Gnome. Простая командочка:
$ xkbcomp $DISPLAY - | egrep "^xkb_"
позволила увидеть искомую комбинацию для include. Моему счастью не было предела! ;)
Ну, собственно, на этой оптимистической нотке эту заметку можно и закончить :)

Немає коментарів: