Wie funktionieren Mausereignisse unter Linux?

25

Dies geschieht hauptsächlich aus Neugier, ich versuche zu verstehen, wie die Ereignisbehandlung auf einer niedrigen Ebene funktioniert. Verweisen Sie mich daher nicht auf eine Software, die dies für mich erledigt.

Wenn ich zum Beispiel ein Programm in C / C ++ schreiben möchte, das auf Mausklicks reagiert, gehe ich davon aus, dass ich einen Systemaufruf verwenden muss, um eine Funktion mit dem Kernel zu verknüpfen, oder Sie müssen nur ständig den Status der Maus überprüfen. Ich weiß es nicht.

Ich nehme an, es ist möglich, da in C / C ++ so ziemlich alles möglich ist. Da ich so niedrig bin, interessiert mich vor allem, wie es funktioniert, auch wenn ich es wahrscheinlich nie selbst implementieren muss.

Die Frage ist, wie es unter Linux funktioniert, gibt es bestimmte Systemaufrufe, C-Bibliotheken usw.?

achtundfünfzig
quelle

Antworten:

28

Wenn Sie ein reales Programm schreiben, das die Maus unter Linux verwendet, schreiben Sie höchstwahrscheinlich eine X-Anwendung. In diesem Fall sollten Sie den X-Server nach Mausereignissen fragen. Qt , GTK und libsdl sind einige beliebte C-Bibliotheken, die Funktionen für den Zugriff auf Maus, Tastatur, Grafik, Timer und andere Funktionen bieten, die zum Schreiben von GUI-Programmen erforderlich sind. Ncurses ist eine ähnliche Bibliothek für Terminalanwendungen.

Aber wenn Sie Ihr System erkunden oder X aus irgendeinem Grund nicht verwenden können, finden Sie hier die Funktionsweise der Kernel-Oberfläche.

Eine Kernidee in der UNIX-Philosophie ist, dass "alles eine Datei ist". Genauer gesagt, so viele Dinge wie möglich sollten über dieselben Systemaufrufe zugänglich sein, die Sie für die Arbeit mit Dateien verwenden. Die Kernel-Schnittstelle zur Maus ist also eine Gerätedatei. Sie können open()es wahlweise anrufen poll()oder select()darauf zugreifen, um zu sehen, ob eingehende Daten vorliegen, und read()um die Daten zu lesen.

In Zeiten vor USB war die spezifische Gerätedatei häufig eine serielle Schnittstelle, z. B. /dev/ttyS0eine PS / 2-Schnittstelle /dev/psaux. Sie haben mit der Maus über das in die Maus integrierte Hardwareprotokoll gesprochen. Heutzutage wird das /dev/input/*Subsystem bevorzugt, da es eine einheitliche, geräteunabhängige Möglichkeit zum Umgang mit vielen verschiedenen Eingabegeräten bietet. Insbesondere erhalten /dev/input/miceSie Ereignisse von jeder an Ihr System angeschlossenen Maus und /dev/input/mouseNEreignisse von einer bestimmten Maus. In den meisten modernen Linux-Distributionen werden diese Dateien dynamisch erstellt, wenn Sie eine Maus anschließen.

Weitere Informationen darüber, was Sie in der Mausgerätedatei lesen oder schreiben würden, finden Sie in der Kerneldokumentation unter input / input.txt . Beachten Sie insbesondere die Abschnitte 3.2.2 (mousedev) und 3.2.4 (evdev) sowie die Abschnitte 4 und 5.

Jander
quelle
8

Im Allgemeinen werden Informationen von Hardwaregeräten über Gerätedateien für Anwendungen verfügbar gemacht . Für Mäuse ist auf modernen Linux-Systemen das Gerät /dev/mice(dieses Gerät sammelt Ereignisse von allen verbundenen Mäusen, es gibt auch Geräte, die jeder einzelnen Maus entsprechen).

Wenn Sie die Maus bewegen oder klicken, sendet die Maus ein elektrisches Signal an den Computer, wodurch ein Interrupt ausgelöst wird . Ein Teil des Codes im Linux-Kernel, der als Interrupt-Handler bezeichnet wird, liest wiederum die Ereignisdaten (z. B. welche Schaltfläche gedrückt wurde) und löst eine Kette von Benachrichtigungen im Kernel aus.

Wenn eine Anwendung aus der Gerätedatei für dieses Gerät liest, wird dieser Anwendung mitgeteilt, dass die Eingabe wartet. Wenn die Anwendung beispielsweise in einem Systemaufruf blockiert ist , wird der Systemaufruf zurückgegeben.read

Auf einem typischen System gibt es einen Prozess zum Lesen von Mausereignissen: den X Window-Server . Dieses Programm verwaltet die grafische Anzeige und Eingabe von Peripheriegeräten. Einzelne grafische Anwendungen werden dann über ein generisches X-Ereignisprotokoll über Mausereignisse informiert, das andere Ereignistypen wie Tastendrücke, Fensterfokusänderungen, Fenstersichtbarkeitsänderungen usw. enthält.

Gilles 'SO - hör auf böse zu sein'
quelle