detectando chaves guardadas com xbindkeys

2

Estou usando xbindkeys para vincular Alt + left e Alt + right a chvt para percorrer terminais virtuais, conforme descrito aqui . Modifiquei a aritmética para ser modular em relação ao número de terminais virtuais disponíveis (seis). Eu inicio um daemon xbindkeys para cada instância de um gerenciador de janelas (por exemplo, antes de iniciar o dwm em tty1 e da mesma forma para o openbox em tty2); ou seja, cada tty tem sua própria xbindkeys instance.

Aparentemente, xbindkeys só pode detectar eventos de pressionamento de teclas iniciais e não chaves residualmente armazenadas. Portanto, se eu pressionar Alt + direita de tty1 para alternar para tty2 e, em seguida, continuar para tty3 , devo soltar as duas teclas e pressionar novamente ambas para avançar. Com menos de X ttys, eu posso segurar ambas as teclas ou manter Alt pressionado enquanto pressiona a tecla de seta. Essa funcionalidade (ou seja, memória de pressionamento de tecla) pode ser replicada com xbindkeys ? Como aparentemente preciso de várias instâncias (uma por WM, como declarado), e o programa ( xbindkeys ) parece detectar eventos de pressionamento de teclas iniciais em vez de chaves mantidas, talvez não seja possível. Quaisquer soluções alternativas seriam apreciadas.

    
por user001 30.10.2017 / 22:06

1 resposta

1

Para continuar com o que você desenvolveu atualmente, é possível usar o (s) pacote (s) de ferramentas evemu para usar os utilitários evtest e evemu-event . Liste os dispositivos de eventos de entrada com sudo evtest e encontre a linha correspondente ao seu teclado. Eu tenho um teclado especial, então eu tenho:

/dev/input/event2:      HID 05f3:0007

Agora escolha esse número (2 no meu caso) e pressione a tecla que você deseja reconhecer (Alt para você). Usei left shift e peguei

Event: time 15094562, -------------- SYN_REPORT ------------
Event: time 15094562, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time 15094562, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1

Vemos que recebi um evento do tipo EV_KEY com o código KEY_LEFTSHIFT obtendo o valor 1 quando pressionei shift e um evento similar com valor 0 quando o lancei.

Agora você pode simplesmente consultar o estado dessa chave a qualquer momento, por exemplo, após o chvt. Use, no meu caso,

sudo evtest --query  /dev/input/event2 EV_KEY KEY_LEFTSHIFT

O código de retorno deste comando é 0 se o valor for 0 e 10 se o valor for 1. Você pode usar echo $? para mostrar este valor.

Sabendo o estado da chave, agora você pode emular um evento de pressionamento de tecla para que o servidor X11 veja o estado "atual". No meu caso, eu faria

sudo evemu-event /dev/input/event2 --type EV_KEY --code KEY_LEFTSHIFT --value 1

Como você pode imaginar, provavelmente existe uma solução mais simples para o seu problema original. Em vez de usar xbindkeys e ter esse problema corrigido aqui, você pode procurar uma solução diferente usando o libevent. Há exemplos em C no Subsistema de Entrada USB do Linux e parte 2 no Linux Journal. Seu sistema pode ter uma biblioteca Python evdev para tornar isso mais fácil.

    
por 31.10.2017 / 14:35

Tags