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.

Ello
fonte
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
midenok
fonte
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.

Ello
fonte
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
QuickishFM
fonte
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.

Terdon
fonte
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