在双屏设置中将鼠标绑定到具有两个独立指针的具体显示器

在双屏设置中将鼠标绑定到具有两个独立指针的具体显示器

场景是,将我的 Wacom Bamboo 绑定到我的第二台显示器,将我的鼠标绑定到第一台显示器。Wacom Bamboo 的绑定与平板电脑的设置完美配合。但我如何将我的鼠标绑定到另一台显示器?


我目前的步骤:

  1. 将 Wacom Bamboo 绑定到我的第二台显示器

    在此处输入图片描述

  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)]
      

答案1

关于答案

以下答案可能需要一些额外的编辑。为了创建两个单独的鼠标,我按照问题中提到的步骤进行操作。它做过可以,但我的“普通”鼠标后来出现了一些问题。在某些情况下,左键单击不起作用。

由于您在问题中没有提到副作用,我认为这与我连接的两个鼠标的硬件特定的冲突功能有关。

好消息是,xdotool显然只“看到”了“主”鼠标的坐标,这使得可以将光标锁定在其中一个屏幕上。

两个脚本

以下两个脚本:

  1. 用于将指针锁定在两个屏幕中的任意一个的脚本。
  2. 用于自动执行步骤 2 的脚本,如您的问题中所述:配置两个独立指针



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

  • 使用屏幕(leftright)作为参数来运行它,方法如下:

    python3 /path/to/lock_cursor.py left
    

    或者

    python3 /path/to/lock_cursor.py right
    



2. 自动设置两个独立鼠标的脚本

这可能是一个棘手的问题,因为我没有 Wacom Bamboo,而且我无法在现场进行“最终测试”。不过,使用我的普通第二只鼠标,它工作得很好(尽管有不同的 ID 字符串)。

如果它在您的情况下也能正常工作,则可以将两个脚本合并以在一次调用中运行;仅当尚未执行双鼠标设置时,下面的脚本才会采取行动。

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

笔记

  • 我找不到其他方法将鼠标锁定在一个屏幕上,只能使用xdotool。因此,(第一个)脚本借助 锁定鼠标xdotool。由于它以周期性循环运行,因此鼠标位置是更正如果它超出了屏幕的限制。结果是,尽管有效地它运行良好,但您仍然会注意到“硬”栅栏的外观差异。

    我花了一些时间尝试减少这种影响,每当鼠标接近屏幕的限制时,“智能地”增加循环速度,甚至让它依赖于方向鼠标移入。但最终我得出的结论是,获得的改进很小,应该优先考虑编码的简单性。

相关内容