Wie kann ich absolute Touchpad-Koordinaten erhalten

Wie kann ich absolute Touchpad-Koordinaten erhalten

So wie ich es verstehe, hatten frühere Versionen des Synaptic-Treibers in Ubuntu einen „absoluten Modus“ für das Trackpad, der dem Benutzer den Zugriff auf absolute und relative Koordinaten ermöglichte. Synaptic hat sich jedoch entschieden, diesen zu entfernen (ich weiß nicht, warum) und er ist nicht mehr verfügbar. Gibt es eine Möglichkeit, in Ubuntu 20.04 LTS auf den absoluten Modus zuzugreifen? Ich würde diese Koordinaten gerne in einem C/C++-Programm abrufen können, bin aber offen für alle anderen Lösungen (Rust, Shell-Skript, was auch immer funktioniert). Ich bin auf ähnliche Beiträge gestoßen, kann aber immer noch keine zufriedenstellende Lösung finden. Die meisten empfehlen den evtest-Treiber, der zwar einen absoluten Modus bietet, aber andere Funktionen vermissen lässt (Scrollen mit 2 Fingern usw.). Ich denke, dass es helfen könnte, zu einer älteren Version des Synaptic-Treibers zurückzukehren, wollte aber wissen, was ich dann verpassen würde. Ich meine, gibt es im neueren Synaptic-Treiber wichtige Funktionen, die der alte mit dem absoluten Modus nicht hat?

Edit: Ich habe noch ein bisschen nachgeforscht und bin auf diese Seite gestoßen -->http://manpages.ubuntu.com/manpages/bionic/man1/python-evdev.1.html

Es zeigt, wie man eine Python-Bibliothek, evdev, verwendet und wie man damit auf Systemeingabeereignisse zugreift. Ich folgte den Beispielen und stellte sie so ein, dass sie meine Trackpad-Ereignisse überwachte. Als ich meinen Finger bewegte, bekam ich eine ganze Wand voller Informationen, die ich leider nicht verstand. Mir fielen zwar Begriffe wie ABS_X, ABS_Y auf, aber ich konnte damit nichts anfangen. Trotzdem scheint es, dass ich über diese Bibliothek auf viele Trackpad-Informationen zugreifen kann, darunter auch etwas, das mit absoluten Koordinaten zu tun hat. Wie verwende ich diese Informationen? Kann mir jemand zeigen, wie ich mit evdev eine einfache Python-Funktion schreibe?

def foo():
    ...
    return (x,y)

wobei (x,y) die Position meines Fingers auf dem Trackpad darstellt?

Bearbeitung 2: Beispielausgabe von evdev, das mein Trackpad überwacht. Kann irgendetwas davon verwendet werden, um absolute Koordinaten zu erhalten?

absolute axis event at 1623586006.216310, ABS_MT_TRACKING_ID 
absolute axis event at 1623586006.216310, ABS_MT_POSITION_X 
absolute axis event at 1623586006.216310, ABS_MT_POSITION_Y 
absolute axis event at 1623586006.216310, ABS_MT_PRESSURE 
key event at 1623586006.216310, 330 (BTN_TOUCH), down
absolute axis event at 1623586006.216310, ABS_X 
absolute axis event at 1623586006.216310, ABS_Y 
absolute axis event at 1623586006.216310, ABS_PRESSURE 
key event at 1623586006.216310, 325 (BTN_TOOL_FINGER), down
synchronization event at 1623586006.216310, SYN_REPORT 
absolute axis event at 1623586006.231209, ABS_MT_PRESSURE 
absolute axis event at 1623586006.231209, ABS_PRESSURE

Antwort1

Verwenden

    >>> print(event)
    event at 1337197425.477827, code 04, type 04, val 458792

Gerade jetzt geben Sie timestampund aus code, aber valsollte Ihre Koordinate sein, siehehttps://python-evdev.readthedocs.io/en/latest/_modules/evdev/events.html.

Antwort2

Entschuldigen Sie die verspätete Antwort. Ich hoffe, das ist trotzdem zumindest einigermaßen hilfreich. Wie auch immer, ich habe versucht, das herauszufinden. Wenn Sie dem „Tutorial“ unter dem von Ihnen geposteten Link gefolgt sind, haben Sie höchstwahrscheinlich print(evdev.categorize(event))etwas Ähnliches oder Ähnliches.

Nun habe ich keine Ahnung, was „Kategorisieren“ macht, aber wenn Sie die Kategorisierungsfunktion entfernen, scheint das ausgedruckt zu werden, wonach Sie suchen: die Rohdaten der X- und Y-Position.

from evdev import InputDevice

device = InputDevice('/dev/input/event8')

for event in device.read_loop():
    print(event)

Die Ausgabe eventsieht folgendermaßen aus:

event at 1664686111.342840, code 53, type 03, val 1097
event at 1664686111.342840, code 54, type 03, val 736
event at 1664686111.342840, code 00, type 03, val 1097
event at 1664686111.342840, code 01, type 03, val 736
event at 1664686111.342840, code 05, type 04, val 201000

Es scheint, als ob die Codes 53 und 54 die richtigen Daten enthalten. Zumindest für mich. Sie müssen jedoch möglicherweise einige Schlussfolgerungen ziehen, um das selbst herauszufinden. Und ich habe keine Ahnung, ob Ihr Touchpad in evdev genauso funktioniert wie bei mir, also funktioniert es möglicherweise nicht einmal.

Ich werde mir schnell einen Code ausdenken, den Sie kopieren und einfügen können:

from evdev import InputDevice
#SET THIS TO YOUR DEVICE
device = InputDevice('/dev/input/event8')

x = 0
y = 0

def get_xy_coords(e):
    #you may need to change this number here; i don't know
    if e.code == 53:
        global x
        x = e.value
    #this one too
    if e.code == 54:
        global y
        y = e.value
        

for event in device.read_loop():
    get_xy_coords(event)

Hier. Genau dieser Code setzt x und y bei jeder Leseschleife auf die entsprechenden Koordinaten. Ich hoffe, ich konnte helfen, obwohl ich das erst ein Jahr später poste.

Antwort3

basierend auf der Antwort von @Greyson Phipps habe ich ein einfaches Skript erstellt, mit dem sich das Touchpad wie ein Zeichentablett verhält https://github.com/Vaisakhkm2625/touchpaddraw

nicht ideal, da ich nicht hauptsächlich Python-Entwickler bin und dies eine Hack-Lösung ist, aber es funktioniert. Funktioniert nur in xorg.in Wayland (Gnome), dies erhält 2 Cursor, einen mit absoluten und einen mit relativen Werten und Sprüngen zwischen ihnen …


import math
import os
import time

#get trackpad absolute coords
from evdev import InputDevice
 
import argparse
 
from pynput import mouse
from pynput.mouse import Button
 
# Initialize parser
parser = argparse.ArgumentParser()
 
# Adding optional argument
parser.add_argument("-d", "--device", help = "device (event*)")
 
# Read arguments from command line
args = parser.parse_args()

#SET THIS TO YOUR DEVICE
device = InputDevice('/dev/input/'+ args.device if args.device else 'event7')

touchpad_x_max = 1224
touchpad_y_max = 804

max_x = 1920
max_y = 1080

x = 0
y = 0

def get_xy_coords(e):
    #you may need to change this number here; i don't know
    if e.code == 53:
        global x
        x = e.value
    #this one too
    if e.code == 54:
        global y
        y = e.value
        
def mapFromTo(x,a,b,c,d):
   # y=(x-a)//(b-a)*(d-c)+c
   y=(x-a)/(b-a)*(d-c)+c
   return y

x_pos =0
y_pos =0

mouse_controller = mouse.Controller()
for event in device.read_loop():
    #rows, cols = stdscr.getmaxyx()
    get_xy_coords(event)
    if event.code == 54:
        prev_x_pos = x_pos 
        prev_y_pos = y_pos 
        x_pos =math.floor(mapFromTo(x,0,touchpad_x_max,0,max_x))
        y_pos =math.floor(mapFromTo(y,0,touchpad_y_max,0,max_y))
        if (abs(prev_x_pos-x_pos)>15 or abs(prev_y_pos-y_pos)>15):
            mouse_controller.release(Button.left)
            mouse_controller.position = (x_pos,y_pos);
        mouse_controller.press(Button.left)
        mouse_controller.position = (x_pos,y_pos);

verwandte Informationen