Vincular Alt + Tab a um botão do mouse da Logitech no Kubuntu

6

Nota: esta não é uma duplicata de isso ou isso , como vou deixar claro.

Eu tenho um mouse Logitech Proteus Core . No Windows 10, configurei um de seus botões (o pequeno chamado "G9" na parte superior do mouse) para mostrar uma lista de tarefas, que pode ser ativada usando as teclas Win + Tab. Observe que isso permanece ativo mesmo se você soltar as teclas Win e Tab, ele só desaparece quando você clicar na janela para a qual deseja ir. Portanto, o fluxo de trabalho é: pressione e solte o botão do mouse G9, clique na janela que eu quero.

Eu quero um comportamento semelhante no Kubuntu 15.04. AFAIK, não há como abrir uma lista de tarefas semelhante, que fica ativa até você clicar em algo, sem ter que segurar nenhuma tecla.

Então minha ideia era emular o Alt + Tab com esse botão. O fluxo de trabalho que tenho em mente é: aperte G9 (atalho para "push alt, push tab, guia realease") = > selecione a janela que eu quero, solte G9 (atalho para "release alt").

O problema é que, até onde eu sei, este botão G9 não está sendo lido pelo SO como um botão normal do mouse. Se eu correr:

xbindkeys -mk

E clique no botão G9 e recebo esta saída:

"(Scheme function)"
m:0x40 + c:23
Mod4 + Tab
"(Scheme function)"
m:0x40 + c:133
Mod4 + Super_L

Observação: estou executando isso em uma VM para fins de teste. Deixe-me saber se isso pode afetar as coisas, embora eu precise trabalhar também neste caso.

Se eu correr:

xev | grep button

Eu não recebo saída quando clico no botão G9 em que estou interessado. Se eu clicar em outros botões, recebo as saídas esperadas como:

state 0x0, button 2, same_screen YES

Isso é estranho, mas achei que poderia adicionar apenas o xbindkeys -mk às minhas ~/.xbindkeysrc :

"xte 'keydown Alt_L' 'key Tab'"
  m:0x40 + c:23 + Release

Obviamente, mesmo que isso funcionasse, não faria o que eu quero, mas nem funciona. Nada acontece quando clico no botão G9 após a execução:

xbindkeys -v -n

O que dá esse aviso:

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.

Se eu digitar o comando xte no console, ele abrirá o menu alt + tab de seleção de tarefas. Nada para o botão do mouse, no entanto.

Se eu atribuir a mesma chamada xte a outro botão, uma que seja mostrada pela saída xev (tentei o botão direito do mouse), ela ainda não será executada (parece que somente a guia é executada, pois abas coisas no editor de texto), mas o aviso se foi, e a função regular do botão também desapareceu:

Como posso obter o comportamento Alt+Tab que descrevi ao clicar no botão G9? Que tal outro botão, que xev detecta, como b:3 ?

Nota: este mouse salva internamente a configuração feita de seu software Windows. Assim, todos os meus outros botões mantêm suas funções na VM: voltar / avançar no navegador, alternar as guias do navegador, etc. O software Logitech permite gravações de macro no Windows, mas não permite especificar ações diferentes para eventos push / release, AFAIK.

Se houver uma maneira de gravar a macro certa no Windows, ou se houver uma maneira de simplificar o que eu quero alcançar no Kubuntu - ou seja, usar o botão G9 para obter funcionalidade semelhante ao alt + tab -, eu também aceita essas soluções.

    
por IVlad 21.09.2015 / 21:19

2 respostas

5

evrouter pode ajudar a fazer isso. Ele permitirá até liberar G9 antes de selecionar a tarefa da lista.

link

Eu criei a partir da fonte e instalei com checkinstall , mas há algo parecido com um repositório lá.

Ganchos

Pode ser configurado no ~/.evrouterrc :

"Logitech Gaming Mouse G300" "/dev/input/event.*" any key/272 "SHELL//home/velkan/click.sh"

"Logitech Gaming Mouse G300" "/dev/input/event.*" any key/275 "SHELL//home/velkan/atab.sh"

Executar sudo evrouter -d /dev/input/event* e clicar em volta ajudará a compor essas linhas.

"Logitech Gaming Mouse G300" é o nome do meu mouse.

"/dev/input/event.*" significa que a entrada será interceptada, independentemente do nome do arquivo do dispositivo ao qual o mouse está vinculado.

any - significa que o evento será aceito com qualquer modificador Alt / Ctrl / Shift.

key/272 - botão esquerdo do mouse.

key/275 - botão do mouse para trás (no G4 para mim).

"SHELL//home/velkan/click.sh" - execute /home/velkan/click.sh quando esse evento ocorrer.

Scripts Alt-Tab

Então, o script /home/velkan/atab.sh (que está vinculado a G4 neste caso):

#!/bin/bash

mktemp /tmp/evr-alt-tab-XXXX

/usr/bin/xte 'usleep 100000' 'keydown Alt_L' 'usleep 50000' 'key Tab'

Ele cria um arquivo temporário que informará o click.sh (ligado ao botão esquerdo) que precisa liberar o Alt.

click.sh script:

#!/bin/bash

if [ -e /tmp/evr-alt-tab-???? ]; then
    /usr/bin/xte 'usleep 100000' 'keyup Alt_L'
    rm /tmp/evr-alt-tab-????
fi

Ativando o evrouter na inicialização

Não tentei isso no KDE.

Iniciar script /usr/local/sbin/evrouter_launch.sh :

#!/bin/sh
/usr/local/bin/evrouter /dev/input/event* 0<&- > /dev/null

(ou pode ser /usr/bin/evrouter em vez de /usr/local/bin/evrouter )

Config /etc/lightdm/lightdm.conf para iniciar o roteiro com o gerenciador de área de trabalho:

[SeatDefaults]
autologin-user=
session-setup-script=/usr/local/sbin/evrouter_launch.sh
    
por Velkan 23.09.2015 / 22:15
3

Eu fiz isso usando idéias da resposta de Velkan. Vou listar os passos necessários.

  1. Primeiro, a macro Win+Tab que eu defini no botão G9 do Windows estava interferindo em como o Linux detecta o mouse. Em vez de detectar o botão do mouse, ele simplesmente detectou as chaves Win e Tab em xev . Acredito que o mouse esteja configurado internamente para enviá-los se você configurar o botão como "Macro Multikey" em seu software Windows.

    Para corrigir isso, não defina o botão para usar uma Macro Multikey no Windows. Defina para qualquer outra coisa. Eu configurei para ser um clique do meio.

  2. Agora, xev | grep button detectou o G9 como o botão 2 .

  3. Eu escrevi esse script em ~/alttab.sh , que é uma combinação dos scripts do Velkan:

    #!/bin/bash
    
    if [ -e /tmp/alt-tab-mouse-script-???? ]; then
       xte 'usleep 100000' 'keyup Alt_L'
       rm /tmp/alt-tab-mouse-script-????
    else
       mktemp /tmp/alt-tab-mouse-script-XXXX
       xte 'usleep 100000' 'keydown Alt_L' 'usleep 50000' 'key Tab'
    fi
    
  4. Eu adicionei isso no meu ~/.xbindkeysrc . Precisamos de duas linhas para fazer o clique funcionar nos dois estados: quando alt está inativo e quando não está.

    "~/alttab.sh"
      b:2 + Release 
    
    "~/alttab.sh"
      Alt + b:2
    

Isso funcionou muito bem para mim. O fluxo é: clique em G9 (pressione e solte), selecione a janela desejada (clique com o botão esquerdo do mouse ou roda do mouse) e, em seguida, clique em G9 novamente para ir para essa janela. Você pode modificar o primeiro if no arquivo .sh para também enviar um mouseclick 1 antes do atalho de teclas, se você quiser ir diretamente para a janela em que clicou com o botão G9 no visor do Windows.

Eu também experimentei remover as chamadas usleep . Funcionou para mim sem eles.

O comportamento não é exatamente igual ao do Windows, mas acho que ele está perto o suficiente. Talvez ainda mais conveniente, já que você pode fazer a seleção com o mesmo botão, para não precisar mover o dedo para outro botão!

    
por IVlad 25.09.2015 / 10:49