Après avoir découvert comment changer le mappage des codes de balayage en codes de clé à l'aide de udev
, voir cette question , je me demandais comment ces codes de clé (ou événements si vous voulez) sont mappés sur le les mesures appropriées.
Ainsi, par exemple, si vous appuyez sur volume up Sur votre clavier, un code de balayage est envoyé. Il sera ensuite converti en code de clé volumeup
. Mais comment ce code de clé est-il intercepté, le volume augmenté et la notification appropriée affichée?
À mon avis, il faut parfois appeler un script, alors j'aimerais savoir où se trouvent ces scripts.
EDIT: Les codes de clé que je mentionne ne doivent pas être confondus avec les codes de clé xev
, mais je suis également intéressé par ceux-ci;)
Ok, trouvé ceci à https://help.ubuntu.com/community/MultimediaKeys
Lorsque vous appuyez sur une touche de votre clavier, le noyau linux génère un scancode brut (si celui-ci est attribué). Chaque scancode peut être mappé sur un code clé. C'est au niveau du noyau. X a un mode de mappage de clés indépendant (quasi) total: X lit la table de codes de clés du noyau au démarrage, puis mappe le code de touches à la table de codes de clés indépendante (identique aux codes de clé du noyau mais différent :)). Ensuite, chaque code clé peut être mappé sur une clé, c'est-à-dire une chaîne représentant une clé ou suggérant une action. Ainsi, pour que nos clés soient pleinement fonctionnelles, elles ont besoin d’un scancode/keycode du noyau, plus d’un keycode X/keysym. Cela peut sembler étrange, mais les développeurs X ont leur raison de garder un mappage clavier séparé du noyau. Ce n'est pas difficile du tout, juste une procédure assez fastidieuse.
Les codes de clé sont donc mappés sur ceux de key, Où sont-ils alors? J'ai trouvé et ai répondu à cette question: Où puis-je trouver une liste de tous les X keysyms ces jours-ci? Puisque nous parlons des clés de volume, elles se trouveraient dans XF86keysym.h
dans le code source- code mentionné dans la réponse.
Dans ce fichier sur mon ordinateur, j'ai trouvé ce qui suit pour le volume:
#define XF86XK_AudioLowerVolume 0x1008FF11 /* Volume control down */
#define XF86XK_AudioMute 0x1008FF12 /* Mute sound from the system */
#define XF86XK_AudioRaiseVolume 0x1008FF13 /* Volume control up */
Étrange… différentes valeurs, il existe peut-être plusieurs systèmes de gestion des clés? http://crunchbang.org/forums/viewtopic.php?id=16656
J'utilise Xubuntu et pour contrôler les touches, je dois mapper les actions manuellement (comme ceci Comment changer les raccourcis clavier sous xubuntu? ). Cependant, les notifications semblent indépendantes, comme si elles prenaient la pression sur la touche et agissaient en conséquence. Cela peut signifier que d'autres programmes sous Ubuntu sont configurés de cette manière, il n'est donc pas nécessaire de mapper les scripts sur les clés.
Je suis donc à peu près sûr que les programmes utilisent maintenant la clé (il n’ya donc pas de scripts à trouver).
Dans Xubuntu, j'avais ce problème avec Pulse Audio et l'utilisation de scripts personnalisés pour modifier le volume. Il semblait que Pulse interceptait la touche Muet, la touche Muet met en sourdine Alsa et PulseAudio, mais active uniquement Alsa permet des solutions intéressantes .
Découvrez ceci à propos de NotifyOSD https://wiki.ubuntu.com/NotifyOSD#Volume_changes
Si vous regardez un de ces diagrammes: https://wiki.ubuntu.com/NotifyOSD#Architecture
Surtout celui-ci:
Cela montre qu'il existe un "auditeur de clés matérielles" qui reçoit la forme DBus ou HAL? Il "récupère ensuite l'élément visuel du système" dans lequel les icônes de son et de luminosité se trouvent dans la source de Notify-OSD, puis crée la bulle à partir de là.
Tout cela est complètement déroutant, mais si je comprends bien (jusqu'à présent):
raw scancode (ex. e016)> keycode (ex. 160)> keysym (ex. XF86AudioMute)> gnome-settings-daemon (ex. augmentation du volume)> Signal DBus> hardware-keys-listener pour notify-osd (ou autre) programme d'écoute)
Dans la plupart des cas, aucun script n'est exécuté. Ils entraînent l'envoi d'événements au gestionnaire de fenêtres ou au démon de configuration. La seule fois où je suis au courant de la création de scripts dans le processus, c'est lorsque vous configurez des liaisons de clé personnalisées. Pour les associations de touches personnalisées, vous pouvez ajouter des lignes de commande (exécutables ou scripts) et les lier à des clés.
Veuillez voir la réponse que j'ai écrite à une question sur la sauvegarde des liaisons de clés dans Ubuntu: Où sont stockés les raccourcis clavier GNOME? J'ai un script qui sauvegarde ou restaure toutes les associations de clés, y compris les associations personnalisées. Si vous exécutez le script, vous pouvez voir où, dans dconf, les associations de clés sont stockées et quelle application est avertie de l'événement de clé.
La réponse concerne les pilotes .
Chaque matériel doit avoir un pilote pour pouvoir interagir avec le système d'exploitation.
Citant (http://www.linuxforu.com/2010/11/understanding-linux-device-drivers/ :
Un pilote conduit, gère, contrôle, dirige et surveille l'entité sous sa commande. Ce que fait un pilote de bus avec un bus, un pilote de périphérique fait avec un périphérique informatique (tout élément connecté à un ordinateur) comme une souris, un clavier, un moniteur, un disque dur, une caméra Web, une horloge, etc.
En outre, un "pilote" peut être une personne ou même un système automatique surveillé par une personne (un système de pilote automatique dans les avions de ligne, par exemple). De même, n matériel spécifique peut être contrôlé par un logiciel (pilote de périphérique) ou par un autre périphérique matériel, qui peut à son tour être géré par un pilote de périphérique logiciel. In Dans ce dernier cas, un tel dispositif de contrôle est communément appelé contrôleur de périphérique. En tant que périphérique lui-même, il a souvent aussi besoin d’un pilote, également appelé pilote de bus.
Un périphérique possède un registre de périphérique qui stocke les bits de contrôle/d'état et les bits de données. Chaque fois que des données doivent être transférées, elles sont généralement envoyées en définissant les bits de données.
Ainsi, chaque fois que vous appuyez sur une touche de votre clavier, des données sont écrites sur le registre. Ces bits sont lus par le pilote de périphérique et l'action appropriée est effectuée. Ceci est la courte explication.
Liens:
Si vous êtes intéressé, je vous recommande de lire cette série sur les pilotes de périphériques, composée de 17 articles bien rédigés par linuxfor: http://www.linuxforu.com/tag/ linux-device-drivers-series / .
Vous pouvez lire le document spécifique contenant les instructions pour écrire un pilote de périphérique pour un clavier USB: http://www.emntech.com/docs/USB_KeyBoard_Driver_eMNTech.pdf
Si vous êtes très enthousiasmé par les pilotes de périphérique Linux, lisez le livre "Pilotes de périphérique Linux" qui est disponible gratuitement au format PDF: http://lwn.net/Kernel/LDD3 /