Como posso obter coordenadas absolutas do touchpad?

Como posso obter coordenadas absolutas do touchpad?

Pelo que entendi, as versões anteriores do driver Synaptic no Ubuntu tinham um 'modo absoluto' para o trackpad que permitia ao usuário acessar coordenadas absolutas e relativas. No entanto, a Synaptic decidiu removê-lo (não sei por que) e não está mais disponível. Existe alguma maneira de acessar o modo absoluto no Ubuntu 20.04 LTS? Eu gostaria de poder obter essas coordenadas em um programa C/C++, mas aberto a quaisquer outras soluções (Rust, shell script, o que funcionar). Encontrei postagens semelhantes, mas ainda não consigo encontrar uma solução satisfatória. A maioria recomenda o driver evtest que possui o modo absoluto, mas não possui outros recursos (rolagem com 2 dedos, etc.). Estou pensando que voltar para uma versão mais antiga do driver Synaptic pode ajudar, mas queria saber o que estaria perdendo. Quero dizer, há algum recurso importante no driver Synaptic mais recente que o antigo com modo absoluto não possui?

Editar: procurei um pouco mais e encontrei esta página ->http://manpages.ubuntu.com/manpages/bionic/man1/python-evdev.1.html

Ele mostra como usar uma biblioteca Python, evdev, e como usá-la para acessar eventos de entrada do sistema. Seguindo os exemplos, configurei-o para observar os eventos do meu trackpad e ao mover o dedo obtive uma parede inteira de informações que infelizmente não entendi. Notei termos como ABS_X, ABS_Y, mas não consegui entender nada. Independentemente disso, parece que posso acessar muitas informações do trackpad por meio desta biblioteca, incluindo algo relacionado a coordenadas absolutas. Como posso usar essas informações? Alguém pode me mostrar como escrever uma função Python simples usando evdev

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

onde (x,y) representa a posição do meu dedo no trackpad?

Edição 2: Exemplo de saída do evdev monitorando meu trackpad. Alguma dessas coisas pode ser usada para obter coordenadas absolutas?

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

Responder1

Usar

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

Agora você gera o timestampand code, mas valdeve ser sua coordenada, vejahttps://python-evdev.readthedocs.io/en/latest/_modules/evdev/events.html.

Responder2

Desculpe pela resposta tardia. Espero que isso ainda seja pelo menos um pouco útil. De qualquer forma, tenho tentado descobrir isso. Provavelmente, se você seguiu o "tutorial" no link que postou, você terá print(evdev.categorize(event))algo parecido.

Agora não tenho ideia do que categorizar, mas livrar-se da função categorizar parece imprimir o que você está procurando; posição x e y bruta.

from evdev import InputDevice

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

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

A saída de eventé assim:

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

Parece que os códigos 53 e 54 contêm os dados corretos. Para mim, pelo menos. Talvez você precise fazer algumas deduções para descobrir isso por si mesmo. E não tenho ideia se o seu touchpad funciona no evdev da mesma maneira que funciona para mim, então isso pode nem funcionar.

Vou criar um código bem rápido para você copiar e colar:

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)

Aqui. Este código exato definirá xey com suas respectivas coordenadas a cada loop de leitura. Espero poder ajudar, apesar de postar isso um ano depois.

Responder3

baseado na resposta de @Greyson Phipps, criei um script simples para fazer o touchpad se comportar como uma mesa digitalizadora https://github.com/Vaisakhkm2625/touchpaddraw

não é o ideal, pois não sou principalmente um desenvolvedor python e esta é uma solução hacky, mas funciona. funciona apenas em xorg.in wayland (gnome), isso está obtendo 2 cursores, um com absoluto e outro com relativo e saltando entre eles....


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);

informação relacionada