Comment fonctionnent les événements de souris sous Linux?

25

C'est principalement par curiosité, j'essaie de comprendre comment fonctionne la gestion des événements à un bas niveau, alors ne me référez pas à un logiciel qui le fera pour moi.

Si, par exemple, je veux écrire un programme en C / C ++ qui réagit aux clics de souris, je suppose que je dois utiliser un appel système pour accrocher une fonction au noyau, ou peut-être devez-vous simplement vérifier en permanence l'état de la souris, Je ne sais pas.

Je suppose que c'est possible car à peu près tout est possible en C / C ++, étant si bas niveau, je suis surtout intéressé par son fonctionnement, même si je n'aurai probablement jamais à l'implémenter moi-même.

La question est de savoir comment cela fonctionne sous Linux, y a-t-il certains appels système, bibliothèques c, etc.?

cinquante huit
la source

Réponses:

28

Si vous écrivez un programme du monde réel qui utilise la souris sous Linux, vous écrivez probablement une application X, et dans ce cas, vous devez demander au serveur X les événements de souris. Qt , GTK et libsdl sont des bibliothèques C populaires qui fournissent des fonctions pour accéder à la souris, au clavier, aux graphiques, aux minuteurs et à d'autres fonctionnalités nécessaires à l'écriture de programmes GUI. Ncurses est une bibliothèque similaire pour les applications terminales.

Mais si vous explorez votre système ou si vous ne pouvez pas utiliser X pour une raison quelconque, voici comment cela fonctionne à l'interface du noyau.

Une idée centrale de la philosophie UNIX est que "tout est un fichier". Plus précisément, autant de choses que possible doivent être accessibles via les mêmes appels système que ceux que vous utilisez pour travailler avec des fichiers. Et donc l'interface du noyau avec la souris est un fichier de périphérique. Vous pouvez open(), éventuellement appeler poll()ou select()dessus pour voir s'il y a des données entrantes, et read()pour lire les données.

Dans les temps pré-USB, le fichier de périphérique spécifique est souvent un port série, par exemple /dev/ttyS0, ou un port PS / 2, /dev/psaux. Vous avez parlé à la souris en utilisant le protocole matériel intégré à la souris. De nos jours, le /dev/input/*sous-système est préféré, car il fournit un moyen unifié et indépendant de l'appareil de gérer de nombreux appareils d'entrée différents. En particulier, /dev/input/micevous donnera les événements de n'importe quelle souris connectée à votre système et /dev/input/mouseNvous donnera les événements d'une souris particulière. Dans la plupart des distributions Linux modernes, ces fichiers sont créés dynamiquement lorsque vous branchez une souris.

Pour plus d'informations sur ce que vous souhaitez lire ou écrire dans le fichier du périphérique de la souris, vous pouvez commencer par input / input.txt dans la documentation du noyau. Regardez en particulier les sections 3.2.2 (mousedev) et 3.2.4 (evdev), ainsi que les sections 4 et 5.

Jander
la source
8

Généralement, les informations provenant des périphériques matériels sont exposées aux applications via des fichiers de périphérique . Pour les souris, sur les systèmes Linux modernes, le périphérique est /dev/mice(ce périphérique collecte les événements de toutes les souris connectées, il existe également des périphériques correspondant à chaque souris individuelle).

Lorsque vous déplacez ou cliquez sur la souris, la souris envoie un signal électrique à l'ordinateur, ce qui provoque une interruption . Un morceau de code du noyau Linux appelé gestionnaire d'interruption lit à son tour les données d'événement (par exemple, sur quel bouton a été enfoncé) et déclenche une chaîne de notifications à l'intérieur du noyau.

Si une application lit le fichier de périphérique correspondant à ce périphérique, cette application est informée que l'entrée est en attente. Par exemple, si l'application est bloquée lors d'un appel système , l'appel système revient.read

Sur un système typique, il existe un processus de lecture des événements de souris: le serveur X Window . Ce programme gère l'affichage graphique et les périphériques d'entrée. Les applications graphiques individuelles sont ensuite notifiées des événements de souris via un protocole générique d'événement X, qui transporte d'autres types d'événements tels que des pressions de touches, des changements de focus de fenêtre, des changements de visibilité de fenêtre,…

Gilles 'SO- arrête d'être méchant'
la source