LINUX.ORG.RU

Как сделать управление курсором RAlt+ijkl с помощью xmodmap?

 , , xkbcomp,


0

1

Хочу сделать управление курсором по RAlt+ijkl глобальным в иксах.

Сделал так:

aidaho@optiplex:~$ cat ~/.Xmodmap
! Remove ralt from modifiers
remove mod1 = 108
! Use Right Alt as modifier for 'ijkl' cursor control
keycode 108 = Mode_switch

! Cheatsheet:
! keycode  <x> = <1> <2> <3> <4>
! <1>                      <key>
! <2>                <shift-key>
! <3>        <"Mode_switch"-key>
! <4>  <shift-"Mode_switch"-key>
! <5>                <AltGr-key>

keycode 31 = i I Up
keycode 44 = j J Left
keycode 45 = k K Down
keycode 46 = l L Right
keycode 30 = u U Home
keycode 32 = o O End
keycode 43 = h H Prior
keycode 57 = n N Next


xmodmap показывает, что RAlt больше не состоит в mod1
aidaho@optiplex:~$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        ISO_Next_Group (0x42)
control     Control_L (0x25)
mod1        Alt_L (0x40),  XF86LaunchC (0xcd)
mod2        Num_Lock (0x4d)
mod3
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)



Дамп xkbcomp говорит, что всё как надо: RAlt стал вызывать Mode_switch, а у нужных кнопок появилась группа, на которую Mode_switch переключает.
aidaho@optiplex:~$ xkbcomp "$DISPLAY" -

...

key <AC06> {
        type[group1]= "ALPHABETIC",
        symbols[Group1]= [               h,               H ],
        symbols[Group2]= [           Prior ]
    };
    key <AC07> {
        type[group1]= "ALPHABETIC",
        symbols[Group1]= [               j,               J ],
        symbols[Group2]= [            Left ]
    };
    key <AC08> {
        type[group1]= "ALPHABETIC",
        symbols[Group1]= [               k,               K ],
        symbols[Group2]= [            Down ]
    };
    key <AC09> {
        type[group1]= "ALPHABETIC",
        symbols[Group1]= [               l,               L ],
        symbols[Group2]= [           Right ]
    };

...

   key <RALT> {
        type= "TWO_LEVEL",
        symbols[Group1]= [     Mode_switch,        NoSymbol ],
        actions[Group1]= [ SetMods(modifiers=modMapMods,clearLocks), SetMods(modifiers=modMapMods,clearLocks) ]
    };
...


Но ничего не работает.
В xev RAlt действительно стал регистрироваться как Mode_switch:
KeyRelease event, serial 147, synthetic NO, window 0xea00001,
    root 0xf5, subw 0x0, time 4017733026, (-216,203), root:(975,827),
    state 0x8, keycode 108 (keysym 0xff7e, Mode_switch), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 147, synthetic NO, window 0xea00001,
    root 0xf5, subw 0x0, time 4017735283, (-216,203), root:(975,827),
    state 0x0, keycode 108 (keysym 0xff7e, Mode_switch), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 147, synthetic NO, window 0xea00001,
    root 0xf5, subw 0x0, time 4017735593, (-216,203), root:(975,827),
    state 0x8, keycode 31 (keysym 0x69, i), same_screen YES,
    XLookupString gives 1 bytes: (69) "i"
    XmbLookupString gives 1 bytes: (69) "i"
    XFilterEvent returns: False

KeyRelease event, serial 147, synthetic NO, window 0xea00001,
    root 0xf5, subw 0x0, time 4017735678, (-216,203), root:(975,827),
    state 0x8, keycode 31 (keysym 0x69, i), same_screen YES,
    XLookupString gives 1 bytes: (69) "i"
    XFilterEvent returns: False

Но нажатие модифицированных клавиш с зажатым Mode_switch продолжает возвращать оригинальные биндинги.

Что я делаю не так?

★★★★★

Колупаешься в иксах.

Ремапь через что-то адекватное. Я ремаплю руками через evdev/uinput.

Нестремный пример: https://gist.github.com/t184256/f4994037a2a204774ef3b9a2b38736dc

Стремный код для split angle-mod Colemak для японской клавиатуры Lenovo X220: https://gist.github.com/t184256/f6eae48b1a9eb584f2498191ebc0a260

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

Да, xmodmap это что-то странное. Попытки назначить что-то под mod5 были заранее обречены на провал.

Он зависит от раскладки. Если текущая имеет слоты под 3rd level (почему третий, когда он второй?), то тогда можно что-то назначить туда.
То есть один и тот же конфиг с раскладками `us` и `us(intl)` — это две разные вещи.

Во вторых он запарывает дополнительные раскладки.

В третьих, я понял, что от правого альта совсем отказываться не хочу.
Хочу пожертвовать только описанными комбинациями.

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

почему третий, когда он второй?

Второй это Shift. Четвёртый это Shift + третий. Короче, лучше в это не вникать без нужды.

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

В терминологии графических переключалок для [o, O, ó, Ó] второй набор (позиции 3 и 4) это 3rd level.

Для раскладки где 3rd level есть, ремап делается легко:
keycode 32 = o O NoSymbol NoSymbol End

И это реально работает с клавишей-триггером третьего уровня.
Дальше маленькая проблема: переключение раскладок разваливается.

Короче t184256 прав: этот курятник лучше не трогать вообще.

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

А то. Мой подход тоже не идеален (per-device, костыльная архитектура, его бы в прошивку клавиатуры), но там уж совсем треш и угар.

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

Очевидно, что делалось под англоязычных юзеров, которые про другие раскладки и не слышали.
Они то легко могут наломать дров во второй группе (или втором уровне первой, aka 3rd level)

Для всех остальных полезность xmodmap ограничивается манипуляциями над модификаторами.

На выходных попробую наваять что-то под себя через evdev.

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

Очевидно, что делалось под англоязычных юзеров

Если делать через XKB, то проблем кривого xmodmap не будет (там тоже можно как-то вывернуться с раскладками, но это совсем геморрой). Видимо, лучше как выше предлагали.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.