web-dev-qa-db-ja.com

キーボードのキーをマウスのボタンに正しくマッピングするにはどうすればよいですか?

質問の概要:マウスボタンの1つを左のWindowsボタンとして登録したい Super_L X11。


私のウィンドウマネージャーでは、「左のWindowsボタン」(Left Super)を押しながらマウスの左ボタンでウィンドウをドラッグすることで、ウィンドウを移動できます。キーボードに触れることなくそれを実行できるようにしたいので、左のスーパーキーをマウスボタン11にマッピングします。これにより、マウスボタン11を押しながらウィンドウをクリックしてドラッグできます。

最も明白な解決策は、xbindkeysとxteをこのように使用することです(.xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

"xte 'keyup Super_L'"
  b:11 + release

これは次のように機能します。

  • マウスボタン11を押すと、 Super_L も押し下げられます
  • マウスボタン11を離すと Super_L もリリースされています

しかし、問題があります。次を使用してウィンドウを移動できません。 Super_LMouse1 マウスボタン11のような別のマウスボタンも押している場合。上記の解決策を使用すると、マウスボタン11が押されて離されたまま登録されるため、ウィンドウマネージャーの操作は機能しません。

私はシナモンと素晴らしいWMの両方を使用してこれを試しました、そして絶対になし Super_L キーボードの組み合わせは、マウスボタン10または11を押している間機能します。

普通のハック

私は現在、マウス11を押したままにしてこの問題を回避しています Super_L ボタンを一定時間押します。こうすることで、マウスボタンをクリックして、その後しばらくの間ドラッグすることができます。

"xte 'keydown Super_L' 'usleep 250000' 'keyup Super_L'"
  b:11

別の試み

Tottiが提案したように、私はこのxbindkeys構成を試しました:

"xte 'mouseup 10' 'keydown Super_L'"
  b:10

"xte 'keyup Super_L'"
  b:10 + Release

動作しません。のようです Super_L キーを押したままにします。ボタン10を離すと、いつまでも押したままになるためです。 Super_L キーボードのキーをもう一度押します)が、ウィンドウをクリックしてドラッグできないため、マウスボタンはまだ登録されています。 xbindkeysxteを使用してこれを機能させることはできないと思います。

14
Hubro

Askubuntuの投稿には 回答 が含まれています。

問題は、xbindkeysがマウス全体をつかむため、変更者とマウスのクリックマッピングが不明確になることです。答えは python-uinput スクリプトを介してuinputを使用し、サムボタンのクリックを/dev/my-mouseで監視して送信します Ctrl 仮想キーボードのキー。詳細な手順は次のとおりです。

1。 udevルールを作成する

マウスの場合、ファイル/etc/udev/rules.d/93-mxmouse.conf.rules

KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"

Udevは、event5のような名前のカーネルデバイスを探します。 SYMLINKは、グループmxgrabberが読み取り可能な/dev/my_mx_mouseでマウスを見つけるためのものです。

ハードウェア情報を見つけるには、次のように実行します。

udevadm info -a -n /dev/input/eventX

Uinputの場合、ファイル/etc/udev/rules.d/94-mxkey.rules

KERNEL=="uinput", GROUP="mxgrabber", MODE="660"

マウスを取り外して接続するか、udevadm triggerでudevにルールをトリガーさせます。

2。 UINPUTモジュールをアクティブにする

Sudo modprobe uinput

そして/etc/modules-load.d/uinput.confでは:

uinput

3。新しいグループを作成します

Sudo groupadd mxgrabber
Sudo usermod -aG mxgrabber your_login

4。 Pythonスクリプト

python-uinput libraryおよびpython-evdev libraryをインストールします。

以下のスクリプトでは、ボタンのevent.codeを識別する必要があります。

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        Elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False

5。仕上げ

pythonファイルを実行可能にし、起動時に確実にロードされるようにします。

5
harrymc

マウスクリックでスクリプトを実行できるため、次のトリックを使用できます。
1。 ボタン11を押してholdスーパーキー。 (ボタン11スクリプトをトリガーする)
2。他のマウスボタンを使用してウィンドウを移動する
3。もう一度マウスボタン11を押してreleaseスーパーキー

スクリプト
xdotoolを使用してスーパーキーを保持します
最初のボタンをクリックして、一時ファイルを作成し、キーを押したままにします。次にtmpファイルを削除してキーを離し、

更新

Ubuntuヘルプページ(多くのボタンマウスの操作方法)によると、imwheelはキーに再マッピングできます。

1
totti

デバッグの提案:/dev/input/eventXファイルを監視して、特にBTN_LEFTと組み合わせて、そのボタンを押して離したときにどのイベントが生成されるかを確認します。 ここ は、始めるためのサンプルコードです。キーを押すだけでなく、すべてのイベントをログに記録するように変更する必要があることは明らかです。

まだ行っていない場合は、xevの出力を確認することもできます。両方のログを分析すると、発生している正確な問題が明らかになります。

複数のボタンが押されたときに、マウスが追加のボタンリリースイベントを生成している可能性があります。その場合、オプションは、キーバインディングの回避策を使用するか、xf86-input-evdevライブラリを変更して不要なイベントをフィルタリングする(または欠落しているイベントをシミュレートする)ことです。ドラッグアンドドロップしようとしたときに「クリック」イベントを生成するタッチスクリーンについて、しばらく前に同様のことを行いました。アイデアは、「クリック」イベントとほぼ同時に(短い時間枠内で)発生する「リリース」イベントをフィルタリングすることでした。私の推測が正しい場合、基本的に同様の何かを実装する必要があります。

1

今日の初めに、他の修飾キーでこれを理解しました。問題は、リリースのボタンの組み合わせに修飾子を含める必要があることです。 SuperキーがMod4にマッピングされていると仮定します(デフォルトのafaikである必要があります)。

"xte 'keydown Super_L'"
  b:11

"xte 'keyup Super_L'"
  Mod4 + b:11 + release

編集:b:11を押している間はLMBを使用できないので、これはあなたの質問に完全には答えられないことに気づきました

1
DreadPirateLynx