Esta pergunta já foi feita, mas nunca foi respondida corretamente. Após a liberação com @Seth, agora estou perguntando novamente. Isso me permitirá responder e possivelmente modificar a pergunta muito mais facilmente. A pergunta original pode ser encontrada aqui:
Mapeie Ctrl e Alt para os botões do polegar do mouse
Questão:
Embora seja muito simples mapear qualquer pressionamento de tecla para um botão do mouse usando xbindkeys
em conjunto com xdotool
ou xte
pareça muito mais problemático mapear uma tecla modificadora (por exemplo , ALT , CTRL , SHIFT etc.) para ela.
A solução final deve permitir um clique CTRL + (por exemplo, para selecionar várias entradas de uma lista) com apenas o mouse.
Algumas abordagens possíveis para resolver isso podem ser encontradas aqui no Stack Exchange e em outros fóruns relacionados ao Linux. Mas nenhum deles funciona como esperado, pois leva a outros problemas e efeitos colaterais.
Notas:
Alguns dos exemplos abaixo envolvem a sintaxe do Guile com Scheme e dependem do .xbindkeysrc.scm
arquivo, enquanto outros dependem do.xbindkeysrc
arquivo com sua respectiva sintaxe. Estou ciente de que eles não vão trabalhar juntos.
Além disso, os trechos abaixo dependem xdotool
apenas, mas estou aberto a abordagens que envolvam outros aplicativos como, por exemplo xte
, também - embora pareça levar aos mesmos resultados e, portanto, estou usando apenas xdotool
ações aqui.
Abordagem A:
Atualizando o .xbindkeysrc
arquivo com:
"xdotool keydown ctrl"
b:8
"xdotool keyup ctrl"
release + b:8
Foi o que eu tentei inicialmente, mas tem o efeito colateral de que o modificador está sendo mantido e não pode ser liberado.
Abordagem B:
Atualizando o .xbindkeysrc.scm
arquivo com:
(xbindkey '("b:8") "xdotool keydown ctrl")
(xbindkey '(release "b:8") "xdotool keyup ctrl")
(xbindkey '("m:0x14" "b:8") "xdotool keydown ctrl")
(xbindkey '(release "m:0x14" "b:8") "xdotool keyup ctrl")
Encontrado em http://www.linuxforums.org/forum/hardware-peripherals/169773-solved-map-mouse-button-modifier-key.html e tenta resolver o problema em que o modificador está sendo mantido (conforme descrito na abordagem uma).
Embora conserte que ele funciona apenas parcialmente, pois não é possível executar outros cliques do mouse enquanto o botão do polegar é pressionado.
Abordagem C:
Atualizando o .xbindkeysrc
arquivo com:
"xdotool keydown ctrl"
b:8
"xdotool keyup ctrl"
release + control + b:8
Tentei pelo OP da questão vinculada aqui no askubuntu. Muito mais simples e mais sólido, pois não envolve estados modificadores. No entanto, o problema permanece, ou seja, um clique CTRL + não é possível.
Parece que esse xbindkeys
é o problema aqui, pois reconhece o clique, mas não o executa. Isso pode ser testado usando xev | grep button
e xbindkeys -v
:
Um clique normal do mouse, conforme registrado por, xev
deve se parecer com:
state 0x10, button 1, same_screen YES
state 0x110, button 1, same_screen YES
Bem como para o botão do polegar:
state 0x10, button 8, same_screen YES
state 0x10, button 8, same_screen YES
Mas ao xbindkeys
ativar a configuração acima, ela não registra nada. Embora faça sentido para o botão do polegar, pois ele é mapeado para CTRL e, portanto, não é mais um botão do mouse, é estranho que o botão 1 também não seja gravado. Provavelmente, porque xbindkeys
não o executa, mas ele próprio o reconhece:
Button press !
e.xbutton.button=8
e.xbutton.state=16
"xdotool keydown ctrl"
m:0x0 + b:8 (mouse)
got screen 0 for window 16d
Start program with fork+exec call
Button press !
e.xbutton.button=1
e.xbutton.state=20
Button release !
e.xbutton.button=1
e.xbutton.state=276
Button release !
e.xbutton.button=8
e.xbutton.state=20
"xdotool keyup ctrl"
Release + m:0x4 + b:8 (mouse)
got screen 0 for window 16d
Start program with fork+exec call
Abordagem D:
Atualizando o .xbindkeysrc
arquivo com:
"xdotool keydown ctrl"
b:8
"xdotool keyup ctrl"
release + control + b:8
"xdotool click 1"
b:1
Simples demais ... mas leva a um loop infinito de cliques.
ATUALIZAR:
Enquanto isso, comprei um Logitech G502 e notei que, uma vez configurado através do driver no Windows, não apenas o perfil em si é armazenado na memória do dispositivo, mas o pressionamento de tecla real é feito pelo mouse. Isso de fato resolveu meu problema no Linux!
O único outro mouse que me lembro que foi capaz de fazer isso foi o Razer Copperhead na época. Mas acho que existem outros ratos disponíveis hoje que podem fazer o mesmo.
Respostas:
Passei muito tempo tentando fazer essa ligação funcionar. Acabei encontrando uma solução que é complicada, mas funciona bem e não implica software de terceiros. Eu compartilho aqui esperando que ajude as pessoas. Além disso, sei que isso não é perfeito em termos de segurança, portanto, qualquer feedback construtivo é mais que bem-vindo.
Existem soluções realmente legais, como a proposta aqui , mas sempre sofrem com a limitação das xbindkeys que agarram o mouse inteiro, tornando incertos os modificadores + o mapeamento de cliques do mouse. Além disso, a solução baseada em guile do link acima usa ctrl + plus / ctrl + menos, que não é reconhecido pelo Gimp, por exemplo.
Eu descobri que o que queremos é um botão do mouse que atue como teclado, então usei o uinput, que pode ser acessado via python , escrevi um script que monitora / dev / my-mouse para o clique do botão polegar e envia a tecla ctrl para o teclado virtual. Aqui estão as etapas detalhadas:
1. Faça regras do udev
Queremos que os dispositivos estejam acessíveis (direitos e localização).
Para o mouse:
O Udev procurará um dispositivo reconhecido pelo kernel com nomes como event5 e eu seleciono meu mouse com o nome. A instrução SYMLINK garante que encontrarei 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, execute algo como
Para entrada:
Não há necessidade de link simbólico, o uinput sempre estará dentro
$/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 deverá aparecer em / dev. Você pode forçar o udev a acionar suas regras com
$udevadm trigger
2. Ative o módulo UINPUT
E para tornar a inicialização persistente:
3. Crie um novo grupo
Ou o que você chamou de seu grupo de acesso. Então você deve se adicionar a ele:
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, basta identificar o event.code do seu botão.
5. Aproveite!
Tudo o que você precisa agora é tornar seu arquivo python executável e solicitar ao seu gerente da área de trabalho que carregue o arquivo na inicialização. Talvez também um copo de vinho para comemorar o bom trabalho!
6. Extra de graça
Eu uso xbindkeys para comportamento adicional. Por exemplo, a seguinte configuração pode ser boa se você tiver um mouse com cliques no lado da roda:
Para que esta última combinação funcione, você deve desativar o botão que configurou para o script python , caso contrário, ele ainda será agarrado pelo xbindkeys. Somente a tecla Ctrl deve permanecer:
Recarregar com
$ xmodmap ~/.Xmodmap
7. Conclusão
Como eu disse no começo, não estou perfeitamente feliz com o fato de ter que me dar o direito de escrever para / dev / uinput, mesmo que seja considerado o grupo "mxgrabber". Tenho certeza de que há uma maneira mais segura de fazer isso, mas não sei como.
Pelo lado positivo, funciona muito, muito bem. Qualquer combinação de teclas do teclado ou do mouse que funcione com o botão Ctrl do teclado agora funciona com o do mouse !!
fonte
Encontrei uma solução com PyUserInput . Isso acaba sendo bastante simples e não requer direitos de administração. Com o python 2 e o PyUserInput instalados, usei o seguinte script:
Depois de conceder direitos de execução ao script, chamo-o com uma linha
~/.xsessionrc
, por exemplo~ / caminho / para / script.py &
Nota . isso não impede que o evento do botão do mouse seja disparado. No meu caso, eu costumava
xinput set-button-map
alterar o mapeamento do botão xinput e atribuir o número do botão no qual estava interessado a algo que não estava em uso.Por exemplo, se você deseja usar o botão 8 do mouse, mas o botão 8 já tem uma função (por exemplo,
page-next
), você pode usar o seguinte.xsessionrc
botão fornecido
12
não tem significado para o sistema operacional, e atribuir uma função personalizada para o botão12
no.xbuttonmodifier.py
, o script que eu descrevi acima.fonte
xinput
. Veja a pergunta editada.Eu tenho uma solução parcial. Eu não descobri como remover o mapeamento do botão existente, então você acaba com um clique no botão e o modificador que deseja. Portanto, se esse botão do mouse tiver algum objetivo existente, ele ainda será acionado. Por exemplo, refazer o botão direito do mouse em uma tecla de controle resultará no envio de um controle + clique.
Enfim, encontrei uma postagem no fórum que é semelhante à sua pergunta para a qual a resposta foi instalar o btnx e configurar seus modificadores por meio disso. Parece que o btnx não está mais disponível no repositório. Existe um ppa, mas ele não funciona para o ubuntu mais recente.
Post do fórum: post: http://ubuntuforums.org/showthread.php?t=1245930
Mas a fonte está disponível:
Você pode compilá-lo da fonte, mas isso colocará arquivos em seu sistema que o gerenciador de pacotes não pode manter.
Ou seja, os seguintes arquivos:
Os seguintes links simbólicos:
Então ... se você não se importa em construir a partir da fonte ...
Obtenha as dependências para o btnx:
Se você nunca criou nada a partir do código-fonte, também pode ser essencial para o build:
Em seguida, obtenha e compile o btnx:
Possui uma ferramenta de configuração da GUI separada. Obtenha as dependências para isso:
Agora obtenha e compile a ferramenta de configuração da GUI:
Agora execute a ferramenta:
Clique em Detectar botões do mouse Se você quiser ler as instruções enquanto usa a ferramenta, redimensione a janela exibida, o texto da caixa de diálogo será cortado posteriormente, se você não o fizer, e se tentar redimensionar durante a detecção, ele será cancelado. a detecção. Apenas faça a janela um pouco maior.
Clique em Pressione para iniciar a detecção do mouse e tente não mover o mouse até o texto mudar ... Demora cerca de 5 a 10 segundos. O texto mudará. Quando isso acontecer, ignore o que diz e clique em Avançar.
Clique no botão "Pressione para iniciar a detecção do botão"
Aqui você clicará em um botão do mouse várias vezes (até que a barra de status seja preenchida). Em seguida, defina o nome do botão para algo que você reconhecerá mais tarde (ex: Botão Esquerdo) Clique no botão Adicionar.
Repita isso para cada botão do mouse (não se esqueça das rodas de rolagem, cliques de rolagem etc.). Você provavelmente pode pular os botões que não deseja remapear.
Quando você adicionar todos os botões, clique em OK.
Na GUI principal, clique em Botões, no painel esquerdo, selecione o botão que você deseja remapear. Ele usará os nomes digitados nas etapas anteriores. Para seus propósitos, convém selecionar apenas um modificador de chave em Combinação de teclas à direita.
Não clique em Excluir nesta tela, ele removerá o botão. Você precisará voltar e detectar o botão novamente, se o fizer.
Volte para a tela Configurações e clique em reiniciar btnx.
Experimente o novo botão.
Se você deseja desinstalar os aplicativos, pare o programa btnx e, em seguida, vá para os respectivos diretórios com check-out do git e faça a desinstalação:
fonte