Problème de liaison d'un raccourci vers une touche de fonction / multimédia


8

Je veux connecter un script batch à un raccourci. Lorsque je le lie sous Paramètres système> Clavier> Raccourcis, cela fonctionne avec chaque touche, à l'exception de mes touches de luminosité de mon clavier Apple externe.

Les touches de luminosité sont reconnues dans showkey avec les codes de touches 224 et 225 .

sortie 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 

Toutes les suggestions que je peux faire?

Réponses:


6

Solution utilisant halevt

Selon les pages de manuel, il halevts'agit d'un gestionnaire générique pour les événements HAL. Il est obsolète et remplacé par udev, mais comme je n'en sais pas assez, udevje donnerai une halevtsolution.

EDIT: après quelques sueurs sérieuses, j'ai réussi à le faire udev. Voir mon autre réponse .

Je vais utiliser vimpour modifier des fichiers, mais si vous ne savez pas, vimvous pouvez le remplacer par nanoou gedit.

Installer halevt

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

Déterminer quels événements vous souhaitez lier à un script
Arrêtez le halevtdémon qui est déjà en cours d'exécution:

sudo /etc/init.d/halevt stop

Maintenant, voyez si vous halevtpouvez reconnaître les événements des touches que vous souhaitez utiliser, démarrez l'écouteur:

sudo -u halevt halevt -fig:plugdev

Appuyez maintenant sur la touche de fonction de votre clavier à laquelle vous souhaitez lier le script. Je sais que l'OP veut que ses touches de luminosité fonctionnent, alors allons-y. La sortie des touches de luminosité devrait ressembler à ceci:

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)

Vous pouvez voir que les événements brightness-downet brightness-upsont transmis.

Liez l'événement à un script
Modifiez maintenant le fichier /etc/halevt/halevt.xml:

sudo vim /etc/halevt/halevt.xml

et ajoutez les lignes suivantes (je l'ai fait en bas, juste avant </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>

où bien sûr, vous devez passer valueà l'événement que vous avez obtenu de l'écouteur, et execpar la commande que vous souhaitez exécuter.

Accordez à l'utilisateur halevt l'autorisation d'exécuter la commande ou le script
Étant donné que le halevtdémon est exécuté en tant halevtqu'utilisateur, vous devez lui donner l'autorisation de faire ce que vous avez spécifié dans exec.

Exécutez (n'oubliez pas de le remplacer vimpar l'éditeur de votre choix)

sudo EDITOR=vim visudo

et ajoutez les lignes suivantes en bas

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

et enregistrez et quittez.

Assurez-vous que votre script est exécutable

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

Redémarrez le démon halevt

sudo /etc/init.d/halevt start

Et ça devrait marcher!


a parfaitement fonctionné. merci encore pour votre réponse précise.
remi

Vous êtes les bienvenus, voir aussi ma nouvelle réponse en utilisant udev. Mais n'hésitez pas à vous en tenir à l'autre solution, l'important est que ça marche;)
Gerhard Burger

E: Unable to locate package halevtle 14.04.
umpirsky

Depuis Ubuntu 13.10, halevt n'est plus inclus ( packages.ubuntu.com/search?keywords=halevt )
Gerhard Burger

11

Solution utilisant udev

Étant donné que HAL est obsolète et udevest maintenant utilisé, cette approche est préférée à mon autre réponse (bien que je pense que la solution utilisant HAL est plus simple).

Cependant, pour de nombreuses touches de fonction, vous pouvez simplement utiliser Paramètres système> Clavier> Raccourcis pour lier un script, essayez d'abord cela! Cela vous évite bien des ennuis. Par exemple, les touches de luminosité ne fonctionnent pas (je n'ai aucune idée pourquoi pas), donc si vous voulez savoir comment changer le comportement des touches de luminosité, par exemple, lisez la suite.

REMARQUE : si vous utilisez un ordinateur portable Samsung, vous pouvez corriger toutes les touches de fonction (selon le modèle) en installant le samsung-toolspackage à partir de http://www.voria.org/forum/

Ce guide suppose que vous savez utiliser un terminal et utilise l' viméditeur. Si vous ne savez pas vim, remplacez-le dans les commandes par geditou nano.


Déterminer votre clavier

/lib/udev/findkeyboards

devrait imprimer les claviers qui sont connectés à l'ordinateur, dans mon cas

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

Maintenant, il y a deux options:

  • Claviers USB :
    si vous souhaitez remapper votre clavier USB, inspectez-les en exécutant

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

    où vous devez remplacer le 9 dans la déclaration awk par le bon numéro. La sortie doit être similaire à

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

    ce qui indique correctement que mon clavier est géré via mon récepteur USB Logitech (l'entrée / event7 s'est avéré être ma souris Logitech G9 qui a quelques boutons programmables).

  • Clavier d'ordinateur portable :
    Si vous souhaitez remapper votre clavier d'ordinateur portable, vous devez vous rappeler le numéro pour le AT keyboardqui est 4 dans mon cas. Obtenez également les informations dmi pour votre ordinateur portable:

    cat /sys/class/dmi/id/sys_vendor
    

    ce qui est dans mon cas

    SAMSUNG ELECTRONICS CO., LTD.
    

    et

    cat /sys/class/dmi/id/product_name
    

    ce qui est dans mon cas

    305U1A
    

Déterminez votre mappage actuel de vos touches de fonction

Maintenant, nous pouvons déterminer notre mappage de touches actuel en écoutant le clavier (insérer le bon numéro)

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

vous pouvez quitter cette commande en utilisant Escsur le clavier ou Ctrl+ csur un autre clavier.

Si votre écran commence à défiler très fort, appuyez plusieurs fois sur Escet Ctrl+ cet réessayez avec

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

ou, si le problème de défilement persiste

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

Dans le dernier cas, vous aurez toujours le défilement, mais si vous appuyez sur les touches de fonction, elles devraient aller ~/keymap.logoù vous pourrez les lire plus tard.

Maintenant, nous pouvons vérifier le mappage actuel de vos touches de fonction en appuyant dessus, ce qui devrait vous donner une liste comme (c'est mon Fn+ F1à 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

Notez maintenant les codes de scan dont vous souhaitez que le comportement change.


Modification des codes clés des codes de numérisation

Si vous voyez que le code de clé ne couvre clairement pas ce que vous attendez de la clé, vous pouvez regarder /usr/include/linux/input.hsous Clés et boutons pour voir s'il existe un code de clé qui correspond mieux à ce que vous voulez réellement arriver. Les codes clés sont au format KEY_KEYCODEet vous devez écrire la partie après KEY_en minuscules. Parfois, changer cela suffit pour résoudre le problème.

Cependant, les touches de luminosité sont souvent associées au bon code de touche, ce qui ne permet pas de les remapper. Nous devons donc les changer en d'autres codes clés. Nous utiliserons prog1et prog2pour cet exemple car ceux-ci ne sont pas utilisés sur mon ordinateur, mais vous pouvez également les utiliser f13via f24, ou f20via f24si vous avez un clavier Apple doté F1de F19touches.

  1. Créer un keymap personnalisé :
    Créez un fichier de keymap dans le répertoire /lib/udev/keymapsavec un nom approprié, regardez la sortie de ls /lib/udev/keymapspour voir les noms appropriés. Je vais aux custom-brightnessfins de cette question.

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

    et entrez les codes de numérisation des clés que vous souhaitez modifier, suivis des scancodes que vous souhaitez qu'ils aient. Mon custom-brightnessressemble à ceci:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. Créez un fichier de libération de clé personnalisé. Seulement si vous modifiez le clavier de votre ordinateur portable :
    Parfois, l'événement de libération des touches n'est pas envoyé correctement, ce qui entraîne le blocage de l'ordinateur. Pour éviter cela, nous allons également écrire un fichier de libération de clé personnalisé

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

    ce fichier doit contenir les mêmes codes de scan, le mien ressemble

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

Assurez-vous que les nouveaux mappages sont chargés dans les fichiers de règles
Maintenant, nous devons nous assurer que vos mappages sont chargés. Nous pouvons le faire en modifiant /lib/udev/rules.d/95-keymap.rules, il est donc intelligent de faire une sauvegarde

Encore une fois, nous avons deux options:

  • Claviers USB :
    Étant donné que vous avez un clavier USB, vous devez ajouter votre entrée sous LABEL="keyboard_usbcheck"et elle doit être au-delà des autres entrées de votre fabricant de clavier. C'est parce que mon clavier avec

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

    correspond déjà à l'une des règles, sinon il est écrasé.
    Ajoutez la règle suivante, où vous devez modifier le ID_VENDOR_IDet ID_MODEL_IDet le nom de votre image clé de manière appropriée

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • Clavier d'ordinateur portable :
    Si /lib/udev/findkeyboardsvotre clavier d'ordinateur portable a été signalé comme AT keyboardvotre règle devrait être inférieure LABEL="keyboard_vendorcheck", sinon mettez-le sous LABEL="keyboard_modulecheck". Mettez-le à nouveau sous les autres entrées pour le fabricant de votre ordinateur portable. Ajoutez la règle suivante ( SAMSUNG ELECTRONICS CO., LTD.est un peu longue donc j'ai utilisé un caractère générique`)

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

    Maintenant, ajoutez également une règle après l' /lib/udev/rules.d/95-keyboard-force-release.rulesavoir sauvegardée

    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
    

    Sous les autres entrées de votre fabricant, ajoutez

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

Assurez-vous que udev charge les nouvelles règles
Pour charger les nouvelles règles, exécutez

sudo adevadm trigger

REMARQUE: udevadm control --reload-rules(toujours dans les instructions sur de nombreux sites Web) ne fonctionne pas.

Vérifiez maintenant si les règles ont été appliquées avec succès par

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

qui devrait maintenant signaler les touches de luminosité

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

Remapper les clés dans les paramètres système
Si la dernière étape a signalé les codes de clé corrects, soit les clés commencent à fonctionner automatiquement (au cas où elles auraient d'abord eu les mauvais codes de clé).

Pour la luminosité, vous devez toujours lier les touches à un script qui est maintenant possible en utilisant Paramètres système> Clavier> Raccourcis .

Prendre plaisir



Remarques :

  • Si vos clés avaient le mauvais code de clé et ont été corrigées par cette approche, veuillez suivre les instructions de /usr/share/doc/udev/README.keymap.txt.gz(vous pouvez l'ouvrir sans extraire en utilisant zless) et envoyer vos résultats les adresses e-mail mentionnées ici, puis les modifications peuvent être incluses dans la prochaine version. De nombreux utilisateurs en bénéficieront!

  • Un grand merci à cet article utile de Vaidas Jablonskis.


1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directoryaussi$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky

Merci pour votre commentaire, je l'ai examiné et il semble que udev sera fusionné dans systemd et que les paramètres de keymap seront gérés dans hwdb à la place. Selon bbs.archlinux.org/viewtopic.php?id=168720, il est possible d'extraire des claviers de recherche d'une ancienne version de systemd, mais je ne suis pas sûr que le reste de la réponse s'applique toujours ...
Gerhard Burger
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.