Maus (Pointer) Geschwindigkeit mit XLib ermitteln



  • Hi,

    ich arbeite Derzeit endlich mit meiner eigenen 3D Engine auch unter GNU/Linux.
    Ein bischen habe ich inzwischen schon von der Eingabe-Funktionalität der XLib in Erfahrung bringen können.

    Allerdings habe ich noch ein Problem, die Maus (in XLib Pointer genannt) Geschwindigkeit zu ermitteln.

    Ich habe das ähnlich wie unter Windows gemacht.
    Ich nehme die aktuelle Maus Position (mit Hilfe der XQueryPointer Funktion) und speicher sie in 'Pos'. Dann rechne ich 'Speed = Pos - LastPos'.
    Wobei 'LastPos' logischer Weise die Letze MausPosition ist. Dann noch 'LastPos = Pos' um wieder die letzte Position für den nächsten Durchlauf fest zu halten.

    Und jetzt kommt mein Problem:
    mit XWarpPointer setze ich die Mouse wieder in die Mitte des Bildschirms.
    Das bedeutet, die Bewegung - und somit die Geschwindigkeit - ist festgehalten worden und dann halt wieder die Maus zurück in die Mitte des Bildschirms.
    Damit man sich z.B. in einem EgoShooter frei drehen kann, ohne, dass die Maus irgendwann an den Rand des Bildschirms gerät.

    Diese Idee funktioniert unter Windows gut. Unter Linux scheint die 'XWarpPointer' Funktion so brutal zu sein, dass da nichts mehr an Geschwindigkeit gemessen werden kann 🤡

    Kann mir einer von euch sagen, wie man das hinbekommt?



  • Wär's da nicht besser, den Pointer zu grabben (XGrabPointer)?
    AFAIR verschwindet dann der Mauszeiger (oder du schaltest ihn manuell aus).
    Den Maus-Input in relativer Bewegung bekommst du ja trotzdem, und das ist die Geschwindigkeit. Dann malst du das Fadenkreuz unabhängig davon.



  • Wenn die Maus mit XGrabPointer verschwindet, löst das aber nicht das Problem, dass die Maus am Rand des Bildschirms 'hängen' bleibt, da die Maus nicht aus dem Bildschirm herausgehen kann (außer man hat mehrere Bildschirme).
    Um das zu verhindern muss ich die Maus doch irgendwie fest positionieren.
    Ob das jetzt in der Mitte ist ist eigentlich edal, damit kann man halt nur die maximal Geschwindigkeit erhöhen und ist halt auch irgendwie sinnvoller als die Maus zerstreut zu positionieren.
    Aber so weit ich weiß (okay, afaik ^^) kann man mit XGrabPointer die Maus nur verstecken?!



  • Ne, wenn du in X11 grabschst, dann kriegt nur noch die Application den Input. Selbst wenn der Mauszeiger dann über den Rand des Programmfensters hinauszeigen sollte, könnte man nichts außerhalb anklicken. Daher kann man den Mauszeigen auch gleich ausblenden und seinen eigenen malen.

    Und mit dem "am Rand klebenbleiben": Du sollst ja auch die relative Bewegung auswerten und nicht die absolute Position.


Anmelden zum Antworten