我已经在 kUbuntu 18.04 上通过 xbindkeys 配置了我的 Logitech MX-Revolution 鼠标。我在滚轮上设置了额外的按钮(左/右滑动)来播放下一首/上一首歌曲。
我的问题是,我的 Logitech 鼠标上的按键映射相当于在触控板上左右滚动(手指滑动)。由于我的联想 Thinkpad 也有一个带物理鼠标按钮的轨迹点,因此这也相当于在左右移动轨迹点时按下鼠标中键。
我该如何告诉 xbindkeys,如果我使用 Logitech 鼠标上的按键事件,它应该只播放下一首/上一首歌曲?我该如何为不同的输入设备分别设置 xbindkeys?
这是我的.xbindkeysrc 文件:
######### MultimediaControl #########
# backward button => previous song
"xte 'key XF86AudioPrev'"
m:0x0 + b:6
# forward button => next song
"xte 'key XF86AudioNext'"
m:0x0 + b:7
#################################
提前致谢!
答案1
有一个解决方法使用出色的工具xinput
就您而言,您总共有 3 个鼠标设备,其中 2 个是内置的,一个是外置鼠标。
首先,我们需要获取这 3 个设备的 ID。
- 跑步
xinput list
示例输出:
pratap@i7-6550U:~$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ PixArt USB Optical Mouse id=10 [slave pointer (2)]
⎜ ↳ ETPS/2 Elantech Touchpad id=12 [slave pointer (2)]
⎜ ↳ Logitech USB Receiver Mouse id=16 [slave pointer (2)]
⎜ ↳ Logitech USB Receiver Consumer Control id=17 [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)]
↳ Video Bus id=8 [slave keyboard (3)]
↳ Power Button id=9 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
↳ Toshiba input device id=13 [slave keyboard (3)]
↳ Logitech USB Receiver id=14 [slave keyboard (3)]
↳ Logitech USB Receiver System Control id=15 [slave keyboard (3)]
↳ Logitech USB Receiver Consumer Control id=18 [slave keyboard (3)]
pratap@i7-6550U:~$
我有 3 个设备,都是鼠标输入
- PixArt USB 光电鼠标 id=10
- ETPS/2 Elantech 触摸板 id=12
- 罗技 USB 接收器鼠标 id=16
例如,当 Logitech USB 接收器鼠标的 id=16 鼠标滚轮向上和鼠标滚轮向下时,我想绑定两个命令,即按钮 b:4 和 b:5
如果我的~/.xbindkeysrc
内容如下所示,则所有 3 个设备将执行相同的功能。
######### MultimediaControl #########
# backward button => my Command
"gnome-control-center"
m:0x0 + b:4
# forward button => my Command
"gnome-tweaks"
m:0x0 + b:5
#####################################
- 运行
xmodmap -pp
并查看有多少个按钮可用。
从man xmodmap
-pp This option indicates that the current pointer map should be printed on the
standard output.
示例输出xmodmap -pp
pratap@i7-6550U:~$ xmodmap -pp
There are 20 pointer buttons defined.
Physical Button
Button Code
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
pratap@i7-6550U:~$
这意味着即使我们没有 20 个物理按钮,我们也可以配置特定按钮来执行这 20 个按钮中的其他按钮的操作。
- 现在修改
~/.xbindkeysrc
文件内容如下。
内容:
######### MultimediaControl #########
# backward button => my Command
"gnome-control-center"
m:0x0 + b:19
# forward button => my Command
"gnome-tweaks"
m:0x0 + b:20
#####################################
- 跑步
killall xbindkeys; xbindkeys
所以现在很清楚,如果我按下 b:19 和 b:20,我的命令就会运行。
现在的诀窍是将罗技鼠标的物理按钮映射到 id=16 b:4 和 b:5 到 b:19 和 b:20
从man xinput
--set-button-map device map_button_1 [map_button_2 [...]]
Change the button mapping of device. The buttons are specified in physical order
(starting with button 1) and are mapped to the logical button provided. 0 disables
a button. The default button mapping for a device is 1 2 3 4 5 6 etc.
- 跑步
xinput --set-button-map 16 1 2 3 19 20
例子:
pratap@i7-6550U:~$ xinput --set-button-map 16 1 2 3 19 20
pratap@i7-6550U:~$
完成后,现在您可以~/.xbindkeysrc
使用 Logitech 鼠标滚轮向上和向下运行两个命令,而其他两个设备则具有其原始功能,即上下滚动。
注销或重启后,此按钮映射将不再保留。
- 添加此命令
xinput --set-button-map 16 1 2 3 19 20
在系统启动时运行。
请注意,如果您将来更换罗技鼠标的 USB 插槽,id 可能会与 xinput 列表不同,这将不起作用。您需要获取 id 并在启动命令中更改它。
答案2
注销或重启后,此按钮映射将不再保留。
- 添加此命令 xinput --set-button-map 16 1 2 3 19 20 在系统启动时运行。请注意,如果您将来更改罗技鼠标的 USB 插槽,则 ID 可能与 xinput 列表不同,这将不起作用。您需要获取 ID 并在启动命令中更改它。
你可以通过告诉 xinput 设备名称而不是变量设备 id 来避免这个问题:而不是
xinput --set-button-map 16 1 2 3 19 20
使用xinput --set-button-map pointer:'Logitech USB Receiver Mouse' 1 2 3 19 20