web-dev-qa-db-ja.com

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

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

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


問題:

xbindkeysまたはxdotoolと組み合わせてxteを使用してキーストロークをマウスボタンにマップすることは非常に簡単ですが、モディファイアキーをマップすることははるかに難しいようです(例ALTCTRLSHIFTなど).

最終的には、i.a。 aCTRL+click(たとえば、リストの複数のエントリを選択するために)マウスだけで。

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

注:

以下のいくつかの例では、GuileScheme構文を使用し、.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+clickは不可能です。

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にマップされ、マウスボタンではないため、button 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

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


UPDATE:

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

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

13
conceptdeluxe

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

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

キーボードとして機能するマウスボタンが欲しいので、アクセスできるuinputを使用しました via python 、/ 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に表示されます。 $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をインストールする必要があります。 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スクリプト用に設定したボタンを無効にする必要があります。 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ボタンとどのように機能するかは、マウスのいずれかで機能するようになりました!!

8

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にカスタム関数を割り当てます。

3
Maxim

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

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

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

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

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

つまり、次のファイル:

/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
Stephen