如何通过键盘映射鼠标按钮,Linux

如何通过键盘映射鼠标按钮,Linux

我使用 Debian 9(又名“Stretch”)x86_64。

$ uname -a:  
Linux mypc 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 GNU/Linux  

尝试从我的设备 Logitech MU-007 映射我的额外按钮:

$ lsusb | grep Logitech  
Bus 001 Device 023: ID 046d:c069 Logitech, Inc. M-U0007 [Corded Mouse M500]  

x输入设备:

$ xinput | grep Logitech  
⎜   ↳ Logitech USB Laser Mouse                  id=10   [slave  pointer  (2)]  

测试xinput test 10鼠标左侧两个按钮的额外按钮,返回 8 和 9。

$ xinput -version  
xinput version 1.6.2  

尝试了一个简单的:

xinput set-button-map 10 8 2 3  

或者

$ xmodmap -e "pointer = 9 2 3"
Warning: Only changing the first 3 of 12 buttons.
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  116 (X_SetPointerMapping)
  Value in failed request:  0x9
  Serial number of failed request:  9
  Current serial number in output stream: 

左侧按钮根本不起作用,无法像左键单击那样进行选择。

我也想保留左键单击和额外按钮作为左键单击。
知道为什么该xinput命令没有选择任何内容吗?

编辑

最后:

id=$(xinput list | grep -oP 'Logitech USB Laser Mouse.*id=\K\d+')
xinput set-button-map $id 1 2 3 4 5 6 7 1 1 10 11 12

答案1

您假设此命令会将第一个鼠标按钮的功能映射到物理按钮 #8:

xinput set-button-map 10 8 2 3

这个假设是不正确的。事实上,该命令的工作方式完全相反:您实际上将物理按钮 #1 设置为将事件作为“按钮 8”的另一个实例发送,这实际上使“第一个鼠标按钮”操作不可用。

如果你想让物理按钮 #8 充当额外的“第一个鼠标按钮”,你必须这样做:

xinput set-button-map 10 1 2 3 4 5 6 7 1 9 10 11 12

默认映射为1 2 3 4 5 6 7 8 9 10 11 12,因此如果您希望物理按钮 #8 的作用与第一个鼠标按钮相同,请将8映射中的数字替换为另一个1

如果您想完全禁用某个特定按钮,请0在与该物理按钮对应的插槽中使用。

请注意,按钮 4 和 5 通常对应于鼠标滚轮向上/向下操作。

答案2

我找到了更好的解决方案。我可以这样保留数字键盘这是其他解决方案不可能实现的。

我有一个键盘按键可以在之间切换鼠标键模式,这样,我使用 F1 作为左键单击,F2 作为中键单击,F3 作为右键单击。然后我可以使用特殊键切换回键盘。

特殊键触发此脚本(检查您的 WM 键盘快捷键首选项)。

#!/bin/bash

if [[ ! -s ~/.button-state ]]; then
    echo 0 > ~/.button-state
fi

state=$(<~/.button-state)

if ((state==0)); then
    xkbset m
    yad --notification xxx &
    echo 1 > ~/.button-state
elif ((state==1)); then
    xkbset -m
    pkill -f 'yad --notification xxx
    echo 0 > ~/.button-state
else
    echo >&2 "weird error"
    exit 1
fi

启用鼠标手势后,系统托盘中会显示此图标:

在此输入图像描述

相关内容