Свяжите мышь с конкретным монитором в двойной экранной установке с двумя независимыми указателями

Сценарий, свяжите мой Бамбук Wacom с моим вторым монитором и моей мышью к первому монитору. Привязка для Бамбуковых работ Wacom, прекрасных с настройками для планшета. Но как я могу связать свою мышь с другим монитором?


Мои текущие шаги:

  1. Свяжите Бамбук Wacom с моим вторым монитором

    enter image description here

  2. Настройте два независимых указателя

    1. С включенным Бамбуком Wacom и моей мышью, 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

      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
задан 27 December 2015 в 14:05

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

  • Выполните его с экраном (left или right) как аргумент, также:

    python3 /path/to/lock_cursor.py left
    

    или

    python3 /path/to/lock_cursor.py right
    



2. Сценарий для автоматизации установки двух независимых мышей

Это могло бы быть хитрым, так как я не владею Бамбуком Wacom, и я не мог сделать "завершающего испытания" в живой ситуации. С моей обычной второй мышью это хорошо работало однако (быть этим с различными строками идентификатора).

Если это также хорошо работает в Вашей ситуации, оба сценария могли бы быть объединены для выполнения в одном вызове; сценарий ниже только принимает меры, если двойное - установка мышей еще не была выполнена.

#!/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. Так как это работает в периодическом цикле, положение мыши исправлено, если это нарушает границу предел экрана. Последствие - то, что, хотя эффективно это хорошо работает, Вы все еще заметите косметическое различие с "твердым" забором.

    Я провел некоторое время, пытаясь уменьшить эффект, "энергично" увеличивая скорость цикла каждый раз, когда мышь около предела экрана или даже создания его зависящая от направления, мышь перемещается в. В конце однако я пришел к выводу, что полученное улучшение минимально, и простота кодирования должна быть предпочтена.

1
ответ дан 1 December 2019 в 17:35

Другие вопросы по тегам:

Похожие вопросы: