LINUX.ORG.RU

Сначала пытался использовать xmodmap, чтобы забиндить Caps на свободный модификатор Mod3, чтобы потом использовать xbindkeys, в конфиге которого записано

"setxkbmap -layout us"
    Mod3 + c:10 + release

"setxkbmap -layout ru"
    Mod3 + c:11 + release

"setxkbmap -layout de"
    Mod3 + c:12 + release

Однако, setxkbmap перезаписывает xmodmap и модификатор слетает. Пришлось отредактировать /usr/share/X11/xkb/symbols/pc:

$ pwd                                                                 
/usr/share/X11/xkb/symbols
$ diff pc.bak pc
22c22
<     key <CAPS> {      [ Caps_Lock             ]       };
---
>     key <CAPS> {      [ Hyper_L               ]       };
36,37c36
<     modifier_map Lock   { Caps_Lock };
< 
---
>     
57c56
<     modifier_map Mod4   { <HYPR> };
---
>     modifier_map Mod3   { Hyper_L };

В качестве бонуса отключается основной функционал Caps, так что его не надо отключать дополнительно.

Для справки:

$ xmodmap                                                                                                                                                                                                                       
xmodmap:  up to 3 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock      
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3        Hyper_L (0x42)
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)
$ setxkbmap -print
xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+ru+inet(evdev)"     };
        xkb_geometry  { include "pc(pc104)"     };
};

Спасибо откликнувшимся!

kotEe ()
Ответ на: комментарий от kotEe

Однако, setxkbmap перезаписывает xmodmap и модификатор слетает. Пришлось отредактировать /usr/share/X11/xkb/symbols/pc:

Угу, и после обновления иксов из репозитория у тебя это все нафиг перезаписывается дистрибутивным файлом и слетает. Мораль: а не надо править файлы в /usr/share/X11/xkb.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Да, про то, что /usr/share – не мой личная армия я думал, но не нашёл вариантов сразу сделать всё правильно, не хватает знаний.

Но не это оказалось страшно. Гораздо более неприятно то, что setxkbmap -layout ru начисто отламывает все сочетания клавиш во всех приложениях, начиная с Ctrl-A для выделения всего текстового поля и Ctrl-C/V для копипастинга. setxkbmap -layout us,ru ... с настроенной переключалкой так не делает, то есть на русской раскладке аккорды работают. И перестают, если ведущей раскладкой является ru (то есть -layout ru,us...).

kotEe ()
Ответ на: комментарий от kotEe

Можно вот так примерно. Но есть проблемка одна:

xkb_keymap {
    xkb_keycodes        { include "evdev+aliases(qwerty)" };
    xkb_geometry        { include "pc(pc105)" };
    xkb_compatibility   { include "complete" };
    xkb_types           { include "complete" };
    xkb_symbols {
        replace key <AE01> { 
                type = "EIGHT_LEVEL",
                actions[Group1] = [ NoAction(), NoAction(), NoAction(), NoAction(), LockGroup(group=1) ],
                actions[Group2] = [ NoAction(), NoAction(), NoAction(), NoAction(), LockGroup(group=1) ],
                actions[Group3] = [ NoAction(), NoAction(), NoAction(), NoAction(), LockGroup(group=1) ]
        };
        replace key <AE02> { 
                type = "EIGHT_LEVEL",
                actions[Group1] = [ NoAction(), NoAction(), NoAction(), NoAction(), LockGroup(group=2) ],
                actions[Group2] = [ NoAction(), NoAction(), NoAction(), NoAction(), LockGroup(group=2) ],
                actions[Group3] = [ NoAction(), NoAction(), NoAction(), NoAction(), LockGroup(group=2) ]
        };

        replace key <AE03> { 
                type = "EIGHT_LEVEL",
                actions[Group1] = [ NoAction(), NoAction(), NoAction(), NoAction(), LockGroup(group=3) ],
                actions[Group2] = [ NoAction(), NoAction(), NoAction(), NoAction(), LockGroup(group=3) ],
                actions[Group3] = [ NoAction(), NoAction(), NoAction(), NoAction(), LockGroup(group=3) ]
        };
        include "pc+us+ru:2+de:3+inet(evdev)+level5(caps_switch)+level3(ralt_switch)"
        };
};

Что тут сделано. CapsLock вешаем на level5. На Level3 не стал вешать, так как в базовой немецкой раскладке на третьем уровне на кнопках <1>, <2>, <3> есть символы какие-то, хоть и специфичные. На level3 повесил правый Alt.

Закидываем на сервер xkbcomp caps_1_2_3.xkb $DISPLAY, можно потом еще холостой setxkbmap без параметров. В общем-то, работает. Но теперь проблема. Я проверил у себя на каких-то приложениях Qt5, Emacs, GTK3 (Inkscape), GTK2 (Gimp), Blender. но вот Firefox перед переключением раскладки печатает 1, 2 или 3. У меня какое-то впечатление, что FF как-то по-своему обрабатывает кнопки.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)