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

8

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

Las teclas de brillo se reconocen en showkey con el código 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 lo que puedo hacer?

remi
fuente

Respuestas:

6

Solución usando halevt

Según las páginas del manual, se halevttrata de un controlador genérico para eventos HAL. Está obsoleto y reemplazado por udev, pero como no sé lo suficiente udev, daré una halevtsolución.

EDITAR: después de un sudor serio, logré hacer esto udev. Mira mi otra respuesta .

Lo usaré vimpara editar archivos, pero si no lo sabe vim, puede reemplazarlo por nanoo gedit.

Instalar halevt

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

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

sudo /etc/init.d/halevt stop

Ahora vea si halevtpuede reconocer los eventos de las teclas que desea usar, inicie el oyente:

sudo -u halevt halevt -fig:plugdev

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

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 brightness-downy brightness-up.

Enlace el evento a un script
Ahora edite 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 </halevt:Configuration>):

<halevt:Device match="hal.info.category = input">

    <halevt:Condition name="ButtonPressed" value="brightness-up" exec="sudo /home/user/brightness-script.sh up"/>

    <halevt:Condition name="ButtonPressed" value="brightness-down" exec="sudo /home/user/brightness-script.sh down"/>

</halevt:Device>

donde, por supuesto, debe cambiar valueal evento que recibió del oyente y execmediante el comando que desea ejecutar.

Otorgue al usuario de halevt permiso para ejecutar el comando o la secuencia de comandos.
Dado que el halevtdemonio se ejecuta como halevtusuario, debe otorgarle permiso para hacer lo que especificó exec.

Ejecutar (recuerde reemplazar vimpor el editor de su elección)

sudo EDITOR=vim visudo

y agregue las siguientes líneas en la parte inferior

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

y guardar y salir.

Asegúrese de que su script sea ejecutable

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

Inicie el demonio halevt nuevamente

sudo /etc/init.d/halevt start

¡Y debería estar funcionando!

Gerhard Burger
fuente
funcionó a la perfección. Gracias de nuevo por su respuesta precisa.
remi
De nada, vea también mi nueva respuesta usando udev. Pero siéntase libre de seguir con la otra solución, lo importante es que está funcionando;)
Gerhard Burger
E: Unable to locate package halevtel 14.04.
umpirsky
Desde Ubuntu 13.10 halevt ya no está incluido ( packages.ubuntu.com/search?keywords=halevt )
Gerhard Burger
11

Solución usando udev

Dado que HAL está en desuso y udevahora se usa, 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> Atajos para enlazar un script, ¡intente esto primero! Te ahorra muchos problemas. Por ejemplo, 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 una computadora portátil Samsung, puede reparar todas las teclas de función (según el modelo) instalando el samsung-toolspaquete desde http://www.voria.org/forum/

Este tutorial asume que usted sabe cómo usar una terminal y usa el vimeditor. Si no sabe vim, reemplácelo en los comandos por cualquiera gedito 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 reasignar su teclado USB, inspecciónelos ejecutando

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

    donde debe reemplazar el 9 en la declaración 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
    

    que indica correctamente que mi teclado se maneja a través de mi receptor USB Logitech (entrada / evento7 resultó ser mi mouse Logitech G9 que tiene algunos botones programables).

  • Teclado de la computadora portátil :
    si desea reasignar el teclado de su computadora portátil, debe recordar el número para el AT keyboardque es 4 en mi caso. También obtenga la información de 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 mapeo de teclas actual escuchando el teclado (inserte el número correcto)

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

puede salir de este comando usando Escel teclado o Ctrl+ cen otro teclado.

Si su pantalla comienza a desplazarse hacia abajo con mucha fuerza, presione Escy Ctrl+ cvarias veces e intente nuevamente con

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

o, si aún 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 funciones, deben ir a ~/keymap.logdonde pueda 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+ a F1través de 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.


Cambiar los códigos clave para los códigos de escaneo

Si ve que el código de la llave claramente no cubre lo que espera que haga la llave, puede mirar /usr/include/linux/input.hdebajo de Teclas y botones para ver si hay un código de llave que coincida mejor con lo que realmente quiere que suceda. Los códigos clave están en el formato KEY_KEYCODEy debe escribir la parte posterior KEY_en minúsculas. A veces, cambiar esto es suficiente para resolver el problema.

Sin embargo, las teclas de brillo a menudo tienen el código clave correcto asociado con ellas, y esto es lo que no les permite reasignarlas. Por lo tanto, debemos cambiarlos a otros códigos clave. Vamos a utilizar prog1y prog2para este ejemplo porque estos no están en uso en mi equipo, sin embargo también se puede utilizar f13a través f24o f20por medio f24si tiene un teclado Apple que tiene F1a través de F19las teclas.

  1. Cree un mapa de teclas personalizado : cree
    un archivo de mapa de teclas en el directorio /lib/udev/keymapscon un nombre adecuado, eche un vistazo a la salida de ls /lib/udev/keymapspara ver los nombres adecuados. Voy con custom-brightnessel 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, seguidos de los códigos de escaneo que desea que tengan. Mi custom-brightnessaspecto es este:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. Cree un archivo de liberación de clave personalizado. Solo si está cambiando el teclado de su computadora portátil : a
    veces, el evento de liberación de la tecla 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 estén cargadas en los archivos de reglas.
Ahora debemos asegurarnos de que sus asignaciones estén cargadas. Podemos hacer esto editando /lib/udev/rules.d/95-keymap.rules, por lo que es inteligente hacer una copia de seguridad

Nuevamente tenemos dos opciones:

  • Teclados USB :
    dado que tiene un teclado USB, debe agregar su entrada LABEL="keyboard_usbcheck"y debe estar más allá de 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 el ID_VENDOR_IDy ID_MODEL_IDy el nombre de su mapa de teclas adecuadamente

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • Teclado de la computadora portátil :
    si se /lib/udev/findkeyboardsinforma que el teclado de su computadora portátil AT keyboarddebe ser su regla LABEL="keyboard_vendorcheck", de lo contrario, colóquelo debajo LABEL="keyboard_modulecheck". Nuevamente colóquelo debajo de las otras entradas para el fabricante de su computadora portátil. Agregue la siguiente regla ( SAMSUNG ELECTRONICS CO., LTD.es un poco larga, 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 /lib/udev/rules.d/95-keyboard-force-release.rulesdespué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
    

    De nuevo, 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úrese de que udev cargue las nuevas reglas
Para cargar las nuevas reglas ejecute

sudo adevadm trigger

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

Ahora verifique si las reglas fueron aplicadas con éxito por

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

que ahora debería informar sobre las teclas de brillo

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

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

Para el brillo, todavía tiene que vincular las teclas a un script que ahora es posible usando Configuración del sistema> Teclado> Accesos directos .

Disfrutar



Notas :

  • Si sus claves tenían un código de clave incorrecto y fueron arregladas por este enfoque, siga las instrucciones en /usr/share/doc/udev/README.keymap.txt.gz(puede abrir esto sin extraer el uso zless) y envíe sus resultados a 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 esta útil publicación de Vaidas Jablonskis.

Gerhard Burger
fuente
1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directorytambién$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky
Gracias por su comentario, lo examiné y parece que udev se fusionará con systemd y la configuración del mapa de teclas se administrará en hwdb. De acuerdo con bbs.archlinux.org/viewtopic.php?id=168720 es posible extraer findkeyboards de una versión anterior de systemd, pero no estoy seguro de que el resto de la respuesta aún se aplique ...
Gerhard Burger