我最近买了一台罗技 M500:
总线 002 设备 004:ID 046d:c069 Logitech, Inc. M500 激光鼠标
它有九个我可以识别的按钮:
- 左边有两个
- 左右
- 轮压机
- 滚轮向上滚动,滚轮向下滚动
- 轮子压左,轮子压右
最后两个快把我逼疯了。每次我尝试单击滚轮时,我都会不小心点击“滚轮向左按”按钮,然后 Firefox 就会转到上次访问的页面。这很烦人。
很容易,对吧?只需找出 xev 显示的按钮并禁用它们即可。错误的! xev 不会生成“ButtonPress/ButtonRelease”事件,而是生成奇怪的“LeaveNotify/EnterNotify/KeymapNotify”对:
LeaveNotify 事件,序列号 40,合成 NO,窗口 0x4a00001, 根0x94,子w 0x0,时间2344319,(104,86),根:(113,207), 模式NotifyGrab,详细信息NotifyAncestor,same_screen YES, 焦点 YES,状态 0 EnterNotify 事件,序列号 40,合成 NO,窗口 0x4a00001, 根0x94,子w 0x0,时间2344319,(104,86),根:(113,207), 模式NotifyUngrab,详细信息NotifyAncestor,same_screen YES, 焦点 YES,状态 0 KeymapNotify 事件,序列号 40,合成 NO,窗口 0x0, 键:4294967188 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
现在,4294967188(如果有帮助的话,32 位整数的二进制补码 -108)肯定会是键码,对吗?又错了!水平轮左/右和侧后/前按钮的编号相同。
这是我的设备 xinput 列表:
罗技 USB 激光鼠标 id=15 [从属指针 (2)] 报7个班: 类源自:15。类型:XIButtonClass 支持的按钮:16 按钮标签:“按钮向左”“按钮中间”“按钮向右”“按钮滚轮向上”“按钮滚轮向下”“按钮水平滚轮向左”“按钮水平滚轮向右”“按钮侧面”“按钮额外”“按钮向前”“返回按钮” “任务按钮” “未知按钮” “未知按钮” “未知按钮” “未知按钮” 按钮状态: 类源自:15。类型:XIValuatorClass 评估器 0 的详细信息: 标签:Rel X 范围:-1.000000 - -1.000000 分辨率:1单位/米 模式:相对 类源自:15。类型:XIValuatorClass 评估器 1 的详细信息: 标签:Rel Y 范围:-1.000000 - -1.000000 分辨率:1单位/米 模式:相对 类源自:15。类型:XIValuatorClass 评估器 2 的详细信息: 标签: 相对水平轮 范围:-1.000000 - -1.000000 分辨率:1单位/米 模式:相对 类源自:15。类型:XIValuatorClass 评估器 3 的详细信息: 标签: 相对垂直轮 范围:-1.000000 - -1.000000 分辨率:1单位/米 模式:相对 类源自:15。类型:XIScrollClass 滚动评估器 2 的信息 类型:2(卧式) 增量:1.000000 标志:0x0 类源自:15。类型:XIScrollClass 滚动评估器 3 的信息 类型:1(垂直) 增量:-1.000000 标志:0x2(首选)
按钮的映射似乎与平常一样。那么,当我编写一个小脚本,在循环中调用“xinput query-state $DEVNO”并按下可怕的按钮时,会发生什么?你猜到了:
2 类: 按钮类 按钮[1]=向上 按钮[2]=向上 按钮[3]=向上 按钮[4]=向上 按钮[5]=向上 按钮[6]=向上 按钮[7]=向上 按钮[8]=向上 按钮[9]=向上 按钮[10]=向上 按钮[11]=向上 按钮[12]=向上 按钮[13]=向上 按钮[14]=向上 按钮[15]=向上 按钮[16]=向上 ValuatorClass 模式=相对接近度=In 评估者[0]=538 评估器[1]=456 评估器[2]=-2 评估器[3]=-464
尽管它们明显“向下”,但它们总是显示为“向上”。确实生成正确 ButtonPress 事件(例如左/右)的鼠标按钮确实会像应有的那样“向下”显示广告。
答案1
我有一台 Logitech M325,它也使用按钮 8 和 9 来左右倾斜滚轮。我使用这个脚本来禁用它们:
#!/bin/bash
set -eu
MOUSE_ID=$(xinput --list | grep Logitech | sed -r 's/.*id=([0-9]+).*/\1/')
if [ -n "$MOUSE_ID" ]; then
xinput set-button-map $MOUSE_ID 1 2 3 4 5 6 7 0 0
fi
答案2
长话短说:问题xinput set-prop <deviceId> "libinput Horizontal Scroll Enabled" 0
我可以<deviceId>
从xinput -list
输出中获取值。
我有一个蓝牙罗技 M555b 鼠标;它摔倒了很多次(我的错),最后一次摔倒时,它开始发出间歇性爆发的“鼠标右键滚轮滚动”。我在编码时注意到,代码不断向右滚动。在其他用途(即互联网浏览、游戏等)中,该问题根本不可见。
我开始使用该xev
命令,但它在这些爆发期间没有意识到任何事件。
相反,通过命令xinput --test <deviceId>
,我motion a[2]=<bigNum>
在这些爆发中看到了几个。
然后,通过该命令,xinput --list-props <deviceId>
我看到一个名为 Horizontal Scroll Enabled
set to 1 的属性,我使用顶部的 TL;DR 命令将其设置为 0,然后突发停止(我可以在末尾使用值 1 而不是 0 重新启用它)命令)。
希望它对其他人有帮助。