Problema al enlazar un acceso directo a una función / tecla multimedia

Quiero conectar un script por lotes a un acceso directo. Cuando lo vinculo en Configuración del sistema> Teclado> Accesos directos , funciona con todas las teclas, excepto las teclas de brillo de mi teclado Apple externo.

Las teclas de brillo se reconocen en showkey con los códigos de clave 224 y 225 .

salida xev:

FocusOut event, serial 41, synthetic NO, window 0x4000001, mode NotifyGrab, detail NotifyAncestor FocusIn event, serial 41, synthetic NO, window 0x4000001, mode NotifyUngrab, detail NotifyAncestor KeymapNotify event, serial 41, synthetic NO, window 0x0, keys: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

¿Alguna sugerencia de que puedo hacer?

    Solución utilizando halevt

    De acuerdo con las páginas del halevt es un controlador genérico para eventos HAL. Está en desuso y es reemplazado por udev , pero como no sé lo suficiente sobre udev , le daré una solución halevt .

    EDIT: después de un poco de sudor grave, me las arreglé para hacer esto en udev . Mira mi otra respuesta .

    vim para editar archivos, pero si no lo conoce, puede reemplazarlo por nano o gedit .

    Instalando halevt

     sudo apt-get update && sudo apt-get install halevt 

    Determinar qué eventos desea vincular a un script
    Detenga el demonio halevt que ya se está ejecutando:

     sudo /etc/init.d/halevt stop 

    Ahora vea si halevt puede reconocer los eventos de las teclas que desea usar, inicie el escucha:

     sudo -u halevt halevt -fig:plugdev 

    Ahora presione la tecla de función en su teclado al que desea enlazar el script. Sé que el OP quiere que sus teclas de brillo funcionen, así que vamos con eso. La salida de las teclas de brillo debería ser algo como esto:

     Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-down) Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-up) 

    Puede ver que se transmiten los eventos de brightness-down y brightness-down .

    Vincular el evento a un script
    Ahora edita el archivo /etc/halevt/halevt.xml :

     sudo vim /etc/halevt/halevt.xml 

    y agregue las siguientes líneas (lo hice en la parte inferior, justo antes de ):

         

    donde, por supuesto, debe cambiar el value del evento que recibió del oyente, y exec con el comando que desea ejecutar.

    Otorgue al usuario halevt permiso para ejecutar el comando o el script
    Dado que el demonio halevt se ejecuta como el usuario halevt , debe darle permiso para hacer lo que especificó en exec .

    Ejecutar (recuerde reemplazar vim por su editor de elección)

     sudo EDITOR=vim visudo 

    y agrega las siguientes líneas en la parte inferior

     halevt ALL=(root) NOPASSWD: /home/user/brightness-script.sh 

    y guardar y salir.

    Asegúrate de que tu script sea ejecutable

     sudo chmod +x /home/user/brightness-script.sh 

    Inicia el demonio halevt de nuevo.

     sudo /etc/init.d/halevt start 

    ¡Y debería estar funcionando!

    Solución utilizando udev

    Dado que HAL está en desuso y ahora se usa udev , este enfoque es preferible a mi otra respuesta (aunque creo que la solución que usa HAL es más simple).

    Sin embargo, para muchas teclas de función, simplemente puede usar Configuración del sistema> Teclado> Accesos directos para enlazar un script, ¡intente esto primero! Te ahorra muchos problemas. Por ejemplo, para las teclas de brillo, esto no funciona (no tengo ni idea de por qué no), así que si quieres saber cómo cambiar el comportamiento de, por ejemplo, las teclas de brillo, sigue leyendo.

    NOTA : Si está ejecutando un portátil Samsung, puede arreglar todas las teclas de función (según el modelo) instalando el paquete samsung-tools desde http://www.voria.org/forum/

    Este howto asume que sabes cómo usar una terminal, y usa el editor vim . Si no sabe vim , sustitúyalo en los comandos con gedit o nano .


    Determinando tu teclado

     /lib/udev/findkeyboards 

    Debería imprimir los teclados que están conectados a la computadora, en mi caso

     USB keyboard: input/event9 USB keyboard: input/event7 AT keyboard: input/event4 

    Ahora hay dos opciones:

    • Teclados USB :
      Si desea volver a asignar su teclado USB, inspeccione ejecutando

       udevadm info --export-db | awk '/event9/' RS="" | grep -P 'ID_(VENDOR|MODEL)(?!_ENC)' 

      donde tienes que reemplazar el 9 en la statement awk por el número correcto. La salida debe ser similar a

       E: ID_MODEL=USB_Receiver E: ID_MODEL_ID=c52b E: ID_VENDOR=Logitech E: ID_VENDOR_ID=046d 

      lo que indica correctamente que mi teclado se maneja a través de mi Receptor USB Logitech (input / event7 resultó ser mi mouse Logitech G9 que tiene algunos botones progtwigbles).

    • Teclado Portátil :
      Si desea volver a asignar el teclado de su computadora portátil, debe recordar el número para el AT keyboard que es 4 en mi caso. También obtenga la información dmi para su computadora portátil:

       cat /sys/class/dmi/id/sys_vendor 

      que es en mi caso

       SAMSUNG ELECTRONICS CO., LTD. 

      y

       cat /sys/class/dmi/id/product_name 

      que es en mi caso

       305U1A 

    Determine su asignación actual de sus teclas de función

    Ahora podemos determinar nuestro mapa de teclas actual escuchando el teclado (inserte el número correcto)

     sudo /lib/udev/keymap -i input/event4 

    puede salir de este comando usando Esc en el teclado, o Ctrl + c en otro teclado.

    Si la pantalla comienza a desplazarse hacia abajo muy fuerte, presione Esc y Ctrl + c varias veces e intente nuevamente con

     sudo /lib/udev/keymap -i input/event4 2> /dev/null 

    o, si todavía tiene el problema de desplazamiento

     sudo /lib/udev/keymap -i input/event4 > ~/keymap.log 

    En el último caso, todavía tendrá el desplazamiento, pero si presiona las teclas de función, deberían ir a ~/keymap.log donde puede leerlas más tarde.

    Ahora podemos verificar la asignación actual de sus teclas de función presionándolas, lo que debería darle una lista como (este es mi Fn + F1 a Fn + F12 ):

     scan code: 0xCE key code: kpplusminus scan code: 0x89 key code: brightnessdown scan code: 0x88 key code: brightnessup scan code: 0x82 key code: switchvideomode scan code: 0xF9 key code: f23 scan code: 0xA0 key code: mute scan code: 0xAE key code: volumedown scan code: 0xB0 key code: volumeup scan code: 0x43 key code: f9 scan code: 0x44 key code: f10 scan code: 0xB3 key code: prog3 scan code: 0x86 key code: wlan 

    Ahora escriba los códigos de escaneo para los que desea que cambie el comportamiento.


    Cambio de los códigos clave para los códigos de escaneo.

    Si ve que el código clave no cubre claramente lo que espera que pueda hacer, puede consultar /usr/include/linux/input.h debajo de Teclas y botones para ver si hay un código clave que coincida mejor con lo que en realidad quieres pasar. Los códigos de clave están en el formato KEY_KEYCODE y debe escribir la parte después de KEY_ en minúscula. A veces, cambiar esto es suficiente para resolver el problema.

    Sin embargo, las teclas de brillo a menudo tienen el código de tecla correcto asociado a ellas, y esto es lo que no les permite ser reasignadas. Así que tenemos que cambiarlos a otros códigos clave. Usaremos prog1 y prog2 para este ejemplo porque no están en uso en mi computadora, sin embargo, también puede usar f13 a f24 , o f20 a f24 si tiene un teclado Apple con teclas F1 a F19 .

    1. Crear un mapa de teclas personalizado :
      Cree un archivo de /lib/udev/keymaps en el directorio /lib/udev/keymaps con un nombre adecuado, eche un vistazo a la salida de ls /lib/udev/keymaps para ver los nombres adecuados. Voy con custom-brightness para el propósito de esta pregunta.

       sudo vim /lib/udev/keymaps/custom-brightness 

      e ingrese los códigos de escaneo de las teclas que desea cambiar seguidas de los códigos de escena que desea que tengan. Mi custom-brightness ve así:

       # /lib/udev/keymaps/custom-brightness 0x89 prog1 0x88 prog2 
    2. Crea un archivo de liberación de clave personalizado. Solo si estas cambiando el teclado de tu laptop :
      A veces, el evento de liberación de clave no se envía correctamente, lo que hace que la computadora se bloquee. Para evitar esto, también escribiremos un archivo de liberación de clave personalizado.

       sudo vim /lib/udev/keymaps/force-release/custom-brightness 

      este archivo debe contener los mismos códigos de escaneo, el mío parece

       # /lib/udev/keymaps/force-release/custom-brightness 0x89 0x88 

    Asegúrese de que las nuevas asignaciones se carguen en los archivos de reglas
    Ahora necesitamos asegurarnos de que sus asignaciones estén cargadas. Podemos hacerlo editando /lib/udev/rules.d/95-keymap.rules , por lo que es inteligente hacer una copia de seguridad

    Nuevamente tenemos dos opciones:

    • Teclados USB :
      Como tiene un teclado USB, debe agregar su entrada en LABEL="keyboard_usbcheck" y debe haber pasado las otras entradas del fabricante de su teclado. Esto es porque mi teclado con

       E: ID_MODEL=USB_Receiver E: ID_MODEL_ID=c52b E: ID_VENDOR=Logitech E: ID_VENDOR_ID=046d 

      ya coincide con una de las reglas, y de lo contrario se sobrescribe.
      Agregue la siguiente regla, donde debe cambiar ID_VENDOR_ID e ID_MODEL_ID y el nombre de su ID_VENDOR_ID ID_MODEL_ID de manera apropiada

       ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness" 
    • Teclado de ordenador portátil :
      Si /lib/udev/findkeyboards reportó el teclado de su computadora portátil como teclado AT keyboard su regla debería ir bajo LABEL="keyboard_vendorcheck" , de lo contrario, coloque bajo LABEL="keyboard_modulecheck" . De nuevo, póngalo en las otras entradas para su fabricante de portátiles. Agregue la siguiente regla ( SAMSUNG ELECTRONICS CO., LTD. Es un poco largo, así que usé un comodín)

       ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keymap $name custom_brightness" 

      Ahora también agregue una regla a /lib/udev/rules.d/95-keyboard-force-release.rules después de hacer una copia de seguridad

       sudo cp /lib/udev/rules.d/95-keyboard-force-release.rules /lib/udev/rules.d/95-keyboard-force-release.rules.bak sudo vim /lib/udev/rules.d/95-keyboard-force-release.rules 

      Nuevamente bajo las otras entradas de su fabricante agregue

       ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keyboard-force-release.sh $devpath custom_test" 

    Asegúrate de que udev carga las nuevas reglas
    Para cargar las nuevas reglas ejecutar

     sudo adevadm trigger 

    NOTA: udevadm control --reload-rules (aún en instrucciones en muchos sitios web) no funciona.

    Ahora compruebe si las reglas se aplicaron con éxito por

     sudo /lib/udev/keymap -i input/event4 

    que ahora debe informar de las teclas de brillo

     scan code: 0x89 key code: prog1 scan code: 0x88 key code: prog2 

    Remapear las teclas en la configuración del sistema
    Si el último paso informó los códigos clave correctos, cualquiera de las teclas comenzará a funcionar automáticamente (en caso de que primero tuvieran los códigos clave incorrectos).

    Para el brillo, aún tiene que enlazar las teclas a una secuencia de comandos que ahora es posible utilizando Configuración del sistema> Teclado> Accesos directos .

    Disfrutar



    Notas :

    • Si sus claves tenían un código de clave incorrecto y fueron corregidas por este enfoque, siga las instrucciones en /usr/share/doc/udev/README.keymap.txt.gz (puede abrir esto sin extraer usando zless ) y envíe sus resultados Las direcciones de correo electrónico mencionadas allí, luego los cambios se pueden incluir en la próxima versión. ¡Muchos usuarios se beneficiarán!

    • Muchas gracias a este útil post por Vaidas Jablonskis.