Para o seguinte funcionar, você precisa dos programas xte e xbindkeys. Para o Debian, e a maioria dos derivados como o Ubuntu, estes vêm em pacotes xautomation e xbindkeys, respectivamente. Se você usar alguma outra distribuição, você terá que apenas procurar em seu gerenciador de pacotes para encontrar os pacotes corretos.
A ideia por trás disso é que, em vez de realmente acelerar o movimento da roda do mouse, geramos vários eventos de botão cada vez que a roda é rolada. A maneira como isso é feito não salva o seu cpu, como um programa externo será executado toda vez que gerarmos vários eventos de botão, por exemplo. toda vez que a roda de rolagem é rolada. Isso pode ser de alguma consideração, mas um hack é um hack.
Primeiro você precisa obter o id do dispositivo de entrada, ou seja. o mouse, você está usando. Você obterá isso da saída de xinput list
.
Em seguida, você precisa obter o mapa de botões do dispositivo. Você vai conseguir isso de
saída de xinput get-button-map <device>
.
Para descobrir quais botões mapeiam para a roda de rolagem, execute xinput test <device>
e role para cima / para baixo algumas vezes. Isso produzirá eventos do dispositivo especificado para o terminal e permitirá ver quais botões mapeiam para a roda de rolagem.
Por exemplo, usaremos um mouse USB antigo da Microsoft, com dois botões normais e uma roda de rolagem. Rolando a roda para cima mapeia para o botão 4 e rolando os mapas para o botão 5. Felizmente o mapa de botão para este dispositivo tem dois botões não usados, 6 e 7, então vamos usá-los.
Primeiro, remapeamos os botões 4 e 5 para os botões não usados.
xinput set-button-map <devid> 1 2 3 6 7 4 5
Isso nos permitirá usar eventos para os botões 6 e 7 para eventos de roda, permitindo-nos fazer o que quisermos quando os eventos para esses botões são recebido. Neste caso, vamos produzir vários eventos de mouse para um único rolo de roda do mouse (ou seja, um clique em qualquer direção).
Para multiplicar (acelerar) por três, por exemplo, colocaríamos o seguinte
em ~/.xbindkeysrc
:
"/usr/bin/xte 'mouseup 6' 'mouseclick 4' 'mouseclick 4' 'mouseclick 4' &"
b:6
"/usr/bin/xte 'mouseup 7' 'mouseclick 5' 'mouseclick 5' 'mouseclick 5' &"
b:7
Que, na verdade, se liga ao evento release do botão 6, três eventos de clique do botão 4. Ligar diretamente ao evento release do botão 4 produziria um loop infinito, porque toda vez que o botão 4 é liberado, três novos eventos do mesmo tipo para o mesmo botão são gerados. É por isso que remapeamos os botões antes.
Para testar a configuração, execute xbindkeys -n -v
(isso produzirá uma saída detalhada
no console, permitindo que você veja exatamente o que é produzido quando você rola
a roda do seu mouse. Se tudo correr bem, isso deve produzir
algo assim:
user@host:~$ xbindkeys -n -v
displayName = :0
rc file = /home/sjl/.xbindkeysrc
rc guile file = /home/sjl/.xbindkeysrc.scm
min_keycode=8 max_keycode=255 (ie: know keycodes)
"/usr/bin/xte 'mouseup 6' 'mouseclick 4' 'mouseclick 4' 'mouseclick 4' &"
m:0x0 + b:6 (mouse)
"/usr/bin/xte 'mouseup 7' 'mouseclick 5' 'mouseclick 5' 'mouseclick 5' &"
m:0x0 + b:7 (mouse)
starting loop...
Button press !
e.xbutton.button=6
e.xbutton.state=0
"/usr/bin/xte 'mouseup 6' 'mouseclick 4' 'mouseclick 4' 'mouseclick 4' &"
m:0x0 + b:6 (mouse)
got screen 0 for window ae
Start program with fork+exec call
Button release !
e.xbutton.button=6
e.xbutton.state=0
Button press !
e.xbutton.button=7
e.xbutton.state=0
"/usr/bin/xte 'mouseup 7' 'mouseclick 5' 'mouseclick 5' 'mouseclick 5' &"
m:0x0 + b:7 (mouse)
got screen 0 for window ae
Start program with fork+exec call
Button release !
e.xbutton.button=7
e.xbutton.state=0
Se você agora mover o foco para alguma janela rolável, o Firefox, por exemplo, você deve ver que a rolagem com a roda se tornou três vezes mais rápido como era.
Agora tudo o que resta a fazer é iniciar xbindkeys
em segundo plano quando você
comece sua sessão X. Isso é deixado como um exercício para o leitor.