From 1bf3a11208f5cb21ae128cc9aeeb957cc20cc34a Mon Sep 17 00:00:00 2001 From: "N0\\A" Date: Tue, 21 Oct 2025 14:18:26 +0200 Subject: [PATCH] first commit --- core/__pycache__/file_search.cpython-313.pyc | Bin 0 -> 797 bytes core/file_search.py | 8 ++ main.py | 2 + ui/2ktan.png | Bin 0 -> 23615 bytes ui/__pycache__/gui.cpython-313.pyc | Bin 0 -> 5481 bytes ui/__pycache__/ui.cpython-313.pyc | Bin 0 -> 1086 bytes ui/demo/gui.py | 105 +++++++++++++++++++ ui/gui.py | 67 ++++++++++++ ui/pet.png | Bin 0 -> 30973 bytes ui/ui.py | 20 ++++ 10 files changed, 202 insertions(+) create mode 100644 core/__pycache__/file_search.cpython-313.pyc create mode 100644 core/file_search.py create mode 100644 main.py create mode 100644 ui/2ktan.png create mode 100644 ui/__pycache__/gui.cpython-313.pyc create mode 100644 ui/__pycache__/ui.cpython-313.pyc create mode 100644 ui/demo/gui.py create mode 100644 ui/gui.py create mode 100644 ui/pet.png create mode 100644 ui/ui.py diff --git a/core/__pycache__/file_search.cpython-313.pyc b/core/__pycache__/file_search.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..788e35375e9b3471e1c760ef7358619390beca0a GIT binary patch literal 797 zcmYjP&ubGw6rS0g{BSo36{=!lBxyxh(5y&H6eLg@PfC$&i$V$|?oPTJH@jhGR;%<7 zyhu;&rO=~C{R0I51doXkDnr17CvTO2UY$w0#1H0u-+S}sOg{ap^^M04K{eH*J2El zfFlxy%vR2AB_+jD#hQE*;TSYUoT2f5S6qt+ikk#)!BsJ~M4&XK+Z2s-tmeEV#*ce# z9e}1-GgwMo$FP}+tBqW&<}5v)DWM%5tX9v(4PYcUxYBmsEVP|c z5VDdNP}cH&>}>L+w;O~68wy7Z?=halgoK0|7q}8qj>Mz6T*G_4R^UVw6P~1Q#5|uT zUb&v_@=PNNnAgP*Ox z1rE6+e55~pDncKO_3UBwpn9qohkEhE8R^UY`Z$$+xBqtks6I+v9j40TTz*ivJ<3%E z>B?AJJk`oywetIw4_5|D)z8kCdqZurzy4j%9o7zNBfT&{g^92R2ISB*5+o}$S&%_~ zVy;p~rbB!L$4b0k0h`p8-K9)*ngJ G^Zx+jzplyv literal 0 HcmV?d00001 diff --git a/core/file_search.py b/core/file_search.py new file mode 100644 index 0000000..e53c393 --- /dev/null +++ b/core/file_search.py @@ -0,0 +1,8 @@ +import shutil, subprocess, os + +def find(pattern: str, root: str='/'): + path = os.path.expanduser(root) + if shutil.which('fd') is None: + raise RuntimeError("fd not installed") + out = subprocess.check_output(['fd', pattern, path], text=True, errors='ignore') + return out.splitlines() \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..9f5e065 --- /dev/null +++ b/main.py @@ -0,0 +1,2 @@ +from ui import gui +gui.main() \ No newline at end of file diff --git a/ui/2ktan.png b/ui/2ktan.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd28a283f10f76eb458a2f7ec67dbf8b574b11f GIT binary patch literal 23615 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 literal 0 HcmV?d00001 diff --git a/ui/__pycache__/ui.cpython-313.pyc b/ui/__pycache__/ui.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e76decb2d9aa1b2cd2146b88596a10cd13da14dd GIT binary patch literal 1086 zcma)5-A@xi5TEN^+mn{kVyQwT**1PP5^7BPAR!nc&?-uVO9M$snx;M4lXkD(T_x>< zkPwq9i8Llk{{{aWVl~nAe1aF>Dt++P-J=J{gF3mJ-I<;F&2RRj+uz>@R6bt+Ra|xe z95BNcYFpC1Lx*=DfyB+jLr!xbkQ^hR@vDNwPpklBMSxX40`Xn~f&y3IqQVbmFXVb& zYY?dB>EEqz3^Psju}ECJH^-2+E5j0tKPM4L(faXT4CYeYMM(Mpup{lZLsJeL4Z&kS zfCmtyFPyBN)avnn25_1y38%Sd_&IGa=2QHV$HqDx?d~O)wI_2F^Phd3U~+$9=lz47 z+s>i84FB7EfyNdfDlXK6v)GU|WE5qzrj%ryEz1*#a4$5*wVrr@@=6}xFz6!Aqb#l& zMFkhe(1uzq-XyJo3$8@GUQr4yr5dO zbhM^cDXNOkg^x#F#Hrv))gX>Fod~QpaaJ@18-%AEiL<0`$XZk&qRp8&+02S9$;6e# zIt|d-Z9!DXSgfd)WfsS%-^Rj?MI z$?R(CdsJ^J{VLomhuM*fZGCl7(pp}VgU z->x?ow>PPK-?#ipTrmToX006vH(Xylf!)bhlRHx_sqH~#FtnF=n`kB5!E23Kb6~I; z->J72cQ#G`(0=IdXaB^(m2h*$3=X%hzMnthVKmb5fH&N6gLtV+sR0o)8OAu1i8_ft zr)u&z+lWn3^!_H(rfHugy^jT1-$+DWSmgFhzGBw!?)WcMDc#h+~ d!|0LV<4^~I;BC~~{P0&nd^y+QK^Uk$9| literal 0 HcmV?d00001 diff --git a/ui/demo/gui.py b/ui/demo/gui.py new file mode 100644 index 0000000..75a3fb1 --- /dev/null +++ b/ui/demo/gui.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +""" +desktop_pet_x11.py +X11-only: shows a frameless, always-on-top pet using pet.png. +Transparent pixels are click-through via a per-pixel mask (setMask). +""" +import sys +from pathlib import Path +from PySide6 import QtCore, QtGui, QtWidgets + +ASSET = Path(__file__).with_name("pet.png") + + +class PetWindow(QtWidgets.QWidget): + def __init__(self): + super().__init__() + + # Ensure X11 (xcb) — exit if not + platform = QtGui.QGuiApplication.platformName().lower() + if not platform.startswith("xcb"): + raise SystemExit( + f"desktop_pet_x11.py requires X11 (platformName={platform}). Exiting." + ) + + # Window flags: frameless, always-on-top, tool window (no taskbar entry) + flags = ( + QtCore.Qt.FramelessWindowHint + | QtCore.Qt.WindowStaysOnTopHint + | QtCore.Qt.Tool + ) + self.setWindowFlags(flags) + # Let the window be transparent where the PNG is transparent + self.setAttribute(QtCore.Qt.WA_TranslucentBackground) + + # Load pixmap + pix = QtGui.QPixmap(str(ASSET)) + if pix.isNull(): + raise SystemExit(f"Could not load image: {ASSET}") + + # Show pixmap in a label + self.label = QtWidgets.QLabel(self) + self.label.setPixmap(pix) + self.label.resize(pix.size()) + self.resize(pix.size()) + + # Apply per-pixel mask from alpha channel so transparent areas are outside the window shape. + img = pix.toImage() + if img.hasAlphaChannel(): + # createAlphaMask returns a QImage where alpha pixels are white/black (suitable for QBitmap) + mask_img = img.createAlphaMask() + mask = QtGui.QBitmap.fromImage(mask_img) + self.setMask(mask) + else: + # No alpha channel: warn but continue (window will be rectangular and not click-through) + print("Warning: pet.png has no alpha channel; per-pixel click-through unavailable.") + + # System tray + self.tray = QtWidgets.QSystemTrayIcon(self) + # Prefer a small icon; QIcon will scale automatically + self.tray.setIcon(QtGui.QIcon(str(ASSET))) + menu = QtWidgets.QMenu() + menu.addAction("Hide/Show", self.toggle_visible) + menu.addSeparator() + menu.addAction("Quit", QtWidgets.QApplication.quit) + self.tray.setContextMenu(menu) + self.tray.show() + + # Dragging support + self._drag_pos = None + + # Drag only when clicking opaque pixels + def mousePressEvent(self, event: QtGui.QMouseEvent): + if event.button() == QtCore.Qt.LeftButton: + # global pos - top-left -> offset + self._drag_pos = event.globalPosition().toPoint() - self.frameGeometry().topLeft() + event.accept() + elif event.button() == QtCore.Qt.RightButton: + # show tray menu at pointer + self.tray.contextMenu().popup(event.globalPosition().toPoint()) + + def mouseMoveEvent(self, event: QtGui.QMouseEvent): + if self._drag_pos and (event.buttons() & QtCore.Qt.LeftButton): + self.move(event.globalPosition().toPoint() - self._drag_pos) + + def mouseReleaseEvent(self, event: QtGui.QMouseEvent): + self._drag_pos = None + + def toggle_visible(self): + self.setVisible(not self.isVisible()) + + +def main(): + app = QtWidgets.QApplication(sys.argv) + app.setApplicationName("DesktopPetX11") + + pet = PetWindow() + pet.move(200, 200) + pet.show() + + print("Desktop pet started (X11). Transparent pixels are click-through.") + sys.exit(app.exec()) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/ui/gui.py b/ui/gui.py new file mode 100644 index 0000000..08054e0 --- /dev/null +++ b/ui/gui.py @@ -0,0 +1,67 @@ +import sys +from pathlib import Path +from PySide6 import QtCore, QtGui, QtWidgets + +ASSET = Path(__file__).with_name("2ktan.png") + +class MainWindow(QtWidgets.QMainWindow): + def __init__(self): + super().__init__() + + flags = ( + QtCore.Qt.FramelessWindowHint + | QtCore.Qt.WindowStaysOnTopHint + | QtCore.Qt.Tool + ) + + self.setWindowFlags(flags) + self.setAttribute(QtCore.Qt.WA_TranslucentBackground) + pix = QtGui.QPixmap(str(ASSET)) + + self.label = QtWidgets.QLabel(self) + self.label.setPixmap(pix) + self.label.resize(pix.size()) + self.resize(pix.size()) + + img = pix.toImage() + mask_img = img.createAlphaMask() + mask = QtGui.QBitmap.fromImage(mask_img) + self.setMask(mask) + + self.tray = QtWidgets.QSystemTrayIcon(self) + self.tray.setIcon(QtGui.QIcon(str(ASSET))) + menu = QtWidgets.QMenu() + menu.addAction("Hide/Show", self.toggle_visible) + menu.addSeparator() + menu.addAction("Quit", QtWidgets.QApplication.quit) + self.tray.setContextMenu(menu) + self.tray.show() + + self._drag_pos = None + + def mousePressEvent(self, event: QtGui.QMouseEvent): + if event.button() == QtCore.Qt.LeftButton: + self._drag_pos = event.globalPosition().toPoint() - self.frameGeometry().topLeft() + event.accept() + elif event.button() == QtCore.Qt.RightButton: + self.tray.contextMenu().popup(event.globalPosition().toPoint()) + + def mouseMoveEvent(self, event: QtGui.QMouseEvent): + if self._drag_pos and (event.buttons() & QtCore.Qt.LeftButton): + self.move(event.globalPosition().toPoint() - self._drag_pos) + + def mouseReleaseEvent(self, event: QtGui.QMouseEvent): + self._drag_pos = None + + def toggle_visible(self): + self.setVisible(not self.isVisible()) + +def main(): + app = QtWidgets.QApplication(sys.argv) + app.setApplicationName("CLARA") + + pet = MainWindow() + pet.move(200, 200) + pet.show() + + sys.exit(app.exec()) \ No newline at end of file diff --git a/ui/pet.png b/ui/pet.png new file mode 100644 index 0000000000000000000000000000000000000000..629268ed614d649f0840ddbfb9d71c36054dae2a GIT binary patch literal 30973 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