Como criar um atalho que executa um comando xdotool para simular um pressionamento de tecla?

10

Estou tentando simular um pressionamento de tecla de mídia usando um atalho personalizado.

Até agora, consegui realizar a simulação necessária usando o comando:

xdotool key XF86AudioPlay

Funciona perfeitamente, pausa ou inicia o music player toda vez que é executado.

O problema surge ao tentar executá-lo como um atalho.

Primeiro, tentei executar um alias com um atalho personalizado, mas não funcionou.

Como explicado nesta pergunta :

Os comandos executados pelas ligações do teclado não são analisados ​​por meio de um shell. Sua melhor aposta é criar uma lixeira de diretório em sua casa.

Em seguida, criei o script sugerido e o nomeei simplay:

#!/bin/sh
xdotool key XF86AudioPlay

Ele está localizado dentro de uma pasta bin, que faz parte do PATH, isso funciona bem e pode ser executado em qualquer local.

Ao tentar criar o atalho personalizado, não consegui executá-lo, a configuração é a seguinte:

Name: test
Command: simplay

Shortcut: Ctrl+Alt+R

Depois de pesquisar um pouco mais, encontrei outra maneira de executar o atalho:

gnome-terminal -e simplay

Eu tentei em um terminal e notei que, ao executá-lo, ele abriria rapidamente uma nova janela do terminal, executaria o processo filho, pausaria a música e fecharia imediatamente a janela.

Alterei o comando no atalho e, ao pressioná-lo, notei o mesmo comportamento abrindo um terminal e sendo imediatamente fechado, mas desta vez o processo filho não pausou a música, o que me faz pensar que o script foi chamado em todas as minhas tentativas anteriores mas de alguma forma não é capaz de executar.

Como posso resolver este problema de acordo com o seu conhecimento?

Jorge Cuevas
fonte

Respostas:

12

O problema

O seu atalho é executado ao mesmo tempo que o pressionamento de tecla simulado

Se você executar um comando, simulando um pressionamento de tecla, chamado com ... outro pressionamento de tecla, você simulará um terceiro pressionamento de tecla, que é a combinação dos dois :)

Resolver

Você precisa impedir que seu atalho seja executado ao mesmo tempo em que a tecla simulada é pressionada, ou seja, adicione um atraso:

/bin/bash -c "sleep 1 && xdotool key XF86AudioPlay"

Adicione este comando a um atalho e ele deve funcionar.

Nota

É claro que você pode jogar um pouco com o valor in sleep 1, para defini-lo com o melhor valor que seja confortável, dependendo de quão "pegajosa" a combinação for pressionada. sleep 0.5pode muito bem fazer e fazer o atalho agir mais rapidamente.

Jacob Vlijm
fonte
8

Você também pode usar o comando diretamente na definição de atalho, para não precisar criar um script independente para ele.

Em vez de usar a solução alternativa "sleep 1", você pode usar o --clearmodifierssinalizador, ou seja, seu atalho personalizado ficaria assim:

Name: test
Command: xdotool key --clearmodifiers XF86AudioPlay

Shortcut: Ctrl+Alt+R

Para mim, isso funciona ao mapear os atalhos para Super+F9.

Jan
fonte
O snippet de código acima deve ser um arquivo? Em caso afirmativo, você precisa colocá-lo em um local específico ou executar um comando específico para implementar o atalho?
precisa
11
O trecho é apenas uma descrição do atalho que usei. No Ubuntu, você pode criar atalhos personalizados nas configurações do teclado. No entanto, desde então, atualizei minha versão do Ubuntu e agora sou capaz de mapear diretamente a ação "Reproduzir (ou reproduzir / pausar)" para uma combinação de teclas de minha escolha, que se mostra mais confiável do que usar o xdotool.
Janeiro
Ainda melhor que um --clearmodifiers é emitir um "keyup" para a tecla de atalho que você está usando para chamar o script. Uma pequena desvantagem é que você precisa atualizar o script se alterar a tecla de atalho para chamá-lo.
vanádio
1

Uma alternativa (para desempenho mais rápido) ao uso sleep 1 && xdotool ...é usar o xdotool para liberar suas teclas de atalho. Um pouco mais longo, mas você também pode usar

/bin/bash -c "xdotool keyup R Alt_L Ctrl_L && xdotool key XF86AudioPlay"
Alexander Mot
fonte