27

我有一个连接到我的计算机的 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)]

这通常不是问题,因为 id 通常是相同的。但有时鼠标的 id 会发生变化,这就是我的问题所在。

编写脚本/程序的最简单方法是什么,该脚本/程序找到属于Logitech G700 Laser Mouse输出中命名的两个列表的 id,xinput --list然后使用这两个 id 在顶部脚本中运行命令?

4

7 回答 7

17

如果设备名称始终相同,在这种情况下Logitech G700 Laser Mouse,您可以通过运行搜索匹配的设备 ID

xinput list --id-only 'Logitech G700 Laser Mouse'
于 2018-04-29T17:40:50.743 回答
16

您可以执行以下操作。

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

ids=$(xinput --list | awk -v search="$SEARCH" \
    '$0 ~ search {match($0, /id=[0-9]+/);\
                  if (RSTART) \
                    print substr($0, 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

因此,您首先找到与搜索模式匹配的所有 ID$SEARCH并将它们存储在$ids. 然后循环遍历 ID 并执行三个xinput命令。

您应该确保$SEARCH匹配不太多,因为这可能会导致不良行为。

于 2013-09-12T06:31:11.990 回答
7

我的 2 美分罗技游戏鼠标 G502

#!/bin/sh


for id in `xinput --list|grep 'Logitech Gaming Mouse G502'|perl -ne 'while (m/id=(\d+)/g){print "$1\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 
于 2016-10-01T09:06:47.240 回答
4

为了它的乐趣,相同的答案,但更简单的解析和获取 id 的方法:

for id in $(xinput list | grep 'Logitech USB Receiver' |  grep pointer | cut -d '=' -f 2 | cut -f 1); do xinput --set-button-map $id 3 2 1; done

我花了一段时间才弄清楚这可以获取ID:

xinput | cut -d '=' -f 2 | cut -f 1
于 2019-02-07T18:43:44.320 回答
3

我像 Raphael Ahrens 的答案那样做,但使用 grep 和 sed 而不是 awk 并且命令现在类似于 my_script part_of_device_name part_of_property_name_(spaces with \space) 值:

#!/bin/sh

DEVICE=$1
PROP=$2
VAL=$3

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]\+\).*/\1/p')

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

    for prop in $props
    do
        echo $prop
        xinput set-prop $dev $prop $VAL 
    done 
done
于 2016-11-23T17:55:21.317 回答
1

目前我正在为 askubuntu.com 上的一个问题编写一个脚本,这需要类似的东西,我想我会分享一个简单的 python 脚本,它几乎可以完成这个问题的要求 - 查找设备 ID 并设置属性:

剧本

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语句以显示正在配置哪些 id(以便稍后仔细检查xinput该值是否设置正确)

这个怎么运作:

本质上,list_ids函数列出所有设备 id,找到与用户鼠标名称同名的设备,并返回这些 id 的列表。接下来我们简单地遍历它们中的每一个,并为每一个设置props字典中定义的所有属性值对。也可以使用元组列表来完成,但我在这里选择字典。

于 2016-08-06T05:09:30.247 回答
0

更新:添加指针或键盘作为设备名称的前缀。

LINUX:~$ xinput --set-prop "罗技 MX Master 2S" 157 5 0 0 0 5 0 0 0 1

警告:有多个设备匹配“Logitech MX Master 2S”。为确保选择正确的设备,请使用设备 ID,或根据需要在设备名称前加上“指针:”或“键盘:”。

找不到设备指针

#解决方案

LINUX:~$ xinput --set-prop "pointer:Logitech MX Master 2S" 157 5 0 0 0 5 0 0 0 1

于 2021-07-20T15:36:30.703 回答