Gostaria de remapear as teclas no teclado numérico para que elas se comportem de maneira diferente, dependendo de quanto tempo a tecla for pressionada. Aqui está um exemplo:
Se eu segurar a tecla pressionada Numpad 9 por menos de 300ms ele enviará o "anterior guia" tecla de comando Ctrl+Tab
Se eu segurar a tecla pressionada Numpad 9 para 300-599ms ele irá enviar a "nova guia" tecla de comando Ctrl+T
Se eu segurar a tecla pressionada Numpad 9 para 600-899ms ele enviará o "próximo guia / janela" tecla de comando Ctrl+W
Se eu mantiver a tecla Numpad 9 pressionada por mais de 899ms, ela não fará nada caso eu perca a janela de tempo que queria.
No Windows, eu poderia fazer isso com o AutoHotKey e no OS XI, no ControllerMate, mas não consigo encontrar uma ferramenta no UNIX / Linux que permita o remapeamento da chave com base no tempo que uma chave é mantida.
Se você conhece uma ferramenta que pode resolver meu problema, forneça um exemplo de script ou código que demonstre o comportamento condicional da duração da retenção de chave que descrevi acima. Ele não precisa ser o código completo para resolver o meu exemplo, mas deve ser o suficiente para redirecioná-lo para o meu exemplo.
fonte
Respostas:
Eu acabei de escrever isso em C :
Use
showkey -a
para obter o código-chave de ligação:Coloque o código-chave de ligação 5 e seu comando (por exemplo, execute
/tmp/.a.out
) em ~ / .bashrc:Observe que o código-chave relevante também precisa ser alterado no código-fonte (o valor hexadecimal também pode ser visto
sudo showkey -a
acima):Compile com (saída para
/tmp/a.out
no meu exemplo):Demonstração:
Numpad 5, pressão breve abre uma nova guia, pressão média abre gedit e pressão longa abre o terminal gnome.
Isso não é aplicável diretamente em nenhuma janela do gerenciador de desktop gnome, mas acho que deve lhe dar uma idéia de como (difícil) implementá-lo. Também funciona no console virtual (Ctrl + Alt + N) e funciona em algum emulador de terminal (por exemplo, konsole, gnome-terminal, xterm).
p / s: Eu não sou programador de CA, então me perdoe se esse código não for otimizado.
[ATUALIZAR]
A resposta anterior funciona apenas no shell e no foco necessário, então acho que analisar o / dev / input / eventX é a solução para trabalhar em toda a sessão do X.
Eu não quero reinventar a roda. Eu brinco com o
evtest
utilitário e modifiquei a parte inferior do evtest.c com meu próprio código:Observe que você deve alterar a parte do nome de usuário ( xiaobai é meu nome de usuário). E também
if ( (ev[i].code == 76) ) {
é o meu código-chave do Numpad 5, pode ser necessário imprimir manualmente o código ev [i]. Para confirmar duas vezes. E é claro que você também deve mudar o caminho do vídeo :)Compile e teste-o diretamente com (a parte `` é para obter o correto
/dev/input/eventN
):Note que
/by-id/
não funciona no Fedora 24, então eu mudo para / by-path /. Kali não existe esse problema.Meu gerenciador de desktop é gdm3:
Então, eu coloquei esta linha
/etc/gdm3/PostLogin/Default
para executar este comando como root na inicialização do gdm (/etc/X11/Xsession.d/*
não funciona):Por motivo desconhecido /
etc/gdm/PostLogin/Default
não funciona no Fedora 24 'gdm, o que me dá " Permissão negada " ao verificar o/tmp/l_gdmE
log. Manualmente não execute nenhum problema.Demonstração:
O Numpad 5, pressionar instantaneamente (<= 0,2 segundo) será ignorado, pressionar brevemente (0,2 a 0,5 segundo) aberto
nautilus
, pressionar médio (0,5 a 1 segundo) abertovlc
para reproduzir o vídeo, pressionar longo (1 a 2 segundos) abertognome-terminal
e pressione timeout (2 segundos) abertogedit
.Carreguei o código completo (apenas um arquivo) aqui .
[ATUALIZAR novamente]
[1] Adicionado fluxo de múltiplas chaves e
notify-send
falha corrigida por defineDBUS_SESSION_BUS_ADDRESS
. [2] AdicionadoXDG_CURRENT_DESKTOP
eGNOME_DESKTOP_SESSION_ID
para garantir que o konsole use o gnome theme gui (altere-o se você não estiver usando o gnome).Eu atualizei meu código aqui .
Observe que este código não trata do fluxo de teclas combinadas, por exemplo, Ctrl+ t.
ATUALIZAR:
Existem várias interfaces de dispositivo nas quais a sequência de entradas / dev / input / by-path / XXX-eventN é aleatória. Então, altero o comando da
/etc/gdm3/PostLogin/Default
seguinte forma (Chesen
é o meu nome de teclado, no seu caso, você deve alterá- lo paragrep Razer
):Você pode tentar a extração eventN em
cat /proc/bus/input/devices | grep -i Razer -A 4
:Neste exemplo acima, apenas
sudo cat /dev/input/event7
imprimirá uma saída bizarra quando clicar nos 12 dígitos do mouse Razer, que possui o padrão "sysrq kbd leds event7" para usargrep -P '^(?=.*sysrq)(?=.*leds)'
acima (seu padrão pode variar).sudo cat /dev/input/event6
imprimirá uma saída bizarra apenas quando clicar na tecla central para cima / baixo. Enquantosudo cat /dev/input/event5
imprimirá uma saída bizarra quando mover o mouse e rolar a roda.[Atualização: Suporte ao cabo do teclado de recarga para recarregar o programa]
O seguinte deve ser uma auto-explicação:
fonte
if-else
pressionamento de todas as teclas, enquanto eu também adicioneiif (currCode >= 59) && (currCode <= 81)
para limitar o intervalo antesif-else
.Você pode encontrar uma ferramenta que funcione com um conjunto específico de programas, mas não haverá ferramenta utilizável globalmente porque o comportamento relacionado ao tempo é feito nos aplicativos em X, e não no sistema de janelas.
fonte
você checou o Xmodmap?
O xmodmap é um utilitário para modificar mapas de teclas e mapeamentos de botões de ponteiro no Xorg
https://wiki.archlinux.org/index.php/Xmodmap
fonte