我希望我的Menu键(键码 135)在单独按下时既充当常规上下文菜单键,又在用作修饰符时模拟我的 XF86Audio* 多媒体键,例如Menu+PgUp将模拟XF86AudioRaiseVolume
.
我可以在 KDE 的全局快捷键中设置组合键,而不是将它们应用于所有 X,但我不确定如何实现。
答案1
所需组件:xmodmap、xcape、xbindkeys。
xmodmap -e "keycode 135 = Hyper_R"
xmodmap -e "add mod3 = Hyper_R"
xmodmap -e "keycode any = Menu" # this is needed for xcape
xcape -e "Hyper_R=Menu" # for single key press on menu key
〜/ .xbindkeysrc:
# map Menu+Pause as Mute
"xdotool keyup Hyper_R keyup Pause key --clearmodifiers XF86AudioMute keydown Hyper_R key Control"
Mod3 + Pause
# map Menu+PgUp as Volume+
"xdotool keyup Hyper_R keyup Prior key --clearmodifiers XF86AudioMute keydown Hyper_R key Control"
Mod3 + Prior
# etc.
如此复杂的调用的原因xdotool
是:
keyup Hyper_R keyup Pause
- 需要清除按键,否则 XF86AudioMute 会在按下时发送,并且不会被识别为单独的按键keydown Hyper_R
- 这样组合键(在本例中为“暂停”)可以按多次,XF86AudioRaiseVolume
例如有用key Control
- 这样xcape就不会检测到假的keydown Hyper_R
和随后的真钥匙释放,以避免触发Menu功能
xdotools
调用可以外部到某些 bash 脚本,例如:
#!/bin/bash
case "$1" in
"up")
KEY="XF86AudioRaiseVolume"
SHORT="Prior"
;;
"down")
KEY="XF86AudioLowerVolume"
SHORT="Next"
;;
"mute")
KEY="XF86AudioMute"
SHORT="Pause"
;;
"next")
KEY="XF86AudioNext"
SHORT="End"
;;
"prev")
KEY="XF86AudioPrev"
SHORT="Delete"
;;
"playpause")
KEY="XF86AudioPlay"
SHORT="Insert"
;;
"stop")
KEY="XF86AudioStop"
SHORT="Home"
;;
esac
xdotool keyup Hyper_R keyup $SHORT key $KEY keydown Hyper_R key Control