Sobre a resposta
A resposta abaixo pode precisar de alguma edição adicional. Para criar dois mouses separados, segui as etapas mencionadas na sua pergunta. O funcionou , mas o meu rato "normal" teve alguns problemas depois. O clique esquerdo não funcionou em algumas situações.
Como você não mencionou o efeito colateral em sua pergunta, presumo que tenha a ver com a funcionalidade conflitante específica de hardware de ambos os mouses que conectei.
A boa notícia é que xdotool
aparentemente apenas "vê" as coordenadas do mouse "principal", o que torna possível bloquear o cursor em uma das telas.
Dois scripts
Abaixo dois scripts:
- Um script para bloquear o ponteiro em qualquer uma das duas telas.
- Um script para automatizar a etapa 2, conforme descrito em sua pergunta: Configurar dois ponteiros independentes
1. Script para bloquear o cursor em uma tela, em uma configuração de monitor duplo
#!/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)
para usar
-
O script usa
xdotool
:sudo apt-get install xdotool
-
Copie o script em um arquivo vazio, salve-o como
lock_cursor.py
-
Execute-o com a tela (
left
ouright
) como argumento, por:python3 /path/to/lock_cursor.py left
ou
python3 /path/to/lock_cursor.py right
2. Script para automatizar a configuração de dois mouses independentes
Isso pode ser complicado, já que eu não possuo um Wacom Bamboo, e não pude fazer um "teste final" em uma situação ao vivo. Com o meu segundo mouse comum, funcionou bem (seja com diferentes cadeias de caracteres).
Se também funcionar bem na sua situação, o script pode ser mesclado para ser executado em uma chamada; o script abaixo só toma medidas se a configuração de mouses duplos ainda não foi realizada.
#!/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"')
Para usar
Simplesmente copie o script em um arquivo vazio, salve-o como setup_bamboo.py
, execute-o pelo comando:
python3 /path/to/setup_bamboo.py
Notas
-
Não consegui encontrar outra maneira de bloquear o mouse em uma tela, mas usar
xdotool
. O script (primeiro), portanto, trava o mouse com a ajuda dexdotool
. Como ele é executado em um loop periódico, a posição do mouse é corrigida se ultrapassar o limite da tela. A consequência é que, embora efetivamente funcione bem, você ainda notará uma diferença estética com uma cerca "difícil".Eu gastei algum tempo tentando reduzir o efeito, "inteligentemente" aumentando a velocidade do loop sempre que o mouse está perto do limite da tela, ou até mesmo tornando-o dependente da direção em que o mouse se move. No final, no entanto, cheguei à conclusão de que a melhoria obtida é mínima, e a simplicidade de codificação deve ser preferida.