Keyboard

為 XKB 重新映射密鑰

  • March 16, 2020

我正在嘗試重新映射 Scroll Lock 鍵,以便它生成任何 Windows 鍵的鍵碼。

首先,我轉儲目前的鍵盤映射:

xkbcomp $DISPLAY original-dump

然後找到我感興趣的鍵的鍵碼:

cat original-dump | grep SCLK
<SCLK> = 78;

cat original-dump | grep LWIN
<LWIN> = 133;

現在我將組件名稱列印到一個文件中:

setxkbmap -print > original-components

編輯文件以添加我的鍵碼修改:

   xkb_keymap {
   xkb_keycodes  { 
       include "evdev+aliases(qwerty)" 
       // Remap Scroll-lock to the keycode of LWIN(133)
       <SCLK> = 133;
   };
   xkb_types     { include "complete"  };
   xkb_compat    { include "complete"  };
   xkb_symbols   { include "pc+us+inet(evdev)" };
   xkb_geometry  { include "pc(pc105)" };
   };

將上面的文件保存為 modified-components 並執行:

xkbcomp modified-components $DISPLAY

再次轉儲:

xkbcomp $DISPLAY original-dump

檢查鍵碼:

cat another-dump | grep SCLK
<SCLK> = 133;

到目前為止一切順利,但是當我執行時xev,Scroll Lock 鍵的鍵碼仍然是78

如果我執行:

xmodmap -e "keycode 78 = Super_L"

xev仍然顯示78,但至少我在 XFCE 中為 LWIN 和 RWIN 創建的快捷方式有效。

我想知道我在xkb上做錯了什麼。謝謝。

嘗試了以下新方法(成功)

在目錄下新建了一個名為sclkfile/usr/share/X11/xkb/symbols/文件,並添加了以下內容:

// Make the Scroll Lock key a left Super.
xkb_symbols "sclk_super" {
   replace key <SCLK> { [ Super_L ] };
   modifier_map  Mod4 { <SCLK> };
};

在中添加了新規則/usr/share/X11/xkb/rules/evdev

sclkoption:sclk_super = +sclkfile(sclk_super)

以及規則的描述/usr/share/X11/xkb/rules/evdev.lst

! option
sclkoption           Scroll Lock behaviour
sclkoption:sclk_super Scroll Lock is Super

這裡也是/usr/share/X11/xkb/rules/evdev.xml

<configItem>
       <name>sclkoption</name>
       <description>Scroll Lock behaviour</description>
</configItem>    
<option>
   <configItem>
       <name>sclkoption:sclk_super</name>
       <description>Scroll Lock is Super</description>
   </configItem>
</option>

最後執行:

$ setxkbmap -option sclkoption:sclk_super

沒有錯誤,當我列印佈局的組件時:

$ setxkbmap -print
xkb_keymap {
       xkb_keycodes  { include "evdev+aliases(qwerty)" };
       xkb_types     { include "complete"      };
       xkb_compat    { include "complete"      };
       xkb_symbols   { include "pc+us+inet(evdev)+sclkfile(sclk_super)"     };
       xkb_geometry  { include "pc(pc105)"     };
};

新規則就在那裡。

現在,如果我執行xev

keycode 78 (keysym 0xffeb, Super_R)

鍵碼仍然是 78,但鍵符是 Super_R。成功

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