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 timestamp
and code
, mas val
deve 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);