禁用滚轮水平按钮(后退/前进)

禁用滚轮水平按钮(后退/前进)

我最近买了一台罗技 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 Enabledset to 1 的属性,我使用顶部的 TL;DR 命令将其设置为 0,然后突发停止(我可以在末尾使用值 1 而不是 0 重新启用它)命令)。

希望它对其他人有帮助。

相关内容