シナリオは、Wacom Bambooを2番目のモニターにバインドし、マウスを1番目のモニターにバインドします。 Wacom Bambooのバインディングは、タブレットの設定に最適です。しかし、マウスを他のモニターにバインドするにはどうすればよいですか?
私の現在の手順:
Wacom Bambooを2番目のモニターにバインドする
2つの独立したポインターを構成する
Wacom Bambooとマウスを接続すると、xinput --list
が表示されます
~ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech G9x Laser Mouse id=8 [slave pointer (2)]
⎜ ↳ Logitech G9x Laser Mouse id=9 [slave pointer (2)]
⎜ ↳ Razer Razer BlackWidow Ultimate id=13 [slave pointer (2)]
⎜ ↳ Razer Razer BlackWidow Ultimate id=14 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen stylus id=10 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen eraser id=11 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen cursor id=15 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pad pad id=16 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Power Button id=7 [slave keyboard (3)]
↳ Razer Razer BlackWidow Ultimate id=12 [slave keyboard (3)]
で新しいデバイスを作成します
xinput create-master Bamboo
~ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech G9x Laser Mouse id=8 [slave pointer (2)]
⎜ ↳ Logitech G9x Laser Mouse id=9 [slave pointer (2)]
⎜ ↳ Razer Razer BlackWidow Ultimate id=13 [slave pointer (2)]
⎜ ↳ Razer Razer BlackWidow Ultimate id=14 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen stylus id=10 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen eraser id=11 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pen cursor id=15 [slave pointer (2)]
⎜ ↳ Wacom Bamboo Pad pad id=16 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Power Button id=7 [slave keyboard (3)]
↳ Razer Razer BlackWidow Ultimate id=12 [slave keyboard (3)]
⎡ Bamboo pointer id=17 [master pointer (18)]
⎜ ↳ Bamboo XTEST pointer id=19 [slave pointer (17)]
⎣ Bamboo keyboard id=18 [master keyboard (17)]
↳ Bamboo XTEST keyboard id=20 [slave keyboard (18)]
Wacom Bamboo IDを再接続します
xinput reattach 10 "Bamboo pointer"
xinput reattach 11 "Bamboo pointer"
xinput reattach 15 "Bamboo pointer"
xinput reattach 16 "Bamboo pointer"
~ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech G9x Laser Mouse id=8 [slave pointer (2)]
⎜ ↳ Logitech G9x Laser Mouse id=9 [slave pointer (2)]
⎜ ↳ Razer Razer BlackWidow Ultimate id=13 [slave pointer (2)]
⎜ ↳ Razer Razer BlackWidow Ultimate id=14 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Power Button id=7 [slave keyboard (3)]
↳ Razer Razer BlackWidow Ultimate id=12 [slave keyboard (3)]
⎡ Bamboo pointer id=17 [master pointer (18)]
⎜ ↳ Wacom Bamboo Pen stylus id=10 [slave pointer (17)]
⎜ ↳ Wacom Bamboo Pen eraser id=11 [slave pointer (17)]
⎜ ↳ Wacom Bamboo Pen cursor id=15 [slave pointer (17)]
⎜ ↳ Wacom Bamboo Pad pad id=16 [slave pointer (17)]
⎜ ↳ Bamboo XTEST pointer id=19 [slave pointer (17)]
⎣ Bamboo keyboard id=18 [master keyboard (17)]
↳ Bamboo XTEST keyboard id=20 [slave keyboard (18)]
以下の回答では、追加の編集が必要になる場合があります。 2つの別々のマウスを作成するには、質問に記載されている手順に従いました。それはdid動作しますが、その後、私の「通常の」マウスにはいくつかの問題がありました。一部の状況で左クリックが機能しませんでした。
質問に副作用については触れていないので、接続した両方のマウスのハードウェア固有の競合する機能に関係していると思います。
幸いなことに、xdotool
は「メイン」マウスの座標を「見る」だけであるため、いずれかの画面でカーソルをロックできます。
以下の2つのスクリプト:
#!/usr/bin/env python3
import subprocess
import time
import sys
# --- set the loop time below
t = 0.2
# ---
# screen argument should be either left or right
screen = sys.argv[1]
def get(command):
return subprocess.check_output(command).decode("utf-8")
def condition(x_pos):
if screen == "right":
return x_pos < limit
else:
return x_pos > limit
def get_pos():
return [int(s.split(":")[-1]) for s in get(
["xdotool", "getmouselocation"]
).split()if any(["x" in s, "y" in s])]
limit = sorted([int(s.split("+")[1]) for s in get(
"xrandr"
).split() if s.count("+") == 2])[-1]
limit = limit-3 if screen == "left" else limit+3
while True:
pos = get_pos(); x_pos = pos[0]
if condition(x_pos) == True:
x = limit; y = pos[1]
subprocess.Popen(["xdotool", "mousemove", str(x), str(y)])
else:
pass
time.sleep(t)
スクリプトはxdotool
を使用します。
Sudo apt-get install xdotool
スクリプトを空のファイルにコピーし、lock_cursor.py
として保存します
次のいずれかの方法で、画面(left
またはright
)を引数として実行します。
python3 /path/to/lock_cursor.py left
または
python3 /path/to/lock_cursor.py right
Wacom Bambooを所有していないので、これは難しいかもしれません。実際の状況では「最終テスト」を行うことができませんでした。私の普通の2番目のマウスでは、それはうまく機能しました(異なるID文字列でも)。
あなたの状況でもうまく機能する場合、両方のスクリプトをマージして1回の呼び出しで実行できます。以下のスクリプトは、ダブルマウスのセットアップがまだ実行されていない場合にのみアクションを実行します。
#!/usr/bin/env python3
import subprocess
import os
import sys
new_master = "Bamboo"
id_string = "Wacom Bamboo"
def get(command):
return subprocess.check_output(command).decode("utf-8")
def execute(command):
subprocess.call(["/bin/bash", "-c", command])
def find_ids(xinp_data, id_string):
return [l.split("=")[1].split()[0]
for l in xinp_data.splitlines() if id_string in l]
xinput_data = get(["xinput", "list"])
if not "Bamboo pointer" in xinput_data:
ids = find_ids(xinput_data,id_string)
if not ids:
print("Wacom Bamboo seems not to be connected")
else:
pass
execute("xinput create-master "+new_master)
for n in ids:
execute("xinput reattach "+n+' "Bamboo pointer"')
スクリプトを空のファイルにコピーし、setup_bamboo.py
として保存し、次のコマンドで実行します。
python3 /path/to/setup_bamboo.py
マウスを1つの画面にロックする別の方法は見つかりませんでしたが、xdotool
を使用しました。したがって、(最初の)スクリプトはxdotool
を使用してマウスをロックします。定期的なループで実行されるため、マウスの位置は、画面の制限を超えた場合、修正済みです。その結果、効果的に正常に機能しますが、「ハード」フェンスとの見た目の違いに気付くでしょう。
マウスが画面の限界に近づくたびにループ速度を「スマートに」上げるか、または方向に依存するようにすることで、効果を減らすために時間を費やしました。しかし最終的には、得られた改善は最小限であり、コーディングの単純さを優先すべきだという結論に達しました。