GNU/Linux >> Tutoriels Linux >  >> Linux

Comment distinguer l'entrée de différents claviers ?

Si vous utilisez Linux, la meilleure façon de distinguer les périphériques d'entrée est d'utiliser l'interface d'événement Linux. Une fois que l'entrée spécifique au matériel d'un périphérique est décodée, elle est convertie en une structure d'événement intermédiaire spécifique à Linux et rendue disponible en lisant un ou plusieurs des périphériques de caractères sous /dev/input/ . Ceci est complètement indépendant du langage de programmation que vous utilisez, soit dit en passant.

Chaque périphérique matériel obtient son propre /dev/input/eventX périphérique, et il existe également des agrégats (par exemple, /dev/input/mice qui représente le mouvement de toutes les souris du système). Votre système peut également avoir /dev/input/by-path et /dev/input/by-id .

Il y a un ioctl appelé EVIOCGNAME qui renvoie le nom de l'appareil sous la forme d'une chaîne lisible par l'homme, ou vous pouvez utiliser quelque chose comme /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse .

Vous ouvrez l'appareil et chaque fois qu'un événement arrive du matériel d'entrée, vous obtenez un paquet de données. Si vous savez lire le C, vous pouvez étudier le fichier /usr/include/linux/input.h qui montre exactement comment ce truc fonctionne. Si ce n'est pas le cas, vous pouvez lire cette question qui fournit toutes les informations dont vous avez besoin.

La bonne chose à propos de l'interface d'événement est que vous découvrez simplement de quel périphérique vous avez besoin et que vous pouvez lire l'entrée de ce périphérique d'entrée uniquement , ignorant tous les autres. Vous recevrez également des notifications sur les touches, les boutons et les commandes que vous n'obtiendriez pas normalement en lisant simplement le flux de caractères "cuit" à partir d'un terminal :même les touches mortes comme Maj , etc.

La mauvaise chose est que l'interface d'événement ne renvoie pas de caractères "cuisinés", elle utilise simplement des codes numériques pour les clés (les codes correspondant à chaque clé se trouvent dans le fichier d'en-tête susmentionné - mais aussi dans la source Python de event.py. Si votre périphérique d'entrée a des touches/boutons inhabituels, vous devrez peut-être expérimenter un peu jusqu'à ce que vous obteniez les bons chiffres.


Une approche alternative (si votre "clavier" n'a pas beaucoup de touches - de nombreux appareils prétendent être des claviers) consiste à appliquer un mappage de touches à chaque clavier spécifiquement et à s'assurer que les touches sont distinguées.

Ceci est décrit ici :https://superuser.com/questions/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only. Le point principal étant le setxkbmap prend un argument de périphérique.

Si vous utilisez l'approche d'entrée brute, lsinput trouvera votre périphérique brut pour vous.


Linux
  1. Comment installer un pilote de périphérique sous Linux

  2. Comment faire en sorte que `date` affiche l'heure d'un fuseau horaire différent ?

  3. Comment exécuter un programme avec un répertoire de travail différent de l'actuel, à partir du shell Linux ?

  4. Comment puis-je faire en sorte que sed lise à partir de l'entrée standard?

  5. en quoi cp -f est-il différent de cp --remove-destination ?

Comment taper emoji sur Linux

Telnet vs SSH :en quoi SSH est-il différent de Telnet ?

Comment mettre à niveau Ubuntu Server vers 20.04 à partir de 18.04

Comment empêcher l'ouverture des fenêtres contextuelles du périphérique MTP impossible à ouvrir ?

Comment supprimer le périphérique de cache de bcache ?

Comment déterminer la version USB 1.1 ou 2.0