Added mouse.py
This commit is contained in:
parent
00b5d2d903
commit
05d288f8c5
96
mouse.py
Executable file
96
mouse.py
Executable file
@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env python3
|
||||
import subprocess
|
||||
import time
|
||||
import math
|
||||
import json
|
||||
import pathlib
|
||||
import sys
|
||||
import os
|
||||
|
||||
config_file = pathlib.Path(__file__).parent / "mouse.json"
|
||||
lock_file = pathlib.Path(__file__).parent / "mouse.lock"
|
||||
|
||||
|
||||
def pixels_to_meters(pixels, pixels_per_inch=100):
|
||||
"""
|
||||
Convert pixels to meters based on display pixel density.
|
||||
|
||||
Args:
|
||||
pixels (float): Total pixels traveled.
|
||||
pixels_per_inch (float): Pixels per inch of the display. Default is 100.
|
||||
|
||||
Returns:
|
||||
float: Distance in meters.
|
||||
"""
|
||||
inches_per_meter_x270_laptop = 39.37
|
||||
pixels_per_meter = pixels_per_inch * inches_per_meter_x270_laptop
|
||||
meters = pixels / pixels_per_meter
|
||||
return meters
|
||||
|
||||
|
||||
def get_data():
|
||||
try:
|
||||
with open(config_file,"r") as f:
|
||||
return json.load(f)
|
||||
except:
|
||||
return {}
|
||||
|
||||
def set_data(**kwargs):
|
||||
with open(config_file,"w") as f:
|
||||
json.dump(kwargs,f)
|
||||
|
||||
def get_mouse_position():
|
||||
result = subprocess.run(['xdotool', 'getmouselocation', '--shell'], capture_output=True, text=True)
|
||||
output = result.stdout
|
||||
# Parse x and y from output
|
||||
x = y = 0
|
||||
for line in output.splitlines():
|
||||
if line.startswith('X='):
|
||||
x = int(line.split('=')[1])
|
||||
elif line.startswith('Y='):
|
||||
y = int(line.split('=')[1])
|
||||
return x, y
|
||||
|
||||
positions = []
|
||||
total_distance = get_data().get("total_distance", 0)
|
||||
sampling_interval = get_data().get("sampling_interval", 0.1)
|
||||
|
||||
import sys
|
||||
import os
|
||||
if len(sys.argv) > 1:
|
||||
print("Total traveled in pixels: " + str(total_distance))
|
||||
print("Total traveled in meters: " + str(pixels_to_meters(total_distance)))
|
||||
exit()
|
||||
|
||||
|
||||
|
||||
# Check if lock file exists
|
||||
if lock_file.exists():
|
||||
sys.exit(0)
|
||||
|
||||
# Create lock file
|
||||
lock_file.touch()
|
||||
|
||||
|
||||
|
||||
try:
|
||||
print("Tracking mouse movement. Press Ctrl+C to stop.")
|
||||
while True:
|
||||
x, y = get_mouse_position()
|
||||
positions.append((x, y))
|
||||
if len(positions) > 1:
|
||||
x1, y1 = positions[-2]
|
||||
x2, y2 = positions[-1]
|
||||
dist = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
|
||||
total_distance += dist
|
||||
if len(positions) > 10:
|
||||
positions.pop(0)
|
||||
print("\rDistance traveled: {:.2f} pixels".format(total_distance), end="")
|
||||
time.sleep(sampling_interval)
|
||||
set_data(total_distance=total_distance,sampling_interval=sampling_interval)
|
||||
except KeyboardInterrupt:
|
||||
print(f"\nTotal distance traveled: {total_distance:.2f} pixels")
|
||||
finally:
|
||||
# Remove lock file
|
||||
if lock_file.exists():
|
||||
lock_file.unlink()
|
Loading…
Reference in New Issue
Block a user