В сообщении аскубунту содержится ответ, который я кратко изложу ниже.
Проблема в том, что xbindkeys захватывает всю мышь, что делает неопределенными модификаторы + отображение щелчков мыши. В ответе используется uinput через скрипт python-uinput для отслеживания /dev/my-mouse
нажатия кнопки большого пальца и отправки Ctrlключа на виртуальную клавиатуру. Вот подробные шаги:
1. Сделать правила Udev
Для мыши файл /etc/udev/rules.d/93-mxmouse.conf.rules
:
KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", ATTRS=="Logitech Performance MX", SYMLINK+="my_mx_mouse", GROUP="mxgrabber", MODE="640"
Udev будет искать устройства ядра с такими именами, как event5. SYMLINK предназначен для поиска мыши /dev/my_mx_mouse
, читаемой группой mxgrabber
.
Чтобы найти информацию об оборудовании, запустите что-то вроде:
udevadm info -a -n /dev/input/eventX
Для uinput, файл /etc/udev/rules.d/94-mxkey.rules
:
KERNEL=="uinput", GROUP="mxgrabber", MODE="660"
Отключите и подключите мышь, или заставьте udev вызывать правила с помощью udevadm trigger
.
2. Активируйте модуль UINPUT
sudo modprobe uinput
И в /etc/modules-load.d/uinput.conf
:
uinput
3. Создать новую группу
sudo groupadd mxgrabber sudo usermod -aG mxgrabber your_login
4. Python скрипт
Установите python-uinput library
и python-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
5. Отделка
Сделайте файл Python исполняемым и убедитесь, что он загружается при запуске.