コンピューターに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マウスのもう1つの問題は、xinputで2つの異なるデバイスとして表示されることです。これは、マウスにワイヤレスアダプターがあり、通常は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
からの出力でxinput --list
という名前の2つのリストに属するIDを見つけ、それらの2つのIDを使用して最上位のスクリプトでコマンドを実行するスクリプト/プログラムを作成する最も簡単な方法は何ですか?
次のようなことができます。
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
したがって、これを使用すると、最初に検索パターン$SEARCH
に一致するすべてのIDを見つけて、それらを$ids
に格納します。次に、IDをループして、3つのxinput
コマンドを実行します。
$SEARCH
があまり一致しないことを確認する必要があります。これは、望ましくない動作を引き起こす可能性があるためです。
デバイス名が常に同じである場合、この場合はLogitech G700 Laser Mouse
、実行することで一致するデバイスIDを検索できます
xinput list --id-only 'Logitech G700 Laser Mouse'
Logitech Gaming MouseG502の2セント
#!/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
私はRaphaelAhrensの回答のようにそれを行いましたが、awkの代わりにgrepとsedを使用し、コマンドはmy_script part_of_device_name part_of_property_name_(spaces with\space)valueのようになりました。
#!/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
それを楽しむために、同じ答えですが、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
現在、私は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'
すべてがOKの場合、スクリプトはサイレントに終了し、終了ステータスは0
、またはxinput
コマンドが失敗した場合は1
になります。 print
ステートメントのコメントを解除して、構成されているIDを表示できます(後でxinput
で値が正しく設定されていることを再確認します)
基本的に、list_ids
関数はすべてのデバイスIDを一覧表示し、ユーザーのマウス名と同じ名前のデバイスを検索して、それらのIDのリストを返します。次に、それらのそれぞれを単純にループし、それぞれについて、props
ディクショナリで定義されているすべてのプロパティと値のペアを設定します。タプルのリストでも実行できますが、ここでは辞書を選択します。