¿Cómo se asignan los códigos clave a la acción apropiada?

18

Después de descubrir cómo cambiar la asignación de códigos de escaneo a códigos clave usando udev, vea esta pregunta , me preguntaba cómo esos códigos clave (o eventos, si lo desea) se asignan a la acción adecuada.

Entonces, por ejemplo, si presiona volume upsu teclado, se envía un código de escaneo que luego se convertirá en el volumeupcódigo de la tecla. Pero, ¿cómo se intercepta este código clave, se sube el volumen y se muestra la notificación correspondiente?

Supongo que en algún lugar debe llamarse un guión, por lo que me gustaría saber dónde están esos guiones.

EDITAR: Los códigos clave que menciono no deben confundirse con los códigos clave devueltos xev, pero también estoy interesado en ellos;)

Gerhard Burger
fuente
3
No estoy de acuerdo, por ejemplo, la notificación es muy específica de Ubuntu, por lo que quiero saber cómo se envió la notificación. Mi conjetura es que en algún lugar debe llamarse un guión, así que quiero saber dónde están esos guiones.
Gerhard Burger
2
Esta es una pregunta válida específica de Ubuntu, ya que la forma en que Ubuntu maneja esto ha cambiado en los años IIRC. Es muy interesante saber cuál es la secuencia de eventos en Ubuntu en el evento presionando una tecla de acceso rápido que desencadena acciones apropiadas. Posibles propósitos: controles de brillo personalizados , depuración de problemas de teclas de acceso
rápido
2
@Seth parece anticuado. HAL está en desuso hace mucho tiempo, desde 10.04 . También carece de información sobre cómo se activan las notificaciones de escritorio.
gertvdijk
1
Hoy me encontré con wiki.ubuntu.com/Hotkeys/Troubleshooting , que ofrece algunos buenos consejos (hay un enlace a wiki.ubuntu.com/Hotkeys/Architecture que es muy informativo). Creo que la respuesta de Stephen Ostermiller está en la dirección correcta, pero quiero encontrar esos guiones y poder cambiarlos;)
Gerhard Burger
1
^^ esta información parece estar desactualizada, no hay combinaciones de teclas en gnome-settings-daemon aquí ... Sin embargo, hay muchos éxitos para el brillo en la sección de compiz (supongo que la unidad?) ¿Quién sabe cómo notify-osdfunciona? Creo que ahí es donde se envían las notificaciones de brillo ...
Gerhard Burger

Respuestas:

6

Ok, encontré esto en https://help.ubuntu.com/community/MultimediaKeys

Cuando presiona una tecla en su teclado, el kernel de Linux genera un código de escaneo sin procesar (si está asignado). Cada código de escaneo se puede asignar a un código clave. Esto está al nivel del núcleo. X tiene una forma (cuasi) totalmente independiente de asignación de teclas: X lee la tabla de códigos de clave del núcleo al inicio, luego asigna el código de clave a su tabla de códigos de clave independiente (es lo mismo que los códigos de clave del núcleo pero diferente :)). Luego, cada código clave se puede asignar a un símbolo clave, es decir, una cadena que representa una tecla o sugiere una acción. Por lo tanto, para que nuestras teclas sean completamente funcionales, necesitan un código de escaneo / código clave del núcleo más un código clave X / keyym. Puede parecer extraño, pero los desarrolladores de X tienen su razón para mantener una asignación de teclado separada del núcleo. No es nada difícil, solo un procedimiento bastante tedioso.

Entonces, los códigos clave se asignan a keyym, ¿dónde están los keyym? Encontré y respondí a esta pregunta: ¿Dónde encuentro una lista de todos los X keysyms en estos días? Como estamos hablando de las teclas de volumen, se encontrará XF86keysym.hen el código fuente mencionado en la respuesta.

En ese archivo en mi computadora encontré lo siguiente para el volumen:

#define XF86XK_AudioLowerVolume 0x1008FF11   /* Volume control down        */
#define XF86XK_AudioMute    0x1008FF12   /* Mute sound from the system */
#define XF86XK_AudioRaiseVolume 0x1008FF13   /* Volume control up          */

Extraño ... valores diferentes de cualquier otra cosa, ¿tal vez hay múltiples sistemas para manejar claves? http://crunchbang.org/forums/viewtopic.php?id=16656


Estoy usando Xubuntu, y para controlar las teclas, necesito asignar las acciones manualmente (de esta manera ¿Cómo cambio los atajos de teclado en xubuntu? ). Sin embargo, las notificaciones parecen independientes, como si estuvieran captando la pulsación de teclas y actuando en consecuencia. Puede significar que otros programas en Ubuntu están configurados de esta manera, por lo que no hay necesidad de asignar scripts a las teclas.

Así que estoy bastante seguro de que los programas ahora están recogiendo la clave (por lo que no se encuentran scripts).

En Xubuntu tuve este problema con Pulse Audio y el uso de secuencias de comandos personalizadas para cambiar el volumen, parecía que Pulse estaba interceptando la tecla Silencio , la tecla Silencio silencia Alsa y PulseAudio, pero solo activa Alsa para soluciones interesantes.


Mira esto sobre NotifyOSD https://wiki.ubuntu.com/NotifyOSD#Volume_changes

Si observa estos diagramas: https://wiki.ubuntu.com/NotifyOSD#Architecture

Especialmente este: ingrese la descripción de la imagen aquí

Muestra que hay un "escucha de claves de hardware" que recibe el formulario DBus o HAL? Luego "recupera el elemento visual del sistema", que los iconos de sonido y brillo están en la fuente de Notify-OSD, y luego hace la burbuja desde allí.


Todo esto es una locura confusa, pero por lo que yo entiendo (hasta ahora):

raw scancode (ej. e016)> keycode (ej. 160)> keysym (ej. XF86AudioMute)> gnome-settings-daemon (ej. subir volumen)> señal DBus> hardware-keys-listener para notificar-osd (u otro programa de escucha)

Mateo
fuente
¡Parece que esto está llegando a alguna parte! Marcado como CW desde el principio, así que supongo que todavía estás mejorando. :)
gertvdijk
Sí, necesito investigar un poco más, el diagrama tiene muchos signos de interrogación.
Mateo
¿Por casualidad lo convertiste en una respuesta wiki comunitaria? Tal vez pedirle a un mod que lo deshaga ... Ah, y es muy probable que esos gráficos estén un poco desactualizados, porque HAL está en desuso desde hace mucho tiempo ... Bueno, al menos estamos llegando a algún lado: D
Gerhard Burger
@gertvdijk Lo sé, pero sería una pena para todos los votos a favor que se va a perder;)
Gerhard Burger
1

En la mayoría de los casos, no hay scripts que se ejecuten. Causan que los eventos se envíen al administrador de ventanas o al daemon de configuración. El único momento en que tengo conocimiento de los scripts en el proceso es cuando configura enlaces de teclas personalizados. Para las combinaciones de teclas personalizadas, puede agregar líneas de comando (ejecutables o scripts) y vincularlas a las teclas.

Consulte esta respuesta que escribí a una pregunta sobre cómo realizar copias de seguridad de las combinaciones de teclas en Ubuntu: ¿Dónde se almacenan los métodos abreviados de teclado de GNOME? Tengo un script que respalda o restaura todas las combinaciones de teclas, incluidas las combinaciones de teclas personalizadas. Si ejecuta el script, puede ver dónde se almacenan las combinaciones de teclas en dconf y qué aplicación recibe una notificación sobre el evento clave.

Stephen Ostermiller
fuente
entonces, ¿cómo se activan las notificaciones de escritorio?
Gerhard Burger
Creo que el demonio de configuración de gnomos es responsable de activarlos en el caso del volumen y el brillo, por ejemplo.
Stephen Ostermiller
2
Ejecuté su script, pero todo lo que parece hacer es obtener los accesos directos a los que puede acceder con Configuración del sistema> Teclado> Accesos directos , no encontré ninguna referencia al brillo, por ejemplo.
Gerhard Burger
script genial para obtener claves de shoutcut.
Mateo
0

La respuesta se refiere a los conductores .

Todo hardware debe tener un controlador para interactuar con el sistema operativo.

Citando http://www.linuxforu.com/2010/11/understanding-linux-device-drivers/ :

Un conductor conduce, gestiona, controla, dirige y supervisa la entidad bajo su mando. Lo que hace un controlador de bus con un bus, un controlador de dispositivo lo hace con un dispositivo informático (cualquier pieza de hardware conectada a una computadora) como un mouse, teclado, monitor, disco duro, cámara web, reloj y más.

Además, un "piloto" podría ser una persona o incluso un sistema automático monitoreado por una persona (un sistema de piloto automático en aviones, por ejemplo). Del mismo modo, una pieza específica de hardware podría ser controlada por una pieza de software (un controlador de dispositivo), o podría ser controlada por otro dispositivo de hardware, que a su vez podría ser administrado por un controlador de dispositivo de software. En el último caso, dicho dispositivo de control se denomina comúnmente controlador de dispositivo. Al ser un dispositivo en sí mismo, a menudo también se necesita un controlador, que comúnmente se conoce como controlador de bus.

Un dispositivo tiene un registro de dispositivo que almacena los bits de Control / Estado y los bits de Datos. Cada vez que es necesario transferir algunos datos, generalmente se envían configurando los bits de datos.

Entonces, cada vez que presiona alguna tecla en su teclado, algunos datos se escriben en el registro. El controlador del dispositivo lee esos bits y se realiza la acción adecuada. Esta es la breve explicación.

Enlaces:

verde
fuente
3
Uhm ... no creo que los conductores tengan alguna idea del significado de la tecla que presiono en mi teclado. Algunos dispositivos especiales de teclas de acceso rápido en los portátiles pueden necesitar un controlador para esto, pero esto no cubre las teclas de acceso rápido multimedia regulares como "subir volumen". Esto debe estar cubierto en un área más común del kernel / X / DE. También creo que las referencias son muy amplias sobre la programación del controlador de dispositivo kerner de Linux.
gertvdijk
Creo que para la mayoría de los teclados modernos Ubuntu usa el evdevcontrolador, pero no veo cómo sería útil aquí ...
Gerhard Burger