web-dev-qa-db-ja.com

xbindkeysでマウスボタンを別のマウスボタンにバインド-XEVバグ

サイドボタン(通常はページフォワード)をミドルクリックボタンにバインドするLogitech M720マウスを持っています。これは、WindowsでLogitechオプションを使用して実行したものです。

調査の結果、xbindkeysxautomationを使用する必要があることがわかりました。

キープレスをxevでテストしたところ、サイドボタンはbutton 9、中央のスクロールホイールボタンはbutton 2であることがわかりました。

次に、.xbindkeysrcファイルを次のように作成しました。

"xte 'mouseclick 2'"
  b:9

ただし、xbindkeysでrcファイルを再ポーリングした後、キーバインドがシステムのどこにも認識されず、xevテストを実行すると奇妙な結果が返されます。

ボタン9を押すと通常の結果

ButtonPress event, serial 37, synthetic NO, window 0x4a00001,
    root 0x1dd, subw 0x0, time 38400097, (160,106), root:(160,169),
    state 0x0, button 9, same_screen YES

ButtonRelease event, serial 37, synthetic NO, window 0x4a00001,
    root 0x1dd, subw 0x0, time 38400237, (160,106), root:(160,169),
    state 0x0, button 9, same_screen YES

XBINDKEYSRCファイル変更後の結果(ボタン9)

KeymapNotify event, serial 37, synthetic NO, window 0x0,
    keys:  4294967261 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

.xbindkeysrcファイルを消去した後でも、出力は同じであり、i killall xbindkeysの後で通常に戻り、ターミナルでxbindkeysと入力して再起動します。

私はこれ this thread を潜在的な解決策で見つけましたが、残念ながら私にはうまくいきませんでした。

ボタンプレスを他の何かにバインドすると、たとえば"xte 'key a'"は期待どおりに機能します。

私が間違っているかもしれない何かポインタを持っている人は誰ですか?

乾杯。

2
Woon Wu Chyi

xbindkeys

ショートカットごとに3行目が必要だと思います。多分それは必須ではありませんが、私は私が設定した例を見ています:

"pactl set-sink-volume @DEFAULT_SINK@ +5%"
    m:0x4 + c:112
    Control + Prior

"pactl set-sink-volume @DEFAULT_SINK@ -10%"
    m:0x4 + c:117
    Control + Next

# xautomation package
# Print Date
'"xte "keyup Super_L" "keyup Insert" "str `date +%Y.%m.%d`" "usleep 10" "keydown Super_L""'
    m:0x40 + c:118
    Mod4 + Insert

したがって、各エントリには3行目があり、ショートカットを定義しています。また、押されたキーを自分で解放する必要があり、通常はコマンドを実行する前に解放します。 Shiftを解放すると問題が発生することがわかったので、これはShiftでさらに複雑になります。


xmodmap(ユーザー固有)

通常、xbindkeysは複雑なバインディング、またはスクリプト/コマンドの実行に使用されます。 modmapを試してみると、達成しようとしていることの中心に近い可能性があります。 xev、またはevtestを使用して、マウスで使用されるキーコードを判別し、Xにそれを別のキーコードとして解釈するように指示できます。

~/.Xmodmap

keycode 97 = Control_R NoSymbol Control_R

~/.xinitrc

[[ -f ~/.Xmodmap ]] && xmodmap ~/.Xmodmap

これは、通常に、または修飾キー(Shift、Altなど)を使用してキーコード97(ランダム、非マウス)を処理する方法をXに指示します。マッピングは~/.Xmodmapにあり、$ modmap ~/.Xmodmapを介して、通常はXと一緒に~/.xinitrcにロードします。 evtestxevより「優れている」ので、テストしたいデバイスを見つけるのに役立ちますが、/devリストでシステムを探すのに役立ちます。


udev(システム全体)

別の解決策は、udev/evdevを使用し、システムがこの変換を実行するようにすることです。Xを起動するかどうかに関係なく、いつ起動するか、およびデバイスの接続ごとに実行されます。これは少し複雑ですが、いくつかの設定に慣れたら、ここでそれらを移行するように作業できます。

カスタムルールは/etc/udev/hwdb.d/にあります。これはハードウェアデータベースの[構成]ディレクトリです。これらは順番に読み込まれるため、ファイルには通常2桁のプレフィックスが付きますが、これは、後のルールが前のルールを上書きする場合にのみ問題になります。これは、USBバス、デバイス、ベンダーID別のデバイスのリストです。すべてのキーボードではなく、特定のキーボードのキーを再マップできるため、この方法は理想的です。

/etc/udev/hwdb.d/99-myMouse.hwdb

evdev:input:bIDvIDpID1*
  KEYBOARD_KEY_210=menu

evdev:input:bIDvIDpID2*
  KEYBOARD_KEY_210=menu

この例では、同じUSBバス上で、同じベンダーから、IDが異なる2つの入力デバイスを検出します。どちらもキーコード210をメニューボタンにマップします。このようにして、マウスのキーを再マップする方法を学ぶこともできます。

システムの別のディレクトリ/usr/lib/udev/hwdb.dhwdbファイルがあります。これらのファイルは編集しないでください。ただし、これらのファイルを例として使用して、作業を進めることができます。

変更後、データベースを更新する必要があります。

Sudo systemd-hwdb update
1
earthmeLon