在 Fedora 上生成多个扫描码的映射键

在 Fedora 上生成多个扫描码的映射键

我拥有一台 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-LeftFn-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键并更改LeftCtrlRightCtrl因为按该顺序对我来说更自然 ( 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,但在寻找解决方案时可能很有用。
  • Mod4Windows关键

答案3

我终于解决了这个问题。解决方案的关键步骤在Arch wiki上找到这里。它与我拥有的 MSI 笔记本电脑不完全相同,但它仍然适合我。

我所要做的就是将键码 93 分配给它的原始函数:

〜/.Xmodmap

keycode  93 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

然后,由于我在快捷方式设置中使用 KDE,我已将触摸板切换操作映射到所需的 F4 键。

相关内容