¿Hay alguna manera de que mi binario reaccione a algunas teclas de acceso rápido globales en Linux?

StackOverflow https://stackoverflow.com/questions/74790

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Es posible escuchar una determinada tecla de acceso rápido (por ejemplo:Control-I) y luego realizar una acción específica?Mi aplicación está escrita en C, solo se ejecutará en Linux y no tiene GUI.¿Existen bibliotecas que ayuden con este tipo de tarea?

EDITAR:Por ejemplo, Amarok tiene atajos globales, así que, por ejemplo, si asignas una combinación de teclas a una acción (digamos Control-+, Control y +) podrías ejecutar esa acción cuando presiones las teclas.Si pudiera mapear Control-+ a la acción de aumento de volumen, cada vez que presiono control-+ el volumen debe aumentar en una cierta cantidad.

Gracias

¿Fue útil?

Solución

¿Qué tan globales deben ser tus teclas de acceso rápido?¿Es suficiente que sean globales para una sesión X?En ese caso, debería poder abrir una conexión Xlib y escuchar los eventos que necesita.

Normalmente, los eventos de teclado en X se entregan a la ventana que actualmente tiene el foco y se propagan hacia arriba en la jerarquía hasta que se manejan.Está claro que esto no es lo que queremos.Necesitamos procesar el evento antes de que cualquier otra ventana pueda acceder a él.necesitamos llamar XGrabKey en la ventana raíz con el código clave y los modificadores de nuestra tecla de acceso rápido para lograr esto.

encontré un buen ejemplo aquí.

Otros consejos

Creo smoofra está en el camino correcto;está buscando registrar una tecla de acceso rápido global con X para poder interceptar las pulsaciones de teclas y tomar las medidas adecuadas. xlib es probablemente lo que quieres, y XGrabKey es la función, creo.

Me temo que no es fácil de aprender;Localicé este ejemplo que parece útil: pequeñoWM.También encontré un ejemplo usando Java/JNI (accediendo a la misma función Xlib subyacente).

Deberías mirar el código fuente de xbindkeys.

La programación de Xlib es bastante arcana, la documentación es difícil de encontrar y existen problemas sutiles de portabilidad.Será mejor que copie algún código endurecido por la batalla.

Una forma de hacerlo es hacer que su aplicación escuche en un determinado puerto, o archivo de socket, las solicitudes entrantes.

Luego puede escribir una pequeña aplicación cliente que se conecte a ese puerto o archivo de socket y envíe comandos a la aplicación en ejecución.

Luego puede configurar su administrador de ventanas para vincular ciertas combinaciones de teclas para iniciar su pequeña aplicación cliente.

En UNIX, su acceso a un shell de línea de comandos se realiza a través de un Terminal.Esto se remonta a los días en que la gente accedía a sus grandes ordenadores compartidos literalmente a través de terminales conectados directamente a las máquinas (p. ej.mediante un cable serie).

De hecho, el programa 'xterm' o cualquier derivado que utilice en su sistema UNIX se denomina correctamente emulador de terminal - se comporta (tanto desde su punto de vista como desde el del sistema operativo) como una de esas máquinas terminales anticuadas.

Esto hace que sea un poco complicado manejar la entrada de manera interesante, ya que hay muchos tipos diferentes de terminales y su sistema UNIX debe conocer las capacidades de cada tipo.Estas capacidades se almacenaban tradicionalmente en un termcap archivo, y creo que los sistemas más modernos usan información terminológica en cambio.Intentar

man 5 terminfo

en un sistema Linux para obtener más información.

Ahora, la buena noticia es que no es necesario preocuparse demasiado por las capacidades del terminal, etc.tener una aplicación de línea de comandos que haga cosas interesantes con funciones de entrada o ventanas.Hay una biblioteca maldiciones, eso ayudará.Buscar

man 3 ncurses

en su sistema Linux para obtener más información.Probablemente puedas encontrar un tutorial decente sobre el uso de curses en línea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top