Puis-je remapper la touche de verrouillage des majuscules pour lire l'audio?

16

J'essaie de réutiliser la clé de verrouillage Caps inutile pour quelque chose d'utile sur 16.04 MATE. J'ai rencontré

setxkbmap -option ctrl:nocaps

pour le désactiver, mais pourrait-il être remappé pour lire / mettre en pause VLC par exemple? Merci pour vos réponses!

2BFrank
la source
Je ne pense pas que cela fonctionnera ... pour un certain nombre de raisons ... par exemple, je pense que Linux considère le verrouillage des majuscules comme un modificateur et non comme une touche distincte. Ce sera probablement la raison pour laquelle vous ne pouvez pas le lier dans VLC. De plus, si vous le désactivez, il est désactivé. Mais vous pouvez jouer sur la ligne de commande et essayer de le lier avec vlc --key-play-pause <key-string>, mais je n'ai pas trouvé de chaîne que VLC accepte comme capslock ...
Robert Riedl
1
J'ai installé dconf-editoressayé quelques choses, installé xdotoolessayé quelques choses et enfin xbindkeyset essayé quelques choses. À la fin de cet exercice infructueux, mon bouton de pause / lecture du clavier était cassé ET mon propre bouton de lecture / pause de l'écran était grisé et la musique ne jouait pas. J'ai fait cela en 16.04, donc j'ai redémarré en 18.04 pour confirmer que tout fonctionne toujours et ce sont les hacks logiciels qui l'ont fait. La seule grâce qui sauve est que je ne joue de la musique que sur un téléphone Android et non sur un PC. Juste un avertissement pour que les autres fassent attention et documentent mieux que moi ce que vous faites à votre machine.
WinEunuuchs2Unix
1
@pbhj Merci pour l'astuce. J'ai réussi à faire fonctionner la lecture / pause à nouveau avec le bouton à l'écran et le bouton de pause / lecture du clavier dans Ubuntu 16.04. Je voulais juste avertir les gens d'éventuels pièges à expérimenter avec ces utilitaires de clavier de bas niveau.
WinEunuuchs2Unix
1
2BFrank: assurez-vous d'accepter l'une des réponses si elle résout votre problème. Puisqu'il y a une prime sur cette question, laisser une réponse non acceptée (et ne pas attribuer manuellement la prime) n'accordera que la moitié de la prime à @Sebastian Stark, car sa réponse est le plus élevé voté.
Nonny Moose
1
@NonnyMoose Merci pour ce commentaire. J'allais le laisser uniquement à la réponse acceptée ou au total de votes le plus élevé, mais je ne savais pas qu'il avait réduit de moitié le prix, donc je vais l'attribuer manuellement au total de votes le plus élevé dans environ deux heures si aucune réponse n'est acceptée.
Chai T. Rex

Réponses:

11

evtest et dbus

Voici une version impliquant un petit script exécuté en arrière-plan. Quelques étapes simples doivent être prises:

  • Installez le evtest programme: sudo apt install evtest. Ce programme est capable de décoder et d'imprimer des événements bruts à partir de la /dev/input/hiérarchie des appareils.

  • Ajoutez votre compte d'utilisateur au groupe input. Déconnectez-vous et reconnectez-vous. (Cela est nécessaire car nous allons lire à partir d'un périphérique sous /dev/input/, qui ne peut normalement être effectué que par root ou les utilisateurs du groupe input. Nous pourrions exécuter le script en tant que root, mais nous devrons alors trouver un moyen de lui dire quel utilisateur instance dbus avec laquelle il doit parler.)

  • Désactivez la touche de verrouillage comme vous l'avez fait ou utilisez la préférence de contrainte correspondante. Cela fonctionnerait également si vous mappiez la touche de verrouillage des majuscules à ctrl, comme beaucoup de gens le font.

  • Stockez le script suivant quelque part, par exemple $HOME/bin/capshacket rendez-le exécutable:

    #!/bin/bash
    
    KEYBOARD=/dev/input/by-path/platform-i8042-serio-0-event-kbd
    EVENT="type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 1"
    
    toggleVLC () {
            dbus-send \
                --type=method_call \
                --dest=org.mpris.MediaPlayer2.vlc \
                /org/mpris/MediaPlayer2 \
                org.mpris.MediaPlayer2.Player.PlayPause
    }
    
    evtest "$KEYBOARD" | \
    while read line
    do
        if [[ "$line" == *"$EVENT" ]]
        then
            toggleVLC
        fi
    done
    

Le script ci-dessus écoutera les événements de votre clavier et exécutera une commande lorsque vous appuyez sur la touche de verrouillage des majuscules. La commande exécutée utilise dbus pour envoyer un événement de lecture / pause à une instance VLC en cours d'exécution. Vous devrez peut-être modifier la KEYBOARDvariable pour pointer vers votre clavier réel, mais il est probable que la valeur ci-dessus fonctionnera.

Si vous préférez que la fonction toggleVLC () soit appelée lorsque vous relâchez la touche de verrouillage, vous pouvez modifier la EVENTvariable dans le script de sorte qu'elle se termine par value 0au lieu de value 1.

En outre, il est possible que pour vous le code de touche de la touche de verrouillage soit différent de 58. Vous pouvez le vérifier en exécutant evtest, regardez la sortie lorsque vous appuyez sur le verrouillage et ajustez la variable EVENT en conséquence. Vous n'avez même pas besoin de faire correspondre le code clé et de définir simplement ÉVÉNEMENT sur (KEY_CAPSLOCK), value 1.

Au lieu d'utiliser le script evtest et ci-dessus, vous pouvez utiliser thd du package triggerhappy (quelque chose comme thd --dump /dev/input/*donnerait une sortie similaire) mais j'ai trouvé cela un peu moins éducatif.

Maintenant, nous créons une unité utilisateur systemd pour démarrer le script automatiquement en arrière-plan:

  • Créez la hiérarchie utilisateur systemd: mkdir -p $HOME/.config/systemd/user

  • Ajoutez le texte suivant au fichier $HOME/.config/systemd/user/capshack.service

    [Unit]
    Description=Abuse capslock key
    
    [Service]
    ExecStart=%h/bin/capshack
    
    [Install]
    WantedBy=default.target
    
  • Activez l'unité de service que vous venez de créer: systemctl --user enable capshack

  • Démarrez le service: systemctl --user start capshack

À partir de maintenant, vous devriez pouvoir basculer la lecture / pause dans VLC en utilisant la touche capslock. Le script d'arrière-plan doit être démarré automatiquement lorsque vous vous connectez.

triggerhappy

Comme déjà mentionné, vous pouvez également utiliser le package triggerhappy pour ce faire. C'est la méthode préférée pour les personnes qui veulent moins jouer avec le système et plutôt comme une solution plus solide.

  • Ajouter un utilisateur au inputgroupe comme ci-dessus

  • Installez le package: sudo apt install triggerhappy

  • Ajoutez une configuration pour triggerhappy à ~/.config/thd/capslock.conf:

    KEY_CAPSLOCK    1   dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause
    
  • Exécutez thd comme ceci: thd --triggers ~/.config/thd/capslock.conf /dev/input/event*

  • Faites fonctionner thd pour votre utilisateur d'une manière similaire à celle déjà décrite pour capshack.

  • Assurez-vous que vous n'avez qu'une des méthodes mentionnées (capshack ou thd) en cours d'exécution, pour ne pas basculer deux fois sur chaque touche.

J'ai testé tout cela le 18.04 sous la session standard et 16.04 mate. Mais il devrait théoriquement également fonctionner sous wayland ou avec d'autres environnements de bureau.

Sebastian Stark
la source
@ WinEunuuchs2Unix merci d'avoir mentionné. Personnellement, je préfère le style plus verbeux de la clause if / then / else complète: elle est plus explicite, elle est plus facile à étendre et elle n'a pas tendance à allonger les lignes. Bien que dans ce cas, cela n'aurait vraiment pas beaucoup d'importance.
Sebastian Stark
Je suis d'accord sur les lignes trop longues. Récemment, j'ai adapté le style de codage à deux lignes avec la première ligne [[ test ]] && \ et la deuxième ligne à quatre espaces en retrait avec <command>un test positif. Je suis entièrement d'accord sur la lisibilité car ma recommandation est étrangère à la plupart des langages de programmation.
WinEunuuchs2Unix
c'est bien ! Bien que je pense que cela triggerhappydevrait être la voie à suivre, car il evtests'agit en fait d'un programme de débogage :)
Robert Riedl
oui, evtest pour apprendre, pour faire :)
Sebastian Stark
... Pour moi de toute façon, le code clé 58 est m, donc ce script ne fonctionne pas. Je recommande de vérifier xmodmap -pke | grep Caps_Lockavant d'utiliser ce script pour vous assurer que le code clé est correct.
Nonny Moose
9

Dans Ubuntu 16.04 après avoir passé des heures à googler et à jouer avec dconf-editoret xbindkeysj'ai trouvé une solution extrêmement simple:

  • Configuration très rapide en 2 minutes
  • Seul xdotool doit être installé
  • Aucun script nécessaire
  • Le verrouillage des majuscules est toujours reconnu mais ne bascule pas la casse
  • Fonctionne avec les paramètres de raccourci personnalisés du clavier Ubuntu standard

Si vous avez besoin du XF86AudioPlaysupport Gnome dont vous avez besoin xdotool(pas nécessaire pour VLC comme le stipule OP):

sudo apt install xdotool

Voici maintenant la partie délicate. Chaque fois que vous appuyez sur la Caps LocKtouche pour basculer la musique entre Lecture et Pause, les lettres majuscules basculent également en marche et en arrêt.

Utilisez cette méthode pour désactiver le basculement du verrouillage des majuscules tout en maintenant la touche active:

setxkbmap -option caps:none

Lecteurs de musique qui adhèrent à Gnome

Ensuite, dans Ubuntu 16.04, accédez à Paramètres >> Clavier >> Raccourcis >> Raccourcis personnalisés :

audio pause-play shortcut.png

  • Définissez le nom surAudio Play
  • Définissez la commande surxdotool key XF86AudioPlay
  • Cliquez ensuite sur le Applybouton

Après avoir ajouté la nouvelle option, la touche de raccourci affectée indique Désactivé . Cliquez sur Désactivé et lorsque vous êtes invité à attribuer une Caps LocKclé, appuyez sur la touche.


Des lecteurs de musique comme VLC

Suivez les étapes pour Gnome dans la section précédente mais pour la commande utilisez plutôt ceci:

qdbus org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause

VLC ne reconnaîtra pas les touches multimédias: comment faire fonctionner les touches multimédias du clavier avec VLC globalement? même lorsqu'il est intégré au clavier. Par conséquent, le raccourci clavier personnalisé vers XF86AudioPlay est inutile avec xdotool.


Définition de raccourcis clavier personnalisés à partir de la ligne de commande

Ce Q&R explique comment définir des raccourcis clavier personnalisés à partir de la ligne de commande: Comment définir des raccourcis clavier personnalisés à partir du terminal?


Désactiver le verrouillage des majuscules en permanence

La prochaine étape consiste à rendre cela setxkbmap -option caps:nonepersistant à travers les redémarrages. Google recherche les résultats dans cette réponse de Terdon: Enregistrer les paramètres setxkbdmap :

Un moyen simple serait d'ajouter la commande à votre $HOME/.profilefichier (vous pouvez la créer si elle n'existe pas):

setxkbmap -option caps:none

Cela devrait le faire fonctionner à chaque fois que vous vous connectez.

Notez que vous devez utiliser $HOME/.profileplutôt que $HOME/.bash_profile, $HOME/.bashrcou un autre fichier similaire. En effet, ce paramètre doit être lu par votre gestionnaire de connexion.

WinEunuuchs2Unix
la source
Simple, élégant, fait le travail: la réponse parfaite pour moi!
Fabby
@Fabby Eh bien, je dois admettre que c'est facile à configurer et à tester et ne nécessite pas de nettoyage de bas niveau ou d'exécuter constamment des scripts. J'ai fait quatre tentatives différentes avant de tomber sur cette méthode. Je ne dirais toujours pas que c'est parfait, mais MERCI! . S'ils me laissent revenir en Europe, je t'achèterai une pinte.
WinEunuuchs2Unix
Fonctionne-t-il avec Wayland?
danzel
@dabzel J'ai bien peur que Wayland ne fonctionne pas setxkbmap -option caps:none. Le programme utilitaire est installé mais Wayland continue de basculer entre les majuscules et les minuscules. Vous pouvez poster une question distincte sur la manière de faire respecter Wayland setxkbmap.
WinEunuuchs2Unix
3

Cette réponse a été testée sur Ubuntu MATE 16.04.4 LTS dans une machine virtuelle (mais le clavier était un clavier USB en mode passthrough, donc cela ne devrait pas faire de différence). Il ne nécessite également aucun logiciel supplémentaire et peut être effectué sur une installation vanilla sans installer de packages, et il est persistant entre les démarrages.

Remap Lock Caps

  1. Modifiez le fichier en /usr/share/X11/xkb/symbols/pctant que root. Faites attention à ne pas vous tromper ici (comme oublier la virgule) car vous ne pourrez peut-être plus utiliser votre clavier si vous le faites. (Devinez ce que j'ai appris à la dure?;)

  2. Commentez la ligne

        key <CAPS> {    [ Caps_Lock     ]   };
    

    en plaçant deux barres obliques ( //) au début de celle-ci.

  3. Ajoutez en dessous la ligne suivante:

        key <CAPS> {    [ XF86AudioPlay, XF86AudioPause ]   };
    
  4. Commentez la ligne

        modifier_map Lock   { Caps_Lock };
    

    de la même manière que ci-dessus.

  5. Redémarrez.

Remarque: (crédit à danzel pour l'avoir signalé) Les mises à jour du package xkb-datapeuvent remplacer ce fichier. Une méthode raisonnablement sûre pour empêcher cela consiste à détourner le chemin à l'aide de dpkg-divert. (Je dis "raisonnablement sûr" car la source en amont de ce fichier n'a pas été modifiée depuis trois ans.)

Méthode alternative

Désactivez manuellement votre touche de verrouillage des majuscules dans les paramètres de disposition de votre clavier, puis utilisez l'approche de cette réponse pour ajouter vos propres remappages de touches.

Problèmes?

Votre touche de verrouillage des majuscules ne verrouille plus les majuscules et elle a été remappée en lecture / pause à ce stade. Vous devriez pouvoir lire et mettre en pause la musique dans VLC maintenant. Si cela fonctionne à ce stade, vous pouvez ignorer le reste de ces instructions.

Cependant, lorsque je l'ai essayé, VLC n'a pas répondu à la touche Lecture / Pause.

Assurez-vous que le raccourci clavier est correctement défini

  1. Ouvrir les raccourcis clavier (Système → Préférences → Matériel → Raccourcis clavier)

  2. Assurez-vous que "Lecture (ou Lecture / Pause)" est réglé sur "XF86AudioPlay"

  3. Si ce n'est pas le cas, cliquez sur la section "Raccourci" et appuyez sur votre nouvelle touche Lecture / Pause pour définir le raccourci. capture d'écran utile

  4. Si cela ne fonctionne toujours pas, redémarrez plusieurs fois pour faire bonne mesure. (C'est en fait ce qui l'a corrigé pour moi.)

Nonny Moose
la source
Cela peut interférer avec les xkboptions, en particulier caps:...celles. En outre, il pourrait être remplacé par des mises à jour du système.
danzel
En effet, cela pourrait. Bon point sur les mises à jour du système, cependant. J'ajouterai une note à ce sujet dans ma réponse. Merci pour les commentaires!
Nonny Moose
Chers tous, wow !! Désolé depuis un moment :-) et je découvre maintenant tous les efforts que vous avez tous mis dans la solution !! J'essaierai la réponse @ WinEunuuchs2Unix et je vous tiendrai au courant. Merci, LLAP !!
2BFrank
@ 2BFrank Par curiosité, avez-vous trouvé une réponse qui a fonctionné?
Nonny Moose
1

Installez xbindkeys, xcape et playerctl . Assurez-vous que xcape(mappage CapsLocksur une clé de rechange comme Alt+F12par xcape -e 'Caps_Lock=Alt_L|F12) et playerctlsont démarrés automatiquement à la connexion, et ajoutez au fichier ~/.xbindkeysrcles deux lignes

"playerctl play-pause"
  Alt + F12
Enno
la source
0

Faites de votre touche de verrouillage une touche de lecture / pause

Cette solution remappera le scancode de votre clé capslock à un code clé différent dans le pilote d'entrée du noyau, dans ce cas, lecture / pause.

Les avantages

  • Pas besoin de modifier les fichiers système existants (un seul nouveau fichier doit être créé)
  • Les applications ne sauront pas qu'il s'agit en fait d'une touche de verrouillage, mais pensent qu'une vraie touche de lecture / pause a été enfoncée
  • Pas besoin de désactiver le verrouillage des majuscules, pas de possibilité de gâcher la xkbconfiguration

Désavantages

  • Doit être fait pour chaque clavier individuellement (ce qui, selon la situation, peut également être un avantage)

Conditions préalables

  • evtest (peut être installé via sudo apt-get install evtest)

Procédure

Dans un terminal, exécutez sudo evtestet sélectionnez votre clavier. S'il n'y a pas de sortie lorsque vous appuyez sur une touche, appuyez sur Ctrl+ Cet essayez un autre appareil. N'oubliez pas le numéro d'événement de l'appareil que vous avez sélectionné, nous en aurons besoin par la suite. Appuyez sur la touche de verrouillage. Certaines lignes comme les suivantes apparaîtront:

Event: time 1529406021.187148, -------------- SYN_REPORT ------------
Event: time 1529406021.218427, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70039
Event: time 1529406021.218427, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 0

Nous avons besoin de la valeur de la MSC_SCANligne précédant la KEY_CAPSLOCKligne. Dans l'exemple ci-dessus, ce serait 70039, mais le scancode de votre clavier est probablement différent.

Exécutez maintenant la commande suivante, mais remplacez le X par le numéro d'événement de périphérique que vous avez utilisé pour la evtestcommande:

grep "" /sys/class/input/eventX/device/id/*

... cela produira bustype,product , vendoret versiondu clavier.

Créez un fichier nommé 65-keyboard-custom.hwdbdans/etc/udev/hwdb.d/ (autorisations root requises) avec le contenu suivant:

evdev:input:b[bustype]v[vendor]p[product]e[version]*
 KEYBOARD_KEY_[scancode]=playpause

...où

  • [bus], [fournisseur], [produit] et [version] ont exactement 4 caractères et les lettres doivent être majuscules
  • [scancode] doit être en minuscules
  • la evdev:...ligne n'a pas d'espace précédent
  • la KEYBOARD_KEY...ligne a exactement un espace précédent

Par exemple:

evdev:input:b0003v046DpC228e0110*
 KEYBOARD_KEY_70039=playpause

Enfin, compilez la nouvelle configuration dans la base de données matérielle:

sudo systemd-hwdb update

Si vous souhaitez appliquer les modifications immédiatement, informez udev:

sudo udevadm trigger

Si vous souhaitez annuler les modifications, supprimez simplement le fichier que vous avez créé et redémarrez.

Vous pouvez trouver des informations plus détaillées dans ma réponse originale sur ce sujet.

danzel
la source
@Nonny Moose c'est pourquoi j'ai écrit "Doit être fait pour chaque clavier individuellement". De plus, vous pouvez spécifier autant de claviers que vous le souhaitez, vous n'avez donc vraiment à le faire que pour chaque nouveau clavier que vous achetez. D'un autre côté, vous pouvez omettre un clavier si vous le souhaitez, par exemple parce qu'il a déjà une touche de lecture / pause physique.
danzel
... Eh bien, je ne faisais pas attention. Je me suis trompé.
Nonny Moose
0

Peut-être en utilisant xbindkeysou XTEvous pourriez le faire. Mais assurez-vous d'abord de ce que sont les codes clés, vous pouvez voir le code de la touche capslock en utilisant la commande xevdans le terminal et en appuyant dessus ( vous pouvez voir le code clé de n'importe quel keu ou bouton de souris, y compris les souris de jeu). Avec le verrouillage des touches et le code clé des boutons de lecture à la main, vous pouvez modifier le fichier confi xbindkeys et y mettre vos modifications. utiliser touch ~/.xbindkeysrcpour créer le fichier de configuration (si le système ne le crée pas automatiquement) etnano ~/.xbindkeysrc pour le modifier. Je l'ai utilisé le mois dernier et ici c'est un exemple. jetez un œil à ces liens qui pourraient vous être très utiles.

https://help.ubuntu.com/community/MultimediaKeys

https://gist.github.com/jbonney/5743509

Remapper un bouton de ma souris de jeu sur une touche du clavier

https://matmunn.me/post/binding-volume-control-mouse-buttons-ubuntu/

Edmilson Gonçalves
la source