Estou tentando configurar alguns acordes de botão do mouse, inspirados no editor de texto Acme: http://acme.cat-v.org/mouse
No Windows e no Mac, consegui configurar o seguinte usando AutoHotKey e Hammerspoon, respectivamente:
Left+Middle = Cut (Ctrl+x)
Left+Right = Paste (Ctrl+v)
Middle+Left = Return
Middle+Right = Space
Right+Left = Undo (Ctrl+z)
Right+Middle = Redo (Ctrl+Y / Ctrl+Shift+z)
Middle+Scroll = Switch window
Tendo mudado do Windows para o Linux no meu computador principal, estou tentando configurar o mesmo no Linux. Estou executando o OpenSUSE Tumbleweed com X11 e XFCE.
Para simplificar, focarei apenas em cut ( Left+Middle = Ctrl+x
) para os exemplos de código a seguir.
Usando, xev
descobri que, enquanto o botão esquerdo do mouse está pressionado, a state
variável é definida como 0x100
.
Portanto, uma configuração simples para cortar seria:
"xdotool key ctrl+x"
m:0x100 + b:2
Isso não funciona e recebo o infame aviso de programa conflitante:
*** Warning ***
Please verify that there is not another program running
which captures one of the keys captured by xbindkeys.
It seems that there is a conflict, and xbindkeys can't
grab all the keys defined in its configuration file.
m:0x4 + b:2
funciona (0x4 sendo Ctrl), então não tenho certeza de qual é o problema.
Existe uma maneira de fazer isso funcionar?
Pesquisando por aí encontrei algumas configurações para acordes de mouse, que pude adaptar às minhas necessidades. No entanto, isso requer suporte a guile em xbindkeys.
.xbindkeysrc.scm
(define actionperformed 0)
(define (first-binding)
"First binding"
(xbindkey-function '("b:1") b1-second-binding) ;; Left Mouse Button
)
(define (reset-first-binding)
"Reset first binding"
(ungrab-all-keys)
(remove-all-keys)
(set! actionperformed 0)
(first-binding)
(grab-all-keys)
)
(define (b1-second-binding)
"Left Mouse Button"
(remove-all-keys)
(ungrab-all-keys)
(run-command "xdotool mousedown 1 &") ;; <--- THIS DOES NOT WORK!
;; Left+Middle
(xbindkey-function '("b:2")
(lambda ()
;; Copy
(run-command "xdotool key ctrl+x&")
(run-command "xdotool mouseup 1&")
(set! actionperformed 1)
)
)
;; Release left
(xbindkey-function '(release "b:1")
(lambda ()
(unless actionperformed (begin
(run-command "xdotool mouseup 1&")))
(reset-first-binding)
)
)
(grab-all-keys)
)
(first-binding)
Isso faz com que Esquerda + Meio execute uma operação de corte.
O problema é que o botão esquerdo é substituído e, portanto, não posso fazer um simples clique esquerdo ou uma seleção de texto.
Eu adicionei xdotool mousedown 1
para corrigir isso, mas não funciona.
xdotool
parece não ser capaz de acionar um evento de mouse enquanto o mesmo evento de mouse está ativo.
Existe alguma maneira de impedir que xbindkeys substituam a ação normal dos botões?
Eu tenho outro mouse com um botão 9, usando isso eu posso pelo menos configurar alguma coisa.
Como todos os acordes de botão devem começar com o mesmo botão, só consigo obter 3 acordes (+ rolagem), que é metade do que quero.
Pressionar os botões também é muito estranho e não posso considerar isso uma solução permanente:
(define (first-binding)
(xbindkey-function '("b:9") second-binding)
)
(define (second-binding)
(remove-all-keys)
(ungrab-all-keys)
(xbindkey-function '("b:2") (lambda () (run-command "xdotool key ctrl+x")))
(xbindkey-function '(Release "b:9") reset-first-binding)
)
(define (reset-first-binding)
(ungrab-all-keys)
(remove-all-keys)
(first-binding)
(grab-all-keys)
)
(first-binding)
Alguma ideia de como resolver isso?