Linux/C++: /dev/input/event* lesen

Hallo!
Ich habe mal eine kleine Frage bezüglich des Einlesens der Daten von einer Tastatur.
Ich weis, dass sich meine Tastatur in /dev/input/event3 befindet. Nun habe ich versucht, Tastendrücke mittels ifstream abzufangen:
Code:
int main(int argc, char **argv)
{
    std::ifstream in;
    in.open("/dev/input/event3");
    while (true)
    {
        char ch;
        in.get(ch);
        printf("%d\n",ch);
    }
    return 0;
}
Das Programm dient nur dazu, zu sehen, was für Daten bei einem Tastendruck emmittiert werden. Raus kam das: (Tastendruck von 'a')
-102
126
26
75
-39
-71
4
0
4
0
4
0
30
0
0
0
-102
126
26
75
-24
-71
4
0
1
0
30
0
1
0
0
0
-102
126
26
75
-22
-71
4
0
0
0
0
0
0
0
0
0
-102
126
26
75
90
14
6
0
4
0
4
0
30
0
0
0
-102
126
26
75
104
14
6
0
1
0
30
0
0
0
0
0
-102
126
26
75
106
14
6
0
0
0
0
0
0
0
0
0
(das sind übrigens 96 Zeilen, eine Zahl die mir nichts sagt. Vlt. 3*32? ^^)
Wie ist das nun formatiert? Das scheinen mir recht viele Daten für eine Taste...
Außerdem kommt es mir so vor, als wäre die Ausgabe etwas spät, vor Allem wenn ich gerade ein anderes Fenster aktiv habe. Dafür ist es letztendlich gedacht: Tastendrücke abfragen, auch wenn das Programm im Hintergrund ist.

Hoffe, mich kann da jemand aufklären. Thx schonmal im voraus. :)

Edit: Ok, habs jetzt anders gelöst. Nämlich mit dem struct input_event...
 
Zuletzt bearbeitet:
Unter http://www.derkeiler.com/Mailing-Lists/securityfocus/focus-linux/2005-08/0055.html findest du ein praktisches Beispiel, wie man von einem Input-Device direkt lesen kann. Speziell die Funktion read_keys() könnte einige deiner Fragen beantworten. So musst du z.B. bedenken, dass ein Tastendruck aus mehreren Events besteht (Taste wird gedrückt, Taste ist gedrückt, Taste wird losgelassen), wovon der Scancode nur einen Teil darstellt. Jeder dieser Events stellt im Kernel einen Input-Event dar:

Code:
struct input_event {
  struct timeval time;
  unsigned short type;
  unsigned short code;
  unsigned int value;
};

Das sind also mehrere Byte von Daten, die über das Event-Interface laufen. Für Details siehe auch http://www.kernel.org/doc/Documentation/input/input.txt
 
Danke, vor Allem das Beispiel ist sehr gut!

Noch eine kleine Frage hinterher: Wie kann ich verhindern, dass X11 eingaben von einem bestimmten Gerät entgegen nimmt?
Ich habe hier z.B. eine Fernbedienung über USB angeschlossen und wenn ich dort nun die 1 drücke, erscheint im Texteditor auch dementsprechend die 1. (von der Aus-Taste möchte ich mal nicht reden... >.<)
Wie kann ich das verhindern, so dass nur noch mein Programm darauf zugreift?

Mir schwebt da eine sehr gemütliche Bedienung des PC's vor. :)

Edit: Ich habe jetzt Ubuntu Karmic Koala und mir ist aufgefallen, dass die Input devices gar nicht mehr in /etc/X11/xorg.conf stehen. Was ist denn da passiert? Oo
 
Zuletzt bearbeitet:
Xorg erkennt mittlerweile die meisten Geräte automatisch über HAL. Deswegen benötigt er nur noch in Ausnahmefällen überhaupt eine xorg.conf. Details dazu findest du z.B. unter http://wiki.ubuntuusers.de/XServer#Konfiguration-ab-Ubuntu-8-10 Allerdings kannst du dir immernoch selbst eine xorg.conf erzeugen und dort Geräte definieren. Um z.B. das automatische Erkennen von neu angeschlossenen Geräten wie z.B. einer Fernbedienung zu verhindern, kannst du "AutoAddDevices" in der Sektion "ServerFlags" der xorg.conf auf "False" setzen. Ein einzelnes Input-Device für xorg.conf zu deaktivieren dürfte aber schwierig sein, da er ja seine Daten von HAL bekommt. Du könntest es also nur in der HAL-Konfiguration abschalten, womit es aber ggf. auch anderen Programmen, die darauf setzen, nicht mehr zur Verfügung steht.
 
HAL war ein gutes Stichwort, denn HAL ermöglicht es auch bestimmte Geräte zu ignorieren. Diesbezüglich standen auch schon einige vor dem selben Problem wie ich. Siehe dazu:
http://www.lirc.org/html/devinput.html
(auf xorg.conf zu setzen halte ich nicht für so gut, denn das hat hier doch einige Nachteile)

Thx, funktioniert soweit alles, wie es soll. :>
 
Zuletzt bearbeitet:
Zurück
Oben