Me gustaría reasignar las teclas en mi teclado numérico para que se comporten de manera diferente dependiendo de cuánto tiempo se mantenga presionada la tecla. Aquí hay un ejemplo:
Si mantengo presionada la tecla Numpad 9 durante menos de 300 ms, enviará el comando de teclado "pestaña anterior" Ctrl+Tab
Si mantengo presionada la tecla Numpad 9 durante 300-599 ms, enviará el comando de tecla "nueva pestaña" Ctrl+T
Si mantengo presionada la tecla Numpad 9 durante 600-899 ms, enviará el comando de tecla "cerrar pestaña / ventana" Ctrl+W
Si mantengo presionada la tecla Numpad 9 durante más de 899 ms, no hace nada en caso de que pierda la ventana de tiempo que quería.
En Windows podría hacer esto con AutoHotKey y en OS XI podría hacer esto con ControllerMate, pero no puedo encontrar una herramienta en UNIX / Linux que permita la reasignación de claves en función de cuánto tiempo se mantiene una clave.
Si conoce una herramienta que puede resolver mi problema, asegúrese de proporcionar una secuencia de comandos o una muestra de código que demuestre el comportamiento de duración de retención de clave condicional que describí anteriormente. No necesita ser el código completo para resolver mi ejemplo, pero debería ser suficiente para que lo reutilice para mi ejemplo.
Respuestas:
Acabo de escribir esto en C :
Use
showkey -a
para obtener el código clave de enlace:Ponga el código clave de enlace 5 y su comando (por ejemplo, ejecutar
/tmp/.a.out
) en ~ / .bashrc:Tenga en cuenta que el código clave relevante también debe cambiar en el código fuente (el valor hexadecimal también puede obtenerse desde
sudo showkey -a
arriba):Compilar con (salida a
/tmp/a.out
en mi ejemplo):Demostración:
Teclado numérico 5, presione brevemente para abrir una nueva pestaña, presione medianamente para abrir gedit y presione prolongadamente para abrir gnome-terminal.
Esto no es directamente aplicable en ninguna ventana en el administrador de escritorio gnome, pero creo que debería darle una idea de cómo (difícil) implementarlo. También funciona en la Consola virtual (Ctrl + Alt + N), y funciona en algún emulador de terminal (por ejemplo, konsole, gnome-terminal, xterm).
p / s: no soy un programador de CA, así que perdóname si este código no está optimizado.
[ACTUALIZAR]
La respuesta anterior solo funciona en shell y requiere el enfoque, por lo que creo que analizar / dev / input / eventX es la solución para trabajar en toda la sesión X.
No quiero reinventar la rueda. Juego con la
evtest
utilidad y modifiqué la parte inferior de evtest.c con mi propio código:Tenga en cuenta que debe cambiar la parte del nombre de usuario ( xiaobai es mi nombre de usuario). Y también
if ( (ev[i].code == 76) ) {
es mi código clave Numpad 5, es posible que deba imprimir manualmente el código ev [i]. Para confirmar dos veces. Y, por supuesto, también debes cambiar la ruta del video :)Compílelo y pruébelo directamente con (la parte `` es para obtener el correcto
/dev/input/eventN
):Tenga en cuenta que
/by-id/
no funciona en Fedora 24, así que lo cambio a / by-path /. Kali no tiene tal problema.Mi administrador de escritorio es gdm3:
Entonces, puse esta línea
/etc/gdm3/PostLogin/Default
para ejecutar este comando como root en el inicio de gdm (/etc/X11/Xsession.d/*
no funciona):Por una razón desconocida /
etc/gdm/PostLogin/Default
no funciona en Fedora 24 'gdm que me da " Permiso denegado " cuando verifica el/tmp/l_gdmE
registro. Sin embargo, no se ejecutan manualmente.Demostración:
Teclado numérico 5, se ignorará la presión instantánea (<= 0.2 segundos), presión corta (0.2 a 0.5 segundos) abierta
nautilus
, presión media (0.5 a 1 segundo) abiertavlc
para reproducir video, presión larga (1 a 2 segundos) abiertognome-terminal
, y tiempo de espera-presione (2 segundos) abiertogedit
.Subí el código completo (solo un archivo) aquí .
[ACTUALIZAR de nuevo]
[1] Se agregó flujo de claves múltiples y se corrigió el
notify-send
error por definiciónDBUS_SESSION_BUS_ADDRESS
. [2] AgregadoXDG_CURRENT_DESKTOP
yGNOME_DESKTOP_SESSION_ID
para garantizar que konsole use la interfaz de usuario de tema gnome (cámbielo si no está usando gnome).Actualicé mi código aquí .
Tenga en cuenta que este código no maneja el flujo de teclas de combinación, por ejemplo, Ctrl+ t.
ACTUALIZAR:
Hay múltiples interfaces de dispositivo cuya secuencia de entradas / dev / input / by-path / XXX-eventN es aleatoria. Así que cambio el comando de la
/etc/gdm3/PostLogin/Default
siguiente manera (Chesen
es el nombre de mi teclado, para su caso, debería cambiarlo agrep Razer
):Puedes probar el extracto de eventN de
cat /proc/bus/input/devices | grep -i Razer -A 4
:En este ejemplo anterior, solo
sudo cat /dev/input/event7
imprimirá resultados extraños cuando haga clic en los 12 dígitos del mouse Razer, que tiene el patrón "sysrq kbd leds event7" para usargrep -P '^(?=.*sysrq)(?=.*leds)'
arriba (su patrón puede variar).sudo cat /dev/input/event6
imprimirá resultados extraños solo cuando haga clic en la tecla central arriba / abajo. Mientrassudo cat /dev/input/event5
imprime resultados extraños cuando mueve el mouse y desplaza la rueda.[Actualización: admite el cable del teclado Replug para volver a cargar el programa]
Lo siguiente debe explicarse por sí mismo:
fuente
if-else
cada pulsación de tecla, mientras que también agreguéif (currCode >= 59) && (currCode <= 81)
para limitar el rango antesif-else
.Es posible que encuentre una herramienta que funcione con un conjunto particular de programas, pero no habrá una herramienta utilizable globalmente porque el comportamiento relacionado con el tiempo se realiza en aplicaciones en X, en lugar de hacerlo mediante el sistema de ventanas.
fuente
¿comprobaste el Xmodmap?
xmodmap es una utilidad para modificar mapas de teclas y asignaciones de botones de puntero en Xorg
https://wiki.archlinux.org/index.php/Xmodmap
fuente