5 Stimmen

Wie erfasse ich rohe Mauseingaben in X11?

Für die Windows-Version meiner Anwendung verwende ich WM_INPUT und registriere das Mausgerät direkt, um möglichst präzise Bewegungen zu erhalten. Wie würde ich das in X11 machen?

3voto

j4x Punkte 3477

Je nach dem von Ihnen verwendeten Framework gibt es verschiedene Möglichkeiten, dies zu tun.

Wenn Sie beabsichtigen, dies mit "Xlib" zu tun, der grundlegendsten Art, für X11 zu programmieren, sollten Sie einen Blick auf Xlib-Handbuch unter besonderer Berücksichtigung von XInput. Ausführlichere Informationen können abgerufen werden, indem man XI2 (XInput Version 2)

Andere Rahmenwerke auf höherer Ebene können die Arbeit erleichtern. Werfen Sie einen Blick auf Qt . Es ist eine der besten GUI-APIs, die ich je gesehen habe.

Sagen Sie uns, wenn Sie mehr brauchen.

3voto

Jose_X Punkte 1014

Hier sind elf Links mit Hinweisen, Ratschlägen und zwei verschiedenen Ansätzen, um rohe Mausbewegungen unter Linux zu erhalten. Link #2 (Python) zeigt die traditionelle Art und Weise, das Mausgerät zu lesen und #1 (C) , #3 (Python) y #4 (C) zeigen die Ereignisse den Weg. Das ps/2-Protokoll wird behandelt in Link #5 . Link #6 ist ein Beispiel für eine Befehlszeile.

Jeder der beiden Ansätze umgeht X (Xlib), indem er den Strom der Deltas in x- und y-Richtung aus einer Gerätetreiberdatei bezieht. Anstelle von Deltas liefert Xlib traditionell nur die Fenster- (oder Bildschirm-) Position, so dass Sie den Zeiger immer wieder vom Rand des Fensters wegbewegen müssen, wenn Sie weiterhin Messwerte in einer bestimmten Richtung erhalten wollen. [Siehe Link #8 für eine kurze Diskussion über den "Warping to center"-Hack, der von vielen Programmen mit X verwendet wird]. Die neue XInput 2.0-Erweiterung ( Link #10 ) bietet jedoch eine X-API, um die Deltas zu erhalten (Sie müssen mindestens -lX11 und -lXi verknüpfen).

Das Wesentliche der beiden Geräteansätze ist Folgendes:

1: Öffnen Sie zum Lesen etwas wie das Gerät "/dev/input/mouse0" oder etwas Ähnliches (es hängt von der Namensgebung Ihrer Distribution ab und auch davon, welche Methode Sie verwenden wollen, /dev/input/event4 für den anderen Ansatz).

2: Lesen Sie daraus. Jedes so viele Byte entspricht einer Mausbewegung. Bei der ps/2-Rohprotokollmethode, z.B. durch Öffnen von mouse[n] wie oben, wollen Sie im Grunde nur das 2. und 3. Byte jeder 3-Byte-Sequenz, wenn Sie sich nur für die x- und y-Bewegung interessieren. Das zweite Byte steht für X, das dritte für Y. Jedes der beiden Bytes ist eine einzelne int8_t (signed 8 bit) Größe. Positives X scheint nach rechts zu gehen, kein Problem; positives Y scheint jedoch nach oben zu gehen (wie in den meisten Mathematikbüchern), während auf einem Bildschirm positives Y normalerweise als von der oberen linken Ecke des Bildschirms nach unten gehend betrachtet wird (im Gegensatz zu von links unten nach oben gehend als Ursprung in einem typischen kartesischen Koordinatensystem).

Sonstige Anmerkungen: Sie sollten open/read statt fopen/getc verwenden, wenn Sie X verwenden (siehe Link #7 und Code in anderen Links). Wenn Sie Maustastenstatus für die ersten 3 Tasten oder wollen die Vorzeichenhaftigkeit von x oder y zu bestätigen, dann schauen Sie sich das erste Byte als gut. (Ich bezweifle, dass ein Überlauf bei normaler "Stream"-Nutzung ein Problem ist, aber diese Bits sind auch da). Wenn Sie auf der Linux-Befehlszeile experimentieren, z.B. ein schnelles "cat" zu "less", werden Sie feststellen, dass die meisten Bewegungen nur aus einer Einheit bestehen (viele ^A ^@ und <FF>). Dies kann davon abhängen, wie die Maus konfiguriert ist und wie leistungsfähig die Maus ist. Link #5 deckt das einfache Protokoll und sogar die Microsoft intellimouse-Standarderweiterung für die Tasten 4 und 5 und das Mausrad ab. Link #11 deckt die Controller-Chips/Logik-Konfiguration für ps/2-Maus oder -Tastatur ab. Es wird erklärt, wie die Maus über diese Schnittstelle konfiguriert wird. Es gibt ein Werkzeug ( Link #9, xdotool ), das Mausklicks simuliert, um die Automatisierung von Fensteraufgaben zu erleichtern. Schließlich müssen Sie möglicherweise Root sein, um direkt von diesen Geräten zu lesen (hängt von Ihrer Distribution ab).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X