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


14

質問の要約:マウスボタンの1つをSuper_LX11によって左のWindowsボタンとして登録したい。


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

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

"xte 'keydown Super_L'"
  b:11

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

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

  • マウスボタン11をSuper_L押し下げると、
  • マウスボタン11を離すと、ボタンSuper_Lも離されます

しかし、問題があります:マウスボタン11のような別のマウスボタンも押している場合、Super_L+ を使用してウィンドウを移動することはできませんMouse1。ウィンドウマネージャーの操作が機能します。

私はCinnamonとAwesome WMの両方を使用してこれを試しましたが、マウスボタン10または11を押している間、キーボードの組み合わせはまったく機能しませんSuper_L

サブパーハック

現在、この問題を回避するには、マウス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


1
マウスボタンをスーパーキーにバインドする代わりに、再マッピングを行います。これにはxmodmapを使用します。完全なセットアップについては、arch wiki xmodmapページを参照してください。
トッティ

@totti:アーチウィキxmodmapをページには、修飾キーを交換する方法を、他のキーにキーをマッピングする方法について説明し、どのようにスクロール逆にするが、それは、マウスのボタンにマッピングするキーボードのキーを言及していない
Hubro

@totti:xmodmapではキーを他のキーにマップでき、XのXKB拡張機能(およびxkbset)ではマウスボタンをキーボードキーにマップできますが、キーボードキーをマウスボタンにマップしようとしています。私はまだそれを行う方法を見つけていません。
ウブロ

try:マウスボタン11のホールドで、スーパーホールド+マウスボタン11のリリースをシミュレートします。ウィンドウマネージャーは、マウス11ではなくスーパー&マウス1を検出するようになりました
。-トッティ

@totti:質問の
試行

回答:


5

askubuntuの投稿には以下に要約する回答が含まれています。

問題は、xbindkeysがマウス全体を取得し、modifers + mouseクリックマッピングが不確実になることです。答えは、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は/dev/my_mx_mouse、グループで読み取り可能なマウスを見つけるためのものmxgrabberです。

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

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

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

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

マウスを取り外して接続するか、を使用してudevにルールを強制的にトリガーさせますudevadm trigger

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 librarypython-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ファイルを実行可能にし、起動時にロードされるようにします。


未使用のキーコードをマウスボタンに割り当てるようにスクリプトを更新しました(F13F14およびに設定しF15、を使用してマウス機能を無効にしxinputます。その後、単純なキーを使用して必要なものにこれらのキーを再割り当てしますxmodmap。中要旨(そこにいくつかのハードコード化された値があると私は復元しませんxinputその後マウス機能)を、私は、スクリプトの最終版でこれについてのブログ記事を作る(そしてそれが行われますとき、ここで上のリンクを共有します。ありがとうあなたの助けのためのあなた☺♥!
zmo

x11ベースのソリューションaskubuntu.com/a/903389/269589
マキシム

1

マウスクリックでスクリプトを実行できるので、次のトリックを使用できます。
1. ボタン11を押して、スーパーキーを押し続けます。(ボタン11 trigersスクリプト)
他のマウスボタンを使用して2.移動ウィンドウ
3. マウスボタン11をするには、再度リリースする スーパーキーを

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

更新

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


それに関するいくつかの問題:#1これはまだ別のハック/回避策であり、質問には答えていません。#2スーパーキーを押している間、xbindkeysは機能しません。それはまるでxbindkeysが一時停止しているかのようで、スーパーキーが解放されるまで何も登録しません。
ウブロ

OK、約5分間の調査の後、ポイント2を撤回します。+ Mod4xbindkeysの設定を追加して、スーパーキーが押されていることを説明する必要があります。あなたが提案する回避策は私のものよりも優れており、私はそれに切り替えています:-)しかし、それはまだ質問に答えていません。
ウブロ

1

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

xevまだ出力していない場合は、出力をチェックアウトすることもできます。両方のログを分析すると、発生している正確な問題が明らかになるはずです。

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


1

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

"xte 'keydown Super_L'"
  b:11

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.