Как сделать программу, которая находит идентификаторы устройств xinput и устанавливает некоторые настройки xinput

у меня есть мышь G700, подключенная к моему компьютеру. Проблема с этой мышью в Linux (в Ubuntu) заключается в том, что чувствительность очень высока. Мне также не нравится ускорение мыши, поэтому я сделал сценарий, который отключает это. Скрипт выглядит так

#!/bin/bash
# This script removes mouse acceleration, and lowers pointer speed
# Suitable for gaming mice, I use the Logitech G700.
# More info: http://www.x.org/wiki/Development/Documentation/PointerAcceleration/
xinput set-prop 11 'Device Accel Profile' -1
xinput set-prop 11 'Device Accel Constant Deceleration' 2.5
xinput set-prop 11 'Device Accel Velocity Scaling' 1.0
xinput set-prop 12 'Device Accel Profile' -1
xinput set-prop 12 'Device Accel Constant Deceleration' 2.5
xinput set-prop 12 'Device Accel Velocity Scaling' 1.0

другая проблема с мышью G700 заключается в том, что она отображается как два разных устройства в xinput. Скорее всего, это связано с тем, что мышь имеет беспроводной адаптер и обычно также подключается через usb-кабель (для зарядки). Этот является ли мой вывод из xinput --list (см. id 11 и 12):

$ xinput --list
⎡ Virtual core pointer                              id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                    id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                         id=8    [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                         id=9    [slave  pointer  (2)]
⎜   ↳ Logitech Unifying Device. Wireless PID:4003   id=10   [slave  pointer  (2)]
⎜   ↳ Logitech G700 Laser Mouse                     id=11   [slave  pointer  (2)]
⎜   ↳ Logitech G700 Laser Mouse                     id=12   [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)]

обычно это не проблема, так как идентификаторы обычно одинаковы. Но иногда идентификатор мыши меняется, и тогда возникает мой вопрос.

каков самый простой способ написания сценария / программы, которая находит идентификатор, принадлежащий двум спискам с именем Logitech G700 Laser Mouse на выходе xinput --list, а затем запуск команд в верхнем скрипте с использованием этих двух идентификаторов?

5 ответов


вы можете сделать что-то вроде следующего.

if [ "$SEARCH" = "" ]; then 
    exit 1
fi

ids=$(xinput --list | awk -v search="$SEARCH" \
    ' ~ search {match(, /id=[0-9]+/);\
                  if (RSTART) \
                    print substr(, RSTART+3, RLENGTH-3)\
                 }'\
     )

for i in $ids
do
    xinput set-prop $i 'Device Accel Profile' -1
    xinput set-prop $i 'Device Accel Constant Deceleration' 2.5
    xinput set-prop $i 'Device Accel Velocity Scaling' 1.0
done

Итак, с этим вы сначала найдете все идентификаторы, которые соответствуют шаблону поиска $SEARCH и хранить их в $ids. Затем вы зацикливаетесь на идентификаторах и выполняете three xinput команды.

вы должны убедиться, что $SEARCH не много, поскольку это может привести к нежелательному поведению.


мои 2 цента для игровой мыши Logitech G502

#!/bin/sh


for id in `xinput --list|grep 'Logitech Gaming Mouse G502'|perl -ne 'while (m/id=(\d+)/g){print "\n";}'`; do
    # echo "setting device ID $id"
    notify-send -t 50000  'Mouse fixed'
    xinput set-prop $id "Device Accel Velocity Scaling" 1
    xinput set-prop $id "Device Accel Constant Deceleration" 3
done 

Я сделал это как ответ Рафаэля Аренса, но использовал grep и sed вместо awk, и команда теперь что-то вроде my_script part_of_device_name part_of_property_name(пробелы с \space) значение:

#!/bin/sh

DEVICE=
PROP=
VAL=

DEFAULT="Default"

if [ "$DEVICE" = "" ]; then 
    exit 1
fi

if [ "$PROP" = "" ]; then 
    exit 1
fi

if [ "$VAL" = "" ]; then 
    exit 1
fi

devlist=$(xinput --list | grep "$DEVICE" | sed -n 's/.*id=\([0-9]\+\).*//p')

for dev in $devlist
do
    props=$(xinput list-props $dev | grep "$PROP" | grep -v $DEFAULT | sed -n 's/.*(\([0-9]\+\)).*//p')

    for prop in $props
    do
        echo $prop
        xinput set-prop $dev $prop $VAL 
    done 
done

Если имя устройства всегда одно и то же, в этом случае Logitech G700 Laser Mouse, вы можете искать соответствующие идентификаторы устройств, запустив

xinput list --id-only 'Logitech G700 Laser Mouse'

в настоящее время я работаю над сценарием для вопроса по адресу askubuntu.com , что требует чего-то подобного, и я подумал, что поделюсь простым скриптом python, который делает почти то, что спрашивает этот вопрос - найти идентификаторы устройств и установить свойства:

Скрипт

from __future__ import print_function
import subprocess
import sys

def run_cmd(cmdlist):
    """ Reusable function for running shell commands"""
    try:
        stdout = subprocess.check_output(cmdlist)
    except subprocess.CalledProcessError as pserror:
        sys.exit(1)
    else:
        if stdout:
            return stdout.decode().strip()

def list_ids(mouse_name):
    """ Returns list of ids for the same device"""
    while True:
        mouse_ids = []
        for dev_id in run_cmd(['xinput','list','--id-only']).split('\n'):
            if mouse_name in run_cmd(['xinput','list','--name-only',dev_id]):
                mouse_ids.append(dev_id)
        if mouse_ids:
           break
    return mouse_ids

"""dictionary of propery-value pairs"""
props = { 'Device Accel Profile':'-1',
          'Device Accel Constant Deceleration':'2.5',
          'Device Accel Velocity Scaling':'1.0'   }

""" set all property-value pair per each device id
    Uncomment the print function if you wish to know
    which ids have been altered for double-checking
    with xinput list-props"""
for dev_id in list_ids(sys.argv[1]):
    # print(dev_id)
    for prop,value in props.items():
        run_cmd(['xinput','set-prop',dev_id,prop,value]) 

использование

укажите цитируемое имя мыши в качестве первого аргумента командной строки:

python set_xinput_props.py 'Logitech G700 Laser Mouse'

если все в порядке, скрипт выходит тихо, со статусом выхода 0 или 1 Если xinput не удалось выполнить команду. Вы можете раскомментировать print оператор, чтобы показать, какие идентификаторы настраиваются (чтобы позже дважды проверить с xinput что значения установлены в порядке)

как работает:

по сути, list_ids функция перечисляет все идентификаторы устройств, находит те устройства, которые имеют то же имя, что и имя мыши пользователя, и возвращает список этих идентификаторов. Затем мы просто перебираем каждый из них, и из каждого мы устанавливаем все пары свойство-значение которые определены в props словарь. Можно было бы сделать со списком кортежей, но словарь-мой выбор здесь.