Existe um evento KeyHold no Xorg?

3

Eu tenho um novo Macbook Pro e eu instalei o Arch Linux nele. Uma coisa que eu quero ser capaz de fazer é usar as teclas de mídia para procurar através de uma faixa (em mpd) e ir para a faixa seguinte ou anterior. Isso é possível no OSX com o iTunes, então eu assumo que não é fundamentalmente impossível. A utilização de xev mostra apenas os eventos Key Press e Key Release. Segurar uma chave parece simplesmente percorrer rapidamente esses dois eventos.

Então, o que eu quero ser capaz de fazer é:

  • vai para a próxima faixa do mpd quando a tecla XF86AudioNext é pressionada; ou
  • procure na faixa mpd atual quando a tecla XF86AudioNext é pressionada

e, claro, o mesmo (mas na outra direção) para a chave XF86AudioPrev.

Parece que isso só é possível através de alguns scripts avançados. Espero que um de vocês possa me apontar na direção certa.

Editar: Curiosamente, showkey não alterna entre Pressionar e Liberar ao manter pressionada uma tecla. Pelo contrário, apenas mostra um monte de eventos da Press durante o qual a chave é mantida pressionada e um evento de lançamento final quando finalmente é liberado.

Outra coisa interessante que notei é que ao desabilitar a reprodução automática usando xset , então xev mostrará apenas um evento Key Press, não importando o tempo que a tecla seja pressionada e um único evento de Liberação de Chave quando for liberado . Por outro lado, a saída de showkey não muda. Ele mostra um monte de evento da Key Press e um lançamento final quando é liberado.

Provavelmente, há uma maneira de usar isso no script do que eu quero fazer, mas sxhkd da ferramenta de atalho que estou usando parece seguir a xev way. Então é Xbindkeys .

    
por Kalq 08.04.2016 / 03:19

1 resposta

3

Não, não há evento KeyHold, apenas KeyPress e KeyRelease. KeyPress é enviado quando a tecla é pressionada e enviada novamente após um determinado período de tempo. A hora pode ser configurada com xset r (existem duas vezes: tempo para a primeira repetição e tempo para repetições subsequentes). Um evento KeyRelease é enviado quando a chave é realmente liberada (não é enviada enquanto a chave está sendo segurada).

Se um aplicativo desejar reagir a uma tecla retida, ele precisará observar a pressão inicial da tecla e reagir depois de um horário definido ou após um novo evento KeyPress, desde que não tenha recebido uma KeyRelease nesse meio tempo. Reagir às teclas retidas é altamente incomum no mundo da GUI do Unix, então há um círculo de aplicações que não se auto-perpetuam e estruturas de programação que não oferecem uma maneira fácil de fazê-lo.

O XKB permite que algumas chaves sejam configuradas como não repetíveis; essas chaves geram apenas um KeyPress inicial e um KeyRelease final. Eu não sei onde isso é feito na configuração. Com essas chaves, apenas a estratégia de tempo limite do KeyPress + funcionará, não a estratégia do segundo KeyPress.

Nem os xbindkeys nem o sxhkd facilitam isso. Embora eles permitam que uma ação seja vinculada a eventos de lançamento de chave, eles não facilitam a relação entre a tecla pressionada e a liberação da tecla, por isso é difícil programar a lógica “faça isso X ms após pressionar a tecla, mas somente se a chave ainda não foi lançada ”+“ faça isso no lançamento da chave, mas somente se o evento hold ainda não tiver sido disparado ”. Não conheço nenhum outro framework semelhante que facilite isso.

    
por 09.04.2016 / 02:13