web-dev-qa-db-ja.com

MSSculptコンフォートマウスのWindowsキーを再マップします

MS Sculpt Comfort Mouseの「Windowsボタン」をLinuxマシン(Linux Mint 18.2「Sonya」)の別のボタン(「戻る」ボタンなど)に再マップしたいと思います。

による xinput list、マウスはポインティングデバイスとして認識されます(id = 12)。

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Microsoft Sculpt Comfort Mouse            id=12   [slave  pointer  (2)]
⎜   ↳ FocalTechPS/2 FocalTech FocalTech Touchpad    id=15   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ Chicony USB Keyboard                      id=9    [slave  keyboard (3)]
    ↳ Chicony USB Keyboard                      id=10   [slave  keyboard (3)]
    ↳ USB2.0 UVC HD Webcam                      id=11   [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                          id=13   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=14   [slave  keyboard (3)]

による xinput test 12Super_Lキー(キーコード133)は、「Windowsボタン」がマウスで押されたときにマウスによって生成されます。

key press   133 
key release 133 

次に、この特定のデバイスのキーを別のキーに再マップする必要があります。私はsetxkbmapツールを使用してそれを行います( Linuxで特定のキーボードのみのキーを再マップする方法 で説明されています)。

私のスクリプトは次のとおりです。

remote_id=$(
    xinput list | sed -n 's/.*Microsoft Sculpt Comfort Mouse.*id=\([0-9]*\).*/\1/p'
)
[ "$remote_id" ] || exit

# remap Windows button on MS Sculpt Mouse to Back button

mkdir -p /tmp/xkb/symbols
cat >/tmp/xkb/symbols/custom <<\EOF
xkb_symbols "remote" {
    key <LWIN> { [ XF86Back ]        };
};
EOF

setxkbmap -device $remote_id -print | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

セカンダリ/ USBキーボードキー を再マップ/変更するで説明されている同様のアプローチも試しました。コードを交換しようとしました。ために <LWIN>および<VOL+>。しかし、成功しなかった場合でも、マウスのWindowsキーはWindowsキーとして解釈されます。

次に、2番目のアプローチ(純粋なxkbcomp)を使用してUSBキーボード(id = 9)のWindowsキー(と交換)を再マッピングしようとしましたが、それは機能しましたが、マウスのボタンの動作も同じように変更されました(ボタンがマウスにどのようにマッピングされたかに関係なく)。奇妙なことに、ラップトップの内蔵キーボード(再マップされていない)のWindowsボタンを押してからマウスを押すと、Windowsボタンとして解釈されます。 USBキーボード(VOL +に再マップ)のWindowsボタンを押してからマウスを押すと、VOL +として解釈されます。 バグ91571に関連している可能性があります-xkbcompを介して設定されたxkbは-iに適用されないようです(または一般的なデバイスで使用されている場合は固定されません)

残念ながら、特定のデバイスに対してのみボタンを再マップすることはできません。

1)xkbcompツールは「スレーブキーボード」デバイスでのみ正しく機能する可能性がありますか? (「スレーブポインタ」ではありません)

2)このマウスを「スレーブキーボード」として扱う方法はありますか?

3)または、この特定のデバイスのみ(メインUSBキーボードではない)の「Windowsボタン」を再マップする別の方法はありますか?

1
Pavel Kriz

私自身の質問#3に答える:udevはそれを成し遂げることができます。ぼくの /etc/udev/hwdb.d/10-ms-sculpt-back.hwdbファイル:

# remap MS Sculpt Comfort Mouse (Bluetooth) Windows key to Back key
evdev:input:b0005v045Ep07A2*
 KEYBOARD_KEY_700e3=back

おかげで スキャンコードをキーコードにマップ および 一般的な入力デバイスの.hwdbヘッダーを見つける方法は?

4
Pavel Kriz