我拥有一台 MSI 笔记本电脑,F 键上有一些特殊功能,例如,F4 键上切换触摸板。
在 Windows 中,此键按预期工作:启用/禁用触摸板。但在 Linux (Fedora) 中它不起作用。
showkey -s
当我按下该键时会产生以下结果:
0x1d 0xe0 0x5b 0x76 0x9d 0xe0 0xdb 0xf6
showkey
没有参数会产生这样的结果:
keycode 28 release
keycode 29 press
keycode 125 press
keycode 85 press
keycode 29 release
keycode 125 release
keycode 85 release
与我得到的几乎相同xev
:
KeyPress event, serial 28, synthetic NO, window 0x6200001,
root 0x7e7, subw 0x0, time 1277257, (692,1239), root:(692,1314),
state 0x0, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 28, synthetic NO, window 0x6200001,
root 0x7e7, subw 0x0, time 1277259, (692,1239), root:(692,1314),
state 0x4, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 28, synthetic NO, window 0x6200001,
root 0x7e7, subw 0x0, time 1277261, (692,1239), root:(692,1314),
state 0x44, keycode 93 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 28, synthetic NO, window 0x6200001,
root 0x7e7, subw 0x0, time 1277262, (692,1239), root:(692,1314),
state 0x44, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 28, synthetic NO, window 0x6200001,
root 0x7e7, subw 0x0, time 1277265, (692,1239), root:(692,1314),
state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 28, synthetic NO, window 0x6200001,
root 0x7e7, subw 0x0, time 1277266, (692,1239), root:(692,1314),
state 0x0, keycode 93 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
总共 3 个 KeyPress 事件和 3 个 KeyRelease 事件。
xbindkeys --multikey
按一下 F4 键即可给出以下信息:
"(Scheme function)"
m:0x44 + c:37
Control+Mod4 + Control_L
"(Scheme function)"
m:0x40 + c:133
Mod4 + Super_L
"(Scheme function)"
m:0x0 + c:93
NoSymbol
我尝试使用xbindkeys
第一部分将密钥重新映射到我喜欢的 .xbindkeysrc 文件中:
"xdotool key --clearmodifiers XF86TouchpadToggle"
m:0x44 + c:37 + Release
但这没有用。
请为我指明如何在 Fedora 上实现这一目标的正确方向/工具。我的第一个候选者是,xchainkeys
但它在可信/融合存储库中不可用。还有其他方法可以通过长序列扫描码重新映射按键吗?
答案1
从定义涉及 Fn 键的键盘快捷键有一些见解可以回答这个问题:
在大多数系统上,不可能检测Fn密钥本身,但您可以尝试使用:
$ xev | grep --line-buffered keysym
找出哪些密钥Fn-Left并Fn-Right发送。 (这
grep
只是降低噪音。)如果幸运的话,这些按键会将不重要的按键发送到机器,然后您可以重新映射。
例如,在我的系统上,
xev
显示我的Fn-Left 按键实际上发送了一个XF86AudioPrev
事件:state 0x0, keycode 173 (keysym 0x1008ff16, XF86AudioPrev), same_screen YES,
我可以轻松地将其重新映射为Home关键事件:
$ xmodmap -e 'keysym XF86AudioPrev = Home'
希望您能够对 End、PageUp 和 PageDown 执行相同的操作。
不幸的是,如果 xev 在您按下时没有收到任何独特的信息, Fn-Left那么您就不走运了。
令人遗憾的是,Fn按键没有像其他修饰键那样直接发送。如果是的话,我们将有更多的能力通过软件配置它们的含义。
答案2
我在 msi p15 (a10sc) 笔记本电脑上遇到完全相同的问题。
toggleTouchpad.sh
我制作了一个名为“映射到相同的组合键”的脚本,该组合显示
xbindkeys --key
当我按下该F4键并更改LeftCtrl为RightCtrl因为按该顺序对我来说更自然 ( Ctrl+ Mod4+ RightCtrl)
- 剧本:
#!/usr/bin/bash touchpadId=$(xinput list | grep -o 'Touchpad.*id=[0-9]*' | awk 'NF{print $NF}' | sed 's/id=//') propId=$(xinput list-props $touchpadId | awk '/Device Enabled \([0-9]+\)/{print $3}' | sed 's/[():]//g') propVal=$(xinput list-props $touchpadId | awk '/Device Enabled \([0-9]+\)/{print $4}') if [ "$propVal" -eq "1" ]; then xinput set-prop $touchpadId $propId 0 else xinput set-prop $touchpadId $propId 1 fi
- 我的
.xbindkeysrc
"toggleTouchpad.sh" Control+Mod4 + Control_R
如果您使用该脚本,请确保它正确获取了触摸板 ID(我不是 bash 专家),我使用了拱门维基去做吧。
显然,您可以将脚本绑定到任何其他组合键。
笔记
- 这并不能解决关键问题F4,但在寻找解决方案时可能很有用。
- Mod4是Windows关键
答案3
我终于解决了这个问题。解决方案的关键步骤在Arch wiki上找到这里。它与我拥有的 MSI 笔记本电脑不完全相同,但它仍然适合我。
我所要做的就是将键码 93 分配给它的原始函数:
〜/.Xmodmap
keycode 93 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle
然后,由于我在快捷方式设置中使用 KDE,我已将触摸板切换操作映射到所需的 F4 键。