检测到蓝牙输入设备后运行 shell 命令?

检测到蓝牙输入设备后运行 shell 命令?

xinput当我的鼠标连接到计算机时,我尝试使用命令自动降低 Magic Mouse 的灵敏度。

我设法在 下创建了一个文件rules.d,该文件调用了一个 shell 脚本。问题是,它适用于除命令之外的所有脚本,xinput因为规则在鼠标列在其他输入设备之间之前启动了脚本,因此xinput命令无法找到它。所以,我的问题是,是否有一种方法可以在鼠标被检测为输入设备后才运行我需要的命令,或者是否有其他解决方案可以解决我的问题。

从终端,在鼠标通过 BT 连接之前:

$ hcitool inq
Inquiring ...
00:1E:52:EE:0C:1B   clock offset: 0x33fb    class: 0x3a0104
84:38:35:31:CC:6B   clock offset: 0x1353    class: 0x002580
$ hcitool scan
Scanning ...
84:38:35:31:CC:6B   Mouse of Elios
00:1E:52:EE:0C:1B   Elios

鼠标通过 BT 连接后,我得到:

$ hcitool info 84:38:35:31:CC:6B
Requesting information ...
BD Address:  84:38:35:31:CC:6B
Device Name: Mouse of Elios
LMP Version: 2.0 (0x3) LMP Subversion: 0x31c
Manufacturer: Apple, Inc. (76)
Features: 0xbd 0x02 0x04 0x38 0x08 0x00 0x00 0x00
    <3-slot packets> <encryption> <slot offset> <timing accuracy> 
    <role switch> <sniff mode> <RSSI> <power control> 
    <enhanced iscan> <interlaced iscan> <interlaced pscan> 
    <AFH cap. slave>

这是我放置在 /etc/udev/rules.d 中的 udev 规则:

SUBSYSTEMS=="input", ATTRS{name}=="Mouse of Elios", RUN+="/home/elios/Documents/FixMouse.sh"

这是我的 shell 脚本/home/elios/Documents/FixMouse.sh(感谢 Cbhihe 的回答,经过编辑):

#!/bin/sh
while [ ! "$(/usr/bin/hcitool info 84:38:35:31:CC:6B 2>&1 > /dev/null; echo $?)" ]; do
 sleep 0.1
done
xinput --set-prop "Mouse of Elios" "Device Accel Constant Deceleration" 2.5

其他信息:

$ uname -a
Linux dalek 3.19.0-30-generic #34-Ubuntu SMP Fri Oct 2 22:08:41 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ xinput --list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Mouse of Elios                    id=13   [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)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Apple, Inc Apple Keyboard                 id=10   [slave  keyboard (3)]
    ↳ Apple, Inc Apple Keyboard                 id=11   [slave  keyboard (3)]
    ↳ FaceTime HD Camera (Built-in)             id=12   [slave  keyboard (3)]
$ xinput --list-props "Mouse of Elios"
Device 'Mouse of Elios':
Device Enabled (133):   1
Coordinate Transformation Matrix (135): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Accel Profile (527): 0
Device Accel Constant Deceleration (528):   2.500000
Device Accel Adaptive Deceleration (529):   1.000000
Device Accel Velocity Scaling (530):    10.000000
Device Product ID (253):    1452, 781
Device Node (254):  "/dev/input/event5"
Evdev Axis Inversion (531): 0, 0
Evdev Axes Swap (533):  0
Axis Labels (534):  "Rel X" (143), "Rel Y" (144), "Rel Horiz Wheel" (517), "Rel Vert Wheel" (518)
Button Labels (535):    "Button Left" (136), "Button Middle" (137), "Button Right" (138), "Button Wheel Up" (139), "Button Wheel Down" (140), "Button Horiz Wheel Left" (141), "Button Horiz Wheel Right" (142)
Evdev Scrolling Distance (536): 1, 1, 1
Evdev Middle Button Emulation (537):    0
Evdev Middle Button Timeout (538):  50
Evdev Third Button Emulation (539): 0
Evdev Third Button Emulation Timeout (540): 1000
Evdev Third Button Emulation Button (541):  3
Evdev Third Button Emulation Threshold (542):   20
Evdev Wheel Emulation (543):    0
Evdev Wheel Emulation Axes (544):   0, 0, 4, 5
Evdev Wheel Emulation Inertia (545):    10
Evdev Wheel Emulation Timeout (546):    200
Evdev Wheel Emulation Button (547): 4
Evdev Drag Lock Buttons (548):  0

答案1

在 udev 规则调用的脚本中,放置while, do, done下面的代码片段,你的xinput参数调整。

#!/bin/sh 
while [ ! "$(/usr/bin/hcitool info 84:38:35:31:CC:6B >& /dev/null; echo $?)" ]; do
     sleep 0.1
done
xinput --set-prop "Mouse of Elios" "Device Accel Constant Deceleration" 5.0
xinput --set-prop "Mouse of Elios" "Device Accel Adaptive Deceleration" 1.0
xinput --set-prop "Mouse of Elios" "Device Accel Velocity Scaling" 3.3

它允许脚本等待 0.1 秒的连续时间间隔,直到鼠标通过蓝牙适当地绑定并且xinput --set-prop命令启动之前。

请注意,您可以通过三种方式调整鼠标对手部运动的响应。

  • 设备加速度恒定减速度(528):2.500000
  • 设备加速度自适应减速(529):1.000000
  • 设备加速度速度缩放(530):10.000000

查看弄清楚这些参数值到底代表什么。为了令人满意地修改“速度缩放”,您需要知道鼠标的刷新率是多少(以 Hz 为单位)。您应该在鼠标的技术数据表上找到该值。速度缩放值的估计值为1000/refresh_rate_in_Hz。因此 3.3 假设刷新率为 300Hz,10 假设刷新率为 100Hz。

您的脚本似乎没有改变以下默认值:

  • Device Accel Constant Deceleration (528): 2.500000
  • Device Accel Adaptive Decelaration (529): 1.000000

正如您的 cmd 所显示的xinput --list-props...尝试修改 prop_id 528 的值 2.5,并意识到将 prop_id 529 设置为 1 (默认)意味着“无自适应加速或减速“。

你从 Gilles 改编的 udev 规则回答非盟/U&L并不完全适用于您的情况。您需要的是在“添加”设备时启动的规则,即,只要设备的存在首次触发内核事件即可。因此,您的 udev 规则应该简单地显示为:

ACTION=="add", SUBSYSTEMS=="input", ATTRS{idVendor}=="____", ATTRS{idProduct}=="____", RUN+="/usr/local/sbin/fixmouse"

其中,您应该将 ____ 替换为您的真实设备的idVendoridProduct。要查找该信息:

$ udevadm monitor

连接你的蓝牙鼠标。阅读“KERNEL”出现的行,你会发现相似的到:

  KERNEL[22576.118379] add   /devices/pci0000:00/0000:00:1d.7/hci2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0004/input/input23/mouse1 (input)

要结束监控,只需输入 CTRL+C,然后:

$ udevadm info -a -p '/devices/pci0000:00/0000:00:1d.7/hci2/2-3/2-3.4/2-3.4' | grep -e "idVendor" -e "idProduct" 

您应该获得 2 或 3 对 (idVendor, idProduct) 值,具体取决于您的硬件组装方式。我的用例得出:

ATTRS{idVendor}=="192f"
ATTRS{idProduct}=="0916"
ATTRS{idVendor}=="1a40"
ATTRS{idProduct}=="0101"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0002"

按照它们出现的顺序在 udev 规则中尝试它们。通常最上面的那个应该是好的。

要完成,请执行以下操作:

$ sudo mv /home/elios/Documents/FixMouse.sh /usr/local/sbin/fixmouse
$ sudo chown root:root /usr/local/sbin/fixmouse
$ sudo chmod 755 /usr/local/sbin/fixmouse

希望我理解正确。无论如何请告诉我们。

相关内容