Хочу сделать управление курсором по 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 продолжает возвращать оригинальные биндинги.
Что я делаю не так?