Fedora

在 Fedora 上生成多個掃描碼的映射鍵

  • September 13, 2021

我擁有一台 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,但它在受信任/融合儲存庫中不可用。有沒有其他方法可以用一長串掃描碼重新映射密鑰?

定義涉及 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按鍵沒有像其他修飾鍵那樣直接發送,真是太可惜了。如果它們是,我們將有更多的能力通過軟體來配置它們的含義。

我在 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 專家),我使用Arch Wiki來執行此操作。

顯然,您可以將腳本綁定到任何其他組合鍵。

筆記

  • 這不能解決F4密鑰的問題,但在找到解決方案時可能很有用。
  • Mod4Windows關鍵

引用自:https://unix.stackexchange.com/questions/630276