Xbindkeys não funcionará corretamente


8

Eu tenho um pouco de problema. Eu queria remapear algumas teclas de atalho que estou acostumado no meu sistema anterior, mas não consigo fazê-lo funcionar corretamente xbindkeys.

xbindkeys reconhece a combinação, mas de alguma forma o comando não dispara.

Se eu usar o comando

xdotool key braceleft

Isso gera o {sinal correto no console. No entanto, se eu usar o mesmo comando no xbindkeys, nada acontece. Se eu substituir o comando, firefoxele funcionará corretamente e abrirá o Firefox, então acho que xbindkeysfunciona.

Eu quero alcançar o seguinte:

Quero digitar o caractere {na janela ativa com Alt_R+ 7ou Alt_Left+ Ctrl+ 7para que eu possa usar os dois. Eu sei que Alt_R(AltGr) é a maneira correta, mas em teclados alemães é difícil digitar o braceleft com a AltGrtecla (Alt_R), então eu tenho que usar Alt_L+ Control+ 7(como eu estava acostumado no meu sistema anterior). De alguma forma, consegui que funcionasse corretamente no 12.04, mas não consigo fazê-lo no 14.04.

Alguma sugestão? Eu tentei vários comandos. Todos eles funcionaram no console, mas nenhum deles funcionou quando executado por xbindkeys

xdotool type '{'
xdotool key braceleft
xdotool key ISO_Level3_Shift+7
xvkbd -xsendevent -text '{'
xvkbd -xsendevent -text '\[Alt_R]+7'

Esta é a minha configuração, que não funcionará

"xdotool key braceleft"
Control+Alt + 7

No entanto, isso funciona:

"firefox"
Control+Alt + 7

Solução Editar

Enquanto eu tentava outras coisas, notei que o xdotool parece disparar muito cedo. Eu alterei a configuração assim:

"sleep 1 && xdotool type --delay 15 '{'"
Control+Alt + 7

AGORA ele envia o sinal {correto para a janela ativa. Agora, a única coisa que resta é reduzir o sono e o atraso para um valor viável, porque 1 segundo parece um pouco longo :)

** Informações de adição ** Bem, agora consegui encontrar valores adequados. No entanto, isso só funciona se você soltar as teclas até que a duração do sono termine. Se você é muito lento, se não funcionar.

Esta é a minha configuração atual para todos os caracteres AltGr alemães não convenientes

"sleep 0.2 && xdotool type --delay 15 '{'"
Control+Alt + 7

"sleep 0.2 && xdotool key --delay 15 at"
Control+Alt + q

"sleep 0.2 && xdotool type --delay 15 '€'"
Control+Alt + e

"sleep 0.2 && xdotool type --delay 15 '['"
Control+Alt + 8

"sleep 0.2 && xdotool type --delay 15 ']'"
Control+Alt + 9

"sleep 0.2 && xdotool type --delay 15 '}'"
Control+Alt + 0

"sleep 0.2 && xdotool type --delay 15 '~'"
Control+Alt + plus

No entanto, se você quiser digitar vários sinais @ (por exemplo), pressione Ctrl + Alt + Q conforme pretendido, mas solte todas as teclas e pressione-o novamente. Isso, no entanto, é muito, muito melhor do que não ter a opção Control + Alt em vez de AltGr, mas não é tão eficaz quanto eu também fui usado. Talvez eu encontre uma solução para isso também.


Huh, essa é uma boa descoberta! Não há limite de representantes para responder à sua própria pergunta, apenas um limite de tempo . Seria ótimo se você pudesse voltar e postar isso como resposta em 6 horas. Isso também lhe dará algum representante se você se importar com isso. Se você realmente não se importa, incluirei sua solução em minha resposta em alguns dias.
— terdon

Você já descobriu como xdotoolrepetir a tecla enquanto pressionado?
— Farzher

Para ser sincero, ainda não tentei. Consegui fazer com que o League of Legends funcionasse tranqüilamente com 60fps (em 12.04, não começaria nada) para que eu, quando estivesse em casa, estivesse jogando o tempo todo.
— Ello

Eu não recebi alguns atalhos trabalhando por dias. A solução foi simples: meu desktop Ubuntu obteve os atalhos antes do xbindkeys. Basta editar as configurações kayboard, adicionar um novo atalho personalizado com a açãoxdotool getactivewindow key Home
— BurninLeo

Parece que você está tentando simular um layout de teclado alemão. Por que você não muda o layout do teclado nas configurações do sistema?
— Rapti

Respostas:


4

O problema xdotoolé que, enquanto as teclas reais são pressionadas, o Xorg envia repetidamente eventos de pressionamento de tecla (veja a xevsaída). Para superar isso, você precisa desativar temporariamente o recurso de repetição e gerar o evento KeyRelease na chave que estava inativa.

Ao invés de

"sleep 0.2 && xdotool type --delay 15 '{'"
  Control+Alt + 7

tente o seguinte:

"xset r off; xdotool keyup --window 0 7 type --clearmodifiers --window 0 '{'; xset r on"
  Control+Alt + 7

Obrigado pela sua resposta, mas estou usando o Manjaro com o XFCE agora e lá funcionou imediatamente, portanto não é necessário dormir.
— Ello 15/05

@ Ello, essas respostas não são apenas para você, então a solução mais universal é apreciada.
— midenok

3

Enquanto eu tentava outras coisas, notei que o xdotool parece disparar muito cedo. Eu alterei a configuração assim:

"sleep 1 && xdotool type --delay 15 '{'"
Control+Alt + 7

AGORA ele envia o sinal {correto para a janela ativa. Agora, a única coisa que resta é reduzir o sono e o atraso para um valor viável, porque 1 segundo parece um pouco longo :)

** Informações de adição ** Bem, agora consegui encontrar valores adequados. No entanto, isso só funciona se você soltar as teclas até que a duração do sono termine. Se você é muito lento, se não funcionar.

Esta é a minha configuração atual para todos os caracteres AltGr alemães não convenientes

"sleep 0.2 && xdotool type --delay 15 '{'"
Control+Alt + 7

"sleep 0.2 && xdotool key --delay 15 at"
Control+Alt + q

"sleep 0.2 && xdotool type --delay 15 '€'"
Control+Alt + e

"sleep 0.2 && xdotool type --delay 15 '['"
Control+Alt + 8

"sleep 0.2 && xdotool type --delay 15 ']'"
Control+Alt + 9

"sleep 0.2 && xdotool type --delay 15 '}'"
Control+Alt + 0

"sleep 0.2 && xdotool type --delay 15 '~'"
Control+Alt + plus

No entanto, se você quiser digitar vários sinais @ (por exemplo), pressione Ctrl + Alt + Q conforme pretendido, mas solte todas as teclas e pressione-o novamente. Isso, no entanto, é muito, muito melhor do que não ter a opção Control + Alt em vez de AltGr, mas não é tão eficaz quanto eu também fui usado. Talvez eu encontre uma solução para isso também.


Isso é muito estranho, estou feliz que você tenha trabalhado, mas realmente não consigo entender por que isso está acontecendo. De qualquer forma, obrigado por reservar um tempo para publicá-lo, isso pode ajudar a próxima pessoa com o mesmo problema.
— terdon

Em vez de sleep, acho que você deseja adicionar + releaseaos combos de teclas. Isso diz xbindkeyspara esperar até que a chave seja liberada antes de disparar o comando.
— Wjandrea


2

Recentemente, tive esse problema, em que tentei simular a tecla Reproduzir / Pausar da mídia (XF86AudioPlay) usando Ctrl + G. Depois de algumas pesquisas, parecia não apenas que eu precisava cancelar o Controle , mas também a tecla g (que é o que precisava do sleep 0.1atraso para começar). Se eu cancelar essas duas chaves usando o keyupxdotool e a opção --clearmodifiers, ele funcionará. Este é o meu novo comando, no meu arquivo .xbindkeys.rc:

"xdotool keyup g key --clearmodifiers XF86AudioPlay"
Control + g

1

Não sei por que não funciona xbindkeys, acho que você precisa especificar a janela na qual gravar. Como solução alternativa, você pode usar xvkbd.

  1. Instalar xvkbd

    sudo apt-get install xvkbd
    
  2. Adicione isso ao seu .xbindkeysrcarquivo

    "xvkbd -text '{'"
    Control+Alt + 7
    

Isso deve funcionar.


NOTAS

Por alguma razão, na minha máquina, xvkbdestou usando um dos meus layouts secundários (espanhol) em vez do principal (inglês dos EUA) e isso faz {com que seja realmente impresso ". Se você também tiver esse problema, basta brincar um pouco para descobrir qual tecla corresponde ao {layout usado. Como alternativa, você pode se aprofundar e descobrir de onde xvkbdobtém suas localeconfigurações.


ainda não funciona. mesmo com caracteres adequados. se eu escrever xvkbd -text 'apple' no console, ele imprimirá apple; se eu executá-lo via xbindkeys, nada acontecerá. Se eu olhar para xbindkeys -v-lo vê-lo reconhecido o comando pressionado
— Ello

eu tenho que trabalhar, mas com outra coisa
— Ello

@Ello great! O que você usou? Funcionou bem para mim. Você poderia postar uma resposta explicando sua solução e aceitá-la?
— terdon

Alterei minha postagem, não posso responder minhas próprias perguntas por falta de reputação. Desculpe
— Ello
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.