From a4e078bc1964a2908604250126dc4d6324cb094a Mon Sep 17 00:00:00 2001 From: Showdown76py Date: Mon, 19 May 2025 12:51:59 +0200 Subject: [PATCH] tempfix: remove mouse overlay --- ai/compute.py | 79 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 22 deletions(-) diff --git a/ai/compute.py b/ai/compute.py index 78fddfc..728e352 100644 --- a/ai/compute.py +++ b/ai/compute.py @@ -1,7 +1,23 @@ import pyautogui import threading import time, io, base64 +import sys +# Try PyQt5 for transparent, click-through overlay +try: + from PyQt5 import QtWidgets, QtCore, QtGui + PYQT_AVAILABLE = True +except ImportError: import tkinter as tk +import sys +if sys.platform == 'darwin': + try: + from AppKit import NSApplication, NSPanel, NSColor, NSBezierPath, NSView, NSWindowStyleMaskBorderless, NSBackingStoreBuffered, NSStatusWindowLevel, NSWindowCollectionBehaviorCanJoinAllSpaces + COCOA_AVAILABLE = True + except ImportError: + COCOA_AVAILABLE = False +else: + COCOA_AVAILABLE = False + PYQT_AVAILABLE = False from objects.inputs import MouseInput, KeyboardInput, ButtonType from PIL import ImageGrab # type: ignore @@ -17,28 +33,47 @@ def screenshot_to_base64(screenshot: bytes) -> str: return base64.b64encode(screenshot).decode('utf-8') def show_click_indicator(x: int, y: int, duration: float = 2.0, size: int = 50) -> None: - """Display a red circle at (x, y) for the given duration.""" - # Create a top-level window without decorations - root = tk.Tk() - root.overrideredirect(True) - root.attributes('-topmost', True) - # Semi-transparent window and disable to allow click-through - root.attributes('-alpha', 0.5) - try: - root.attributes('-disabled', True) - except Exception: - pass - # Position and size - half = size // 2 - root.geometry(f"{size}x{size}+{x-half}+{y-half}") - # Draw circle on canvas - canvas = tk.Canvas(root, width=size, height=size, highlightthickness=0, bg='white') - canvas.pack() - canvas.create_oval(2, 2, size-2, size-2, outline='red', width=4) - root.update() - # Keep displayed for duration seconds - time.sleep(duration) - root.destroy() + # """Display a red circle at (x, y) for the given duration.""" + # """Try PyQt5 overlay first, else fallback to tkinter.""" + # half = size // 2 + # if PYQT_AVAILABLE: + # # Setup QApplication + # app = QtWidgets.QApplication.instance() or QtWidgets.QApplication(sys.argv) + # # Frameless, transparent, click-through window + # w = QtWidgets.QWidget() + # flags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.Tool + # w.setWindowFlags(flags) + # w.setAttribute(QtCore.Qt.WA_TranslucentBackground) + # w.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents) + # w.setGeometry(x-half, y-half, size, size) + # # Draw circle + # pixmap = QtGui.QPixmap(size, size) + # pixmap.fill(QtCore.Qt.transparent) + # painter = QtGui.QPainter(pixmap) + # pen = QtGui.QPen(QtGui.QColor('red'), 4) + # painter.setPen(pen) + # painter.drawEllipse(2, 2, size-4, size-4) + # painter.end() + # label = QtWidgets.QLabel(w) + # label.setPixmap(pixmap) + # w.show() + # app.processEvents() + # time.sleep(duration) + # w.close() + # else: + # # Fallback tkinter overlay (may intercept clicks) + # root = tk.Tk() + # root.overrideredirect(True) + # root.attributes('-topmost', True) + # root.attributes('-alpha', 0.5) + # root.geometry(f"{size}x{size}+{x-half}+{y-half}") + # canvas = tk.Canvas(root, width=size, height=size, highlightthickness=0, bg='white') + # canvas.pack() + # canvas.create_oval(2, 2, size-2, size-2, outline='red', width=4) + # root.update() + # time.sleep(duration) + # root.destroy() + pass def press_mouse(mouse_input: MouseInput) -> None: """Presses mouse buttons at the given position."""