场景是,将我的 Wacom Bamboo 绑定到我的第二台显示器,将我的鼠标绑定到第一台显示器。Wacom Bamboo 的绑定与平板电脑的设置完美配合。但我如何将我的鼠标绑定到另一台显示器?
我目前的步骤:
将 Wacom Bamboo 绑定到我的第二台显示器
配置两个独立指针
插入 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)]
答案1
关于答案
以下答案可能需要一些额外的编辑。为了创建两个单独的鼠标,我按照问题中提到的步骤进行操作。它做过可以,但我的“普通”鼠标后来出现了一些问题。在某些情况下,左键单击不起作用。
由于您在问题中没有提到副作用,我认为这与我连接的两个鼠标的硬件特定的冲突功能有关。
好消息是,xdotool
显然只“看到”了“主”鼠标的坐标,这使得可以将光标锁定在其中一个屏幕上。
两个脚本
以下两个脚本:
- 用于将指针锁定在两个屏幕中的任意一个的脚本。
- 用于自动执行步骤 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
使用屏幕(
left
或right
)作为参数来运行它,方法如下: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
。由于它以周期性循环运行,因此鼠标位置是更正如果它超出了屏幕的限制。结果是,尽管有效地它运行良好,但您仍然会注意到“硬”栅栏的外观差异。我花了一些时间尝试减少这种影响,每当鼠标接近屏幕的限制时,“智能地”增加循环速度,甚至让它依赖于方向鼠标移入。但最终我得出的结论是,获得的改进很小,应该优先考虑编码的简单性。