web-dev-qa-db-ja.com

2つの独立したポインターを備えたデュアルスクリーンセットアップで、マウスをコンクリートモニターにバインドします

シナリオは、Wacom Bambooを2番目のモニターにバインドし、マウスを1番目のモニターにバインドします。 Wacom Bambooのバインディングは、タブレットの設定に最適です。しかし、マウスを他のモニターにバインドするにはどうすればよいですか?


私の現在の手順:

  1. Wacom Bambooを2番目のモニターにバインドする

    enter image description here

  2. 2つの独立したポインターを構成する

    1. 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)]
      
    2. で新しいデバイスを作成します

      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)]
      
    3. 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)]
      
3
A.B.

答えについて

以下の回答では、追加の編集が必要になる場合があります。 2つの別々のマウスを作成するには、質問に記載されている手順に従いました。それはdid動作しますが、その後、私の「通常の」マウスにはいくつかの問題がありました。一部の状況で左クリックが機能しませんでした。

質問に副作用については触れていないので、接続した両方のマウスのハードウェア固有の競合する機能に関係していると思います。

幸いなことに、xdotoolは「メイン」マウスの座標を「見る」だけであるため、いずれかの画面でカーソルをロックできます。

2つのスクリプト

以下の2つのスクリプト:

  1. 2つの画面のいずれかでポインターをロックするスクリプト。
  2. 質問で説明されているステップ2を自動化するスクリプト:Configure two independent pointers



1.デュアルモニター設定で、カーソルを1つの画面にロックするスクリプト

#!/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
    



2. 2つの独立したマウスのセットアップを自動化するスクリプト

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を使用してマウスをロックします。定期的なループで実行されるため、マウスの位置は、画面の制限を超えた場合、修正済みです。その結果、効果的に正常に機能しますが、「ハード」フェンスとの見た目の違いに気付くでしょう。

    マウスが画面の限界に近づくたびにループ速度を「スマートに」上げるか、または方向に依存するようにすることで、効果を減らすために時間を費やしました。しかし最終的には、得られた改善は最小限であり、コーディングの単純さを優先すべきだという結論に達しました。

1
Jacob Vlijm