Eu resolvi esse problema com base em uma sugestão que veio de outro post na troca de pilha unix.
Resumidamente, eu executo um script de shell em segundo plano que faz um loop a cada 2 segundos procurando por uma alteração no mouse. Quando ele é encontrado, ele executa novamente o comando xinput.
A solução original (e mais simples) é publicada aqui:
Este é o script que eu executo em ~/.xinitrc
:
# Map mouse button 8 (top right) to button 2 (top left) and vice versa, run when changes to the mouse occur
while true; do
NEW_MOUSEID=$(xinput | grep "Expert Mouse" | grep -o -E '[0-9]+' | head -n 1)
if [ "$MOUSEID" != "$NEW_MOUSEID" ]; then
MOUSEID=$NEW_MOUSEID
if [ "$MOUSEID" != "" ]; then
xinput --set-button-map $MOUSEID 1 8 3 4 5 6 7 2 9 10 11 12
fi
fi
sleep 2
done &
Estrutura básica:
- Fique atento a alterações no ID do USB a partir de xinput a cada 2 segundos
- Se o ID do mouse estiver em branco, ele não está conectado, não execute xinput (você receberá um erro se fizer isso)
- A análise do comando
xinput
apenas retorna o ID do dispositivo USB para o mouse "Mouse experiente", ex: "14"
Observe que a resposta original sugere monitorar as alterações em lsusb
e reexecutar o comando, o que funciona igualmente bem.