Passei muito tempo tentando fazer esse trabalho de encadernação. Eu finalmente encontrei uma solução, que é complicada, mas funciona bem e não implica software de terceiros. Eu compartilho aqui esperando que isso ajude as pessoas. Além disso, sei que isso não é perfeito em termos de segurança, portanto, qualquer feedback construtivo é mais do que bem-vindo.
Existem soluções que são realmente legais, como a proposta aqui , mas sempre sofrem com a limitação de xbindkeys que pegam o mouse inteiro, tornando os modificadores + mapeamento de cliques do mouse incertos. Além disso, a solução baseada em guile do link acima usa ctrl + plus / ctrl + minus que não é reconhecido pelo Gimp, por exemplo.
Eu descobri que o que queremos é um botão do mouse que funcione como um teclado, então usei o uinput, que pode ser acessado via python , escreveu um script que monitora / dev / my-mouse para o botão do polegar e envia a tecla ctrl para o teclado virtual. Aqui estão os passos detalhados:
1. Faça as regras do udev
Queremos que os dispositivos sejam acessíveis (direitos e localização).
Para o mouse:
/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"
O Udev irá procurar por um dispositivo reconhecido pelo kernel com nomes como event5, e eu seleciono meu mouse com o nome. A instrução SYMLINK assegura que eu localizarei meu mouse em / dev / my_mx_mouse. O dispositivo será legível por um membro do grupo "mxgrabber".
Para encontrar informações sobre seu hardware, você deve executar algo como
udevadm info -a -n /dev/input/eventX
Para entrada de dados:
/etc/udev/rules.d/94-mxkey.rules
----------------------------------------------------
KERNEL=="uinput", GROUP="mxgrabber", MODE="660"
Não há necessidade de symlink, o uinput sempre estará em $/dev/uinput
ou $/dev/input/uinput
, dependendo do sistema em que você está. Apenas dê a ele o grupo e os direitos de ler E escrever, é claro.
Você precisa desconectar - conecte o mouse e o novo link deve aparecer em / dev. Você pode forçar o udev a acionar suas regras com $udevadm trigger
2. Ativar o módulo UINPUT
sudo modprobe uinput
E para que o boot seja persistente:
/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput
3. Criar novo grupo
sudo groupadd mxgrabber
Ou o que você chamou de seu grupo de acesso. Então você deve se adicionar a ele:
sudo usermod -aG mxgrabber your_login
4. Script Python
Você precisa instalar a biblioteca python-uinput (obviamente) e a biblioteca python-evdev . Use pip ou seu pacote de distribuição.
O script é bastante simples, você só precisa identificar o código event.code de você.
#!/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. Aproveite!
Tudo o que você precisa agora é tornar seu arquivo python executável e pedir ao seu gerenciador de área de trabalho para carregar o arquivo na inicialização. Talvez também um copo de vinho para celebrar o bom trabalho!
6. Extra grátis
Eu uso xbindkeys para comportamento adicional. Por exemplo, a seguinte configuração pode ser interessante se você tiver um mouse com cliques no lado da roda:
~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
b:7
"xdotool key ctrl+shift+Tab"
b:6
# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
control+b:3
Para que esta última combinação funcione, você deve desativar o botão que você configurou para o script python , caso contrário, ele ainda será capturado por xbindkeys. Apenas a tecla Ctrl deve permanecer:
~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15
Recarregue com $ xmodmap ~/.Xmodmap
7. Conclusão
Como eu disse no começo, eu não estou perfeitamente feliz com o fato de que eu tenho que me dar os cuidados para escrever em / dev / uinput, mesmo que se pense no grupo "mxgrabber". Tenho certeza de que há uma maneira mais segura de fazer isso, mas não sei como.
No lado positivo, funciona muito bem. Qualquer combinação de teclas de teclado ou mouse como funciona com o botão Ctrl do teclado agora funciona com o mouse !! p>