Vincular o mouse a um monitor de concreto em uma configuração de tela dupla com dois ponteiros independentes

4

O cenário é vincular meu Wacom Bamboo ao meu segundo monitor e meu mouse ao primeiro monitor. A ligação para a Wacom Bamboo funciona perfeitamente com as configurações do tablet. Mas como posso ligar meu mouse ao outro monitor?

Meus passos atuais:

  1. Vincule o Wacom Bamboo ao meu segundo monitor

  2. Configuredoisponteirosindependentes

    1. ComWacomBambooemeumouseconectados,xinput--listmostra

      ~xinputlist⎡Virtualcorepointerid=2[masterpointer(3)]⎜↳VirtualcoreXTESTpointerid=4[slavepointer(2)]⎜↳LogitechG9xLaserMouseid=8[slavepointer(2)]⎜↳LogitechG9xLaserMouseid=9[slavepointer(2)]⎜↳RazerRazerBlackWidowUltimateid=13[slavepointer(2)]⎜↳RazerRazerBlackWidowUltimateid=14[slavepointer(2)]⎜↳WacomBambooPenstylusid=10[slavepointer(2)]⎜↳WacomBambooPeneraserid=11[slavepointer(2)]⎜↳WacomBambooPencursorid=15[slavepointer(2)]⎜↳WacomBambooPadpadid=16[slavepointer(2)]⎣Virtualcorekeyboardid=3[masterkeyboard(2)]↳VirtualcoreXTESTkeyboardid=5[slavekeyboard(3)]↳PowerButtonid=6[slavekeyboard(3)]↳PowerButtonid=7[slavekeyboard(3)]↳RazerRazerBlackWidowUltimateid=12[slavekeyboard(3)]
    2. Crieumnovodispositivocom

      xinputcreate-masterBamboo
      ~xinputlist⎡Virtualcorepointerid=2[masterpointer(3)]⎜↳VirtualcoreXTESTpointerid=4[slavepointer(2)]⎜↳LogitechG9xLaserMouseid=8[slavepointer(2)]⎜↳LogitechG9xLaserMouseid=9[slavepointer(2)]⎜↳RazerRazerBlackWidowUltimateid=13[slavepointer(2)]⎜↳RazerRazerBlackWidowUltimateid=14[slavepointer(2)]⎜↳WacomBambooPenstylusid=10[slavepointer(2)]⎜↳WacomBambooPeneraserid=11[slavepointer(2)]⎜↳WacomBambooPencursorid=15[slavepointer(2)]⎜↳WacomBambooPadpadid=16[slavepointer(2)]⎣Virtualcorekeyboardid=3[masterkeyboard(2)]↳VirtualcoreXTESTkeyboardid=5[slavekeyboard(3)]↳PowerButtonid=6[slavekeyboard(3)]↳PowerButtonid=7[slavekeyboard(3)]↳RazerRazerBlackWidowUltimateid=12[slavekeyboard(3)]⎡Bamboopointerid=17[masterpointer(18)]⎜↳BambooXTESTpointerid=19[slavepointer(17)]⎣Bambookeyboardid=18[masterkeyboard(17)]↳BambooXTESTkeyboardid=20[slavekeyboard(18)]
    3. AnexenovamenteosIDsWacomBamboo

      xinputreattach10"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)]
      
por A.B. 26.12.2015 / 14:47

1 resposta

0

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:

  1. Um script para bloquear o ponteiro em qualquer uma das duas telas.
  2. 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 ou right ) 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 de xdotool . 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.

por Jacob Vlijm 30.12.2015 / 14:56