Maus in Fenster einsperren
-
Hi!
Ich nutze derzeit das aktuelle Ubuntu und das rennt soweit auch wie es soll. Dazu nutze ich 2 Monitore. Nun laufen dank wine auch die ein oder anderen RTS Titel wie z.B. Warcraft 3. Das Problem ist nun, wenn ich das Programm starte (und es läuft mit 2 Monitoren + Compiz Fusion anstandslos
), dass ich (so wie vorhergesehen) die Maus sich auf beiden Bildschirmen frei bewegen lässt.
Da man aber bei RTS Titel sich über die Map bewegt, indem man die Maus an den Fensterrand bewegt habe ich hier ein kleines Problem. Die Maus springt mir immer aus dem Bild.
Also wollte ich mir ein kleines Programm schreiben was mir die Maus einfängt.
Kenne mich zwar auf Linux nicht so sehr aus, aber die XLib sah mir passend dafür aus, also habe ich mich mal eingelesen und das hier zu Stande gebracht:#include <X11/Xlib.h> // Every Xlib program must include this #include <iostream> int main() { Display *dsp = XOpenDisplay( NULL ); if ( !dsp ) { return 1; } int screenNumber = DefaultScreen(dsp); XEvent event; while(true) { /* get info about current pointer position */ XQueryPointer(dsp, RootWindow(dsp, DefaultScreen(dsp)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state); if (event.xbutton.x < 1280) XWarpPointer(dsp, None, DefaultRootWindow(dsp), 0, 0, 0, 0, 1280, event.xbutton.y); std :: cout << "Pos(X,Y): " << event.xbutton.x << "\t" << event.xbutton.y << std :: endl; } XCloseDisplay( dsp ); std :: cin.get(); }
Natürlich ist das noch nichts serienreifes, doch den Zweck an Sich erfüllt es. Alle Mausbewegungen werden erkannt und die Maus wird korrekt zurück bewegt.
Das Dumme ist nur, dass die Maus wirklich zurückbewegt wird, d.h. wenn man die Maus lange genug gegen den imaginären Rand bewegt sehe ich ein flimmern auf dem anderen Monitor.
Wie bekomme ich das gelöst? Muss ich dazu noch tiefer in mein System gehen oder reicht es, wenn ich z.B.: alle MausEvents abfangen würde, bevor diese auf dem Screen gezeichnet werden und dann alle Mausbewegungs-Events außerhalb meines imaginären Fenster ignoriere?
Nur wie mache ich das? Wie würde da ein "Linux-Spieleentwickler" herangehen?^^Gruß
Pille
-
Wenn du ein Doppelfenster hast, musst du die Maus einfach dazwischen stecken und das Fenster schnell schliessen.
Achtung: regelmaessig fuer Futter sorgen!
-
Hm, wie meinst du das? Doppelfenster? Ich kann dir gerade nicht wirklich folgen...
-
Wie wäre es mit man: XGrabPointer?
Manpages schrieb:
If a confine_to window is specified, the pointer is restricted to stay contained in that window. The confine_to window need have no relationship to the grab_window. If the pointer is not initially in the confine_to window, it is warped automatically to the closest edge just before the grab activates and enter/leave events are generated as usual. If the confine_to window is subsequently reconfigured, the pointer is warped automatically, as necessary, to keep it contained in the window.