xbindkeysを使用して修飾子(たとえばCTRL)をマウスの親指ボタンにマップする方法


13

この質問はすでに質問されていますが、適切に回答されたことはありません。@Sethとのクリアランスの後、私は再びそれを求めています。これにより、質問に簡単に応答して変更できるようになります。元の質問はここにあります:

CtrlとAltをマウスの親指ボタンにマッピング


問題:

使用して、マウスのボタンに任意のキーストロークをマッピングすることは非常にシンプルですがxbindkeysと一緒にxdotoolまたはxte修飾キー(例えばマッピングするために、より多くの問題のようだALTCTRLSHIFTそれになど)。

最終soloutionは、IA許可する必要がありますCTRL +をクリックするだけで、マウスで(リストの複数のエントリを選択するためなどに)。

これを解決するためのいくつかの可能なアプローチは、Stack Exchangeおよび他のLinux関連フォーラムでご覧いただけます。しかし、それらは他の問題や副作用につながるため、期待どおりに機能しません。

ノート:

以下の例の中には、Scheme構文を持つGuileを含み、ファイルに依存するものもありますが、他の例では、それぞれの構文を持つファイルに依存します。私は彼らが一緒に働かないことを知っています。.xbindkeysrc.scm.xbindkeysrc

さらに、以下のスニペットxdotoolのみに依存していますが、たとえば他のアプリケーションを含むアプローチも受け入れxteています-どちらも同じ結果につながるようであるため、xdotoolここではアクションのみを使用しています。

アプローチA:

以下を使用して.xbindkeysrcファイルを更新します。

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + b:8

それは私が最初に試したものですが、修飾子が保持されており、解放できないという副作用があります。

アプローチB:

以下を使用して.xbindkeysrc.scmファイルを更新します。

(xbindkey '("b:8") "xdotool keydown ctrl")
(xbindkey '(release "b:8") "xdotool keyup ctrl")

(xbindkey '("m:0x14" "b:8") "xdotool keydown ctrl")
(xbindkey '(release "m:0x14" "b:8") "xdotool keyup ctrl")

http://www.linuxforums.org/forum/hardware-peripherals/169773-solved-map-mouse-button-modifier-key.htmlで見つかり、修飾子が保持されている問題に対処しようとします(アプローチで説明されているように) a)。

サムボタンが押されている間は他のマウスクリックを実行できないため、部分的にしか機能しないことが修正されています。

アプローチC:

以下を使用して.xbindkeysrcファイルを更新します。

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + control + b:8

ここaskubuntuでリンクされた質問のOPによって試されました。モディファイヤステートを含まないため、はるかにシンプルで堅牢です。それでも、問題は残ります。つまり、CTRL + クリックは不可能です。

xbindkeysここでは、クリックを認識しますが実行しないため、それ自体が問題であるようです。これはxev | grep buttonおよびを使用してテストできますxbindkeys -v

によって記録される通常のマウスクリックxevは次のようになります。

state 0x10, button 1, same_screen YES
state 0x110, button 1, same_screen YES

サムボタンの場合:

state 0x10, button 8, same_screen YES
state 0x10, button 8, same_screen YES

ただし、上記のxbindkeys構成を有効にすると、何も記録されません。サムボタンはCTRLにマップされ、マウスボタンではないため、サムボタンには意味がありますが、ボタン1も記録されないのは奇妙です。これはおそらくxbindkeys実行されないが、それ自体が認識しているためです。

Button press !
e.xbutton.button=8
e.xbutton.state=16
"xdotool keydown ctrl"
    m:0x0 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call
Button press !
e.xbutton.button=1
e.xbutton.state=20
Button release !
e.xbutton.button=1
e.xbutton.state=276
Button release !
e.xbutton.button=8
e.xbutton.state=20
"xdotool keyup ctrl"
    Release + m:0x4 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call

アプローチD:

以下を使用して.xbindkeysrcファイルを更新します。

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + control + b:8

"xdotool click 1"
  b:1

単純すぎます...しかし、クリックの無限ループにつながります。


更新:

その間、Logitech G502を購入し、Windows上のドライバーを介して設定すると、プロファイル自体がデバイスメモリに保存されるだけでなく、実際のキー入力がマウスで行われることに気付きました。それが実際にLinuxでの私の問題を解決しました!

私が覚えていた唯一の他のマウスは、当時はRazer Copperheadでした。しかし、私は同じことをすることができる他のマウスが今日利用可能であると思います。


1
Easystrokeを使用したソリューション:askubuntu.com/a/1010647/27202
atti

回答:


8

私はそのバインディングを機能させるために多くの時間を費やしました。私は最終的に解決策を見つけました。それは複雑ですが、うまく機能し、サードパーティのソフトウェアを暗示していません。私はそれが人々を助けることを望んでここでそれを共有します。加えて、これはセキュリティの観点から完璧ではないことを知っているので、建設的なフィードバックは大歓迎です。

ここ提案されているような本当に素晴らしい解決策がありますが、それは常にマウス全体をつかむxbindkeysの制限に悩まされ、modifers + mouseクリックマッピングが不確実になります。さらに、上記のリンクのguileベースのソリューションでは、たとえばGimpで認識されないctrl + plus / ctrl + minusを使用します。

キーボードとして機能するマウスボタンが欲しいので、pythonからアクセスできる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"

シンボリックリンクは必要ありません。uinputは常に、$/dev/uinputまたは$/dev/input/uinput使用しているシステムに依存します。もちろん、彼にグループと、もちろん読み書きの権利を与えてください。

プラグを抜く必要があります-マウスを接続すると、新しいリンクが/ devに表示されます。次のコマンドで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ライブラリもちろん)とpython-evdevライブラリをインストールする必要があります。pipまたは配布パッケージを使用します。

スクリプトは非常に簡単で、ボタンの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ファイルを実行可能にし、起動時にデスクトップマネージャーにファイルをロードするよう依頼することだけです。たぶん良い仕事を祝うためにワインのグラス!

6.無料で追加

追加の動作にはxbindkeysを使用します。たとえば、ホイールサイドクリックのあるマウスを使用している場合、次の構成が適切です。

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

この最後の組み合わせを機能させるには、pythonスクリプト用に設定したボタンを無効する必要があります。無効にしないと、xbindkeysによって引き続き取得されます。Ctrlキーのみが残っている必要があります。

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

でリロード $ xmodmap ~/.Xmodmap

7.結論

冒頭で述べたように、「mxgrabber」グループと考えられていたとしても、/ dev / uinputに書き込む権利を自分自身に与えなければならないという事実には完全に満足していません。もっと安全な方法があると確信していますが、方法はわかりません。

明るい面で、それは本当に、本当にうまくいきます。キーボードまたはマウスキーの組み合わせは、キーボードのCtrlボタンとどのように機能するかが、マウスの1つと機能するようになりました。


努力とそれを私たちと共有してくれてありがとう!+1 ...まだテストしていませんが。ところで、私はこれをほとんどあきらめました-それが期待どおりに機能する場合は素晴らしいでしょう:)
conceptdeluxe

どういたしまして !私にとっては、完璧に機能します。問題がある場合はお知らせください。私は答えを完成させようとしますが、それを機能させるためにほぼ2日間を費やしたので、何かを忘れているかもしれません。私の投稿を手伝って/編集して喜んでいるでしょう。
オーレリアンシブラリオ

ctrl + click1は、新しいタブでリンクを開くため、タブを閉じるには非常に悪い選択であることに気付きました。私は、Pythonスクリプトの最後の部分を削除し、xbindkeysで微調整、クリーナー液私の答えを編集しました
オーレリアンCibrario

私はまだそれをテストする時間がありませんでしたが、期待どおりに動作する場合は確かに受け入れられた答えにします-待って申し訳ありません-私は少し忙しい
ATM

上記のスクリプトを使用して、障害のあるマウススイッチをデバウンスできるかどうか疑問に思います。使い古したマウスがあります。自動ホットキースクリプトを使用してWindowsで修正しますが、Linuxで修正するツールはありません。ここで左ボタン修正のためのAutohhotkeyスクリプトですautohotkey.com/board/topic/63555-debounce-mouse-keys evdevの-私はのpython3を使用してLinuxに誰かポート、それを願っています
KENN

4

PyUserInputで解決策を見つけました。これは非常に簡単になり、管理者権限は不要です。python 2とPyUserInputがインストールされている状態で、次のスクリプトを使用しました。

#!/usr/bin/python
from pymouse import PyMouseEvent
from pykeyboard import PyKeyboard

k = PyKeyboard()
class MouseToButton(PyMouseEvent):
    def click(self, x, y, button, press):
        if button == 8:
            if press:    # press
                k.press_key(k.control_l_key)
            else:        # release
                k.release_key(k.control_l_key)

C = MouseToButton()
C.run()

スクリプトに実行権限を付与した後~/.xsessionrc、たとえば、

〜/ path / to / script.py&

。これは、マウスボタンイベントの発生を妨げません。私の場合xinput set-button-map、xinputボタンのマッピングを変更し、使用していないものに興味のあるボタンの番号を割り当てていました。

たとえば、マウスでボタン8を使用したいが、ボタン8に既に機能がある場合(たとえば、page-next)、次を使用できます。.xsessionrc

logitech_mouse_id=$(xinput | grep "Logitech M705" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
xinput set-button-map $logitech_mouse_id 1 2 3 4 5 6 7 12 9 10 11 12 13 14 15 16 17 18 19 20
./.xbuttonmodifier.py &

提供されたボタン12はOSに意味を持たず、カスタム関数をのボタン12に割り当てます.xbuttonmodifier.py。上記のスクリプト。


ただし、元のイベントが発生するのを防ぐことはできません。したがって、ボタン8をシフトにマップし、Firefoxでボタン8を押したままにすると、前のページに戻ろうとしますが、これは望ましくありません。
user23013

1
本当です。これに取り組むために、使用したボタンのIDをで使用したボタンに変更しましたxinput。編集された質問を参照してください。
マキシム

2

部分的な解決策があります。既存のボタンのマッピングを解除する方法がわからないので、ボタンをクリックして、必要な修飾子を追加することになります。そのため、そのマウスボタンに既存の目的がある場合でも、起動します。たとえば、マウスの右ボタンをコントロールキーに再マップすると、control + clickが送信されます。

とにかく、私はあなたの質問に似たフォーラム投稿を見つけました。答えはbtnxをインストールし、それを通してあなたの修飾子を設定することでした。btnxはレポからはもう利用できないようです。PPAはありますが、最新のUbuntuでは機能しません。

フォーラムの投稿:投稿:http : //ubuntuforums.org/showthread.php?t=1245930

しかし、ソースは利用可能です:

ソースからコンパイルすることもできますが、これにより、パッケージマネージャーが管理できないファイルがシステムに配置されます。

つまり、次のファイル:

/usr/local/sbin/btnx
/etc/init.d/btnx
/usr/share/pixmaps/btnx.png
/usr/share/btnx-config (directory, multiple files)
/usr/share/applications/btnx-config.desktop
/usr/share/omf/btnx-config/btnx-manual-C.omf
/usr/share/locale/de/LC_MESSAGES/btnx-config.mo
/usr/share/locale/fr/LC_MESSAGES/btnx-config.mo
/usr/share/locale/nl/LC_MESSAGES/btnx-config.mo
/usr/share/locale/ru/LC_MESSAGES/btnx-config.mo

以下のシンボリックリンク:

/etc/rc0.d/K49btnx -> ../init.d/btnx
/etc/rc1.d/K49btnx -> ../init.d/btnx
/etc/rc6.d/K49btnx -> ../init.d/btnx
/etc/rc2.d/S49btnx -> ../init.d/btnx
/etc/rc3.d/S49btnx -> ../init.d/btnx
/etc/rc4.d/S49btnx -> ../init.d/btnx
/etc/rc5.d/S49btnx -> ../init.d/btnx

だから...あなたがソースから構築することを気にしないなら...

btnxの依存関係を取得します。

sudo apt-get install libdaemon-dev git

ソースから何もビルドしたことがない場合は、ビルド必須も必要になる場合があります。

sudo apt-get install build-essential

次に、btnxを取得してコンパイルします。

git clone https://github.com/cdobrich/btnx
cd btnx
./configure
make
sudo make install
cd -

別のGUI設定ツールがあります。依存関係を取得します。

sudo apt-get install libgtk2.0-dev libglade2-dev

gui configツールを取得してコンパイルします。

git clone https://github.com/cdobrich/btnx-config
./configure
make
sudo make install

次に、ツールを実行します。

sudo btnx-config

マウスボタンの検出をクリックしますツールの使用中に指示を読み、ポップアップするウィンドウのサイズを変更したい場合、ダイアログテキストは後で検出されず、検出中にサイズを変更しようとするとキャンセルされます検出。ウィンドウを少し大きくするだけです。

[押す]をクリックしてマウスの検出を開始し、テキストが変わるまでマウスを動かさないようにします...約5〜10秒かかります。テキストが変更されます。表示される場合は、表示されている内容を無視して、[進む]をクリックします。

[ボタン検出を開始する]ボタンをクリックします

ここでは、マウスの1つのボタンを数回クリックします(ステータスバーがいっぱいになるまで)。次に、ボタンの名前を後で認識できる名前に設定します(例:LeftButton)[追加]ボタンをクリックします。

マウスボタンごとにこれを繰り返します(スクロールホイール、スクロールクリックなどを忘れないでください)。おそらく、再マッピングしたくないボタンはスキップできます。

すべてのボタンを追加したら、[OK]をクリックします。

メインGUIで[ボタン]をクリックし、左側のペインで再マップするボタンを選択します。前の手順で入力した名前が使用されます。目的に合わせて、右側のキーの組み合わせでキー修飾子のみを選択することをお勧めします。

この画面で[削除]をクリックしないでください。ボタンが削除されます。その場合は、戻ってボタンを再度検出する必要があります。

Conrigurations画面に戻って、btnxの再起動をクリックします。

新しいボタンを試してください。

アプリケーションをアンインストールする場合は、btnxプログラムを停止してから、それぞれのgitチェックアウトされたディレクトリに移動し、アンインストールします。

sudo /etc/init.d/btnx stop
cd btnx
sudo make uninstall
cd -
cd btnx-config
sudo make uninstall
cd -

2
pastebinに投稿した詳細な回答に感謝します。しかし、信頼できないPPAを使用したり、デバイスで詳細に確認せずに未知のソースからアプリケーションを構築したりすることは許可されていません。それにもかかわらず、私はあなたがそれに費やした努力に対して投票をします。それとは別に、ここで答えを更新して、そこに書いたものをコピーすることをお勧めします。この情報は他の人には役立つかもしれませんが、見落とされるかもしれません 最後に、パッケージがUbuntuまたはDebianでコンパイルされない場合があることを読みました。実際に試してみましたか?
conceptdeluxe

Btw:askubuntuアカウントをLinuxやUnixなどの他のStack Exchangeアカウントとリンクすることで、簡単に100の評判を得ることができます。
conceptdeluxe

ええ、Ubuntu 14.04でテストしました。マウスの右ボタンでコントロールキーを送信し、投稿前に機能することを確認しました。そして、評判の要件のために投稿をほぼ放棄しました。
スティーブン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.