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 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() if lock_file.exists(): sys.exit(0) 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: if lock_file.exists(): lock_file.unlink()