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 timestamp
und aus code
, aber val
sollte 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 event
sieht 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);