如何正确地将键盘键映射到鼠标按钮?

Hub*_*bro 16 linux mouse keyboard xorg xbindkeys

问题摘要:我希望Super_LX11将我的鼠标按钮之一注册为 Windows 左按钮。


在我的窗口管理器中,我可以通过按住“Windows 左键”(Left Super)并用鼠标左键拖动窗口来移动窗口。我希望能够在不触摸键盘的情况下做到这一点,所以我想将左超级键映射到鼠标按钮 11,这样我就可以按住鼠标按钮 11 并单击+拖动窗口。

最明显的解决方案是像这样使用 xbindkeys 和 xte ( .xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

"xte 'keyup Super_L'"
  b:11 + release
Run Code Online (Sandbox Code Playgroud)

这像这样工作:

  • 当我按下鼠标按钮 11 时,Super_L也被按下
  • 当我释放鼠标按钮 11 时,Super_L也被释放

但是有一个问题:如果我还按住另一个鼠标按钮(例如鼠标按钮 11),我将无法使用Super_L+移动窗口Mouse1。使用上面的解决方案,鼠标按钮 11 仍然被注册为按下和释放,因此没有窗口管理器操作工作。

我一直在使用这两种桂皮和真棒WM,并尝试这个绝对没有的的Super_L同时鼠标左键10或11键盘组合工作被按下。

一个低于标准的黑客

我目前正在通过使鼠标 11 单击按住Super_L按钮一段时间来解决此问题。这样我就可以点击鼠标按钮,然后在短时间内拖动东西:

"xte 'keydown Super_L' 'usleep 250000' 'keyup Super_L'"
  b:11
Run Code Online (Sandbox Code Playgroud)

另一种尝试

按照 totti 的建议,我尝试了以下xbindkeys配置:

"xte 'mouseup 10' 'keydown Super_L'"
  b:10

"xte 'keyup Super_L'"
  b:10 + Release
Run Code Online (Sandbox Code Playgroud)

它不起作用。似乎Super_L按键被按住了,因为一旦我松开按钮 10,它就会永远被按住(直到我Super_L再次按下键盘上的键)但鼠标按钮仍在注册,因为我无法单击和拖动窗口. 我认为我无法使用xbindkeysand来完成这项工作xte

har*_*ymc 6

一个 askubuntu 帖子包含一个我将在下面总结的答案

问题是 xbindkeys 抓取了整个鼠标,使得修改器+鼠标点击映射不确定。答案通过python-uinput脚本使用 uinput来监视/dev/my-mouse拇指按钮单击并将Ctrl键发送到虚拟键盘。以下是详细步骤:

1.制定udev规则

对于鼠标,文件/etc/udev/rules.d/93-mxmouse.conf.rules

KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"
Run Code Online (Sandbox Code Playgroud)

Udev 将寻找名称类似于 event5 的内核设备。SYMLINK 用于查找鼠标/dev/my_mx_mouse,可由组读取mxgrabber

要查找硬件信息,请运行以下内容:

udevadm info -a -n /dev/input/eventX
Run Code Online (Sandbox Code Playgroud)

对于 uinput,文件/etc/udev/rules.d/94-mxkey.rules

KERNEL=="uinput", GROUP="mxgrabber", MODE="660"
Run Code Online (Sandbox Code Playgroud)

拔下并插入鼠标,或强制 udev 使用udevadm trigger.

2. 激活 UINPUT 模块

sudo modprobe uinput
Run Code Online (Sandbox Code Playgroud)

并在/etc/modules-load.d/uinput.conf

uinput
Run Code Online (Sandbox Code Playgroud)

3.新建组

sudo groupadd mxgrabber
sudo usermod -aG mxgrabber your_login
Run Code Online (Sandbox Code Playgroud)

4. Python 脚本

安装python-uinput librarypython-evdev library.

下面的脚本需要识别按钮的 event.code :

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False
Run Code Online (Sandbox Code Playgroud)

5. 整理

使 python 文件可执行并确保它在启动时加载。


tot*_*tti 1

由于您可以通过单击鼠标来运行脚本,因此您可以使用以下技巧。
1. 按按钮 11按住超级键。(按钮 11触发脚本)
2. 使用其他鼠标按钮移动窗口
3. 再次按下鼠标按钮 11释放 超级键

脚本
用于xdotool按住超级键
在第一个按钮单击时,创建一个临时文件并按住键。接下来单击删除 tmp 文件并释放密钥,

更新

根据ubuntu帮助页面(许多按钮鼠标如何)imwheel可以重新映射到一个键。