From 457007f74d17c6238f4831b50781a10cba84549e Mon Sep 17 00:00:00 2001 From: Zacharias-Brohn Date: Wed, 18 Feb 2026 18:53:11 +0100 Subject: [PATCH] binary + installer --- CMakeLists.txt | 3 +- Helpers/Wallpapers.qml | 8 ++ Modules/Lock/Lock.qml | 9 ++ PKGBUILD | 29 +++++ cli/bin/zshell | 5 + cli/dist/zshell-0.1.0-py3-none-any.whl | Bin 0 -> 3913 bytes cli/pyproject.toml | 27 +++++ cli/src/zshell/__init__.py | 14 +++ cli/src/zshell/__main__.py | 4 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 859 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 1859 bytes .../__pycache__/__main__.cpython-314.pyc | Bin 0 -> 259 bytes .../__pycache__/scheme.cpython-313.pyc | Bin 0 -> 5345 bytes .../__pycache__/screenshot.cpython-313.pyc | Bin 0 -> 978 bytes .../__pycache__/shell.cpython-313.pyc | Bin 0 -> 1689 bytes .../__pycache__/wallpaper.cpython-313.pyc | Bin 0 -> 731 bytes cli/src/zshell/subcommands/scheme.py | 113 ++++++++++++++++++ cli/src/zshell/subcommands/screenshot.py | 18 +++ cli/src/zshell/subcommands/shell.py | 26 ++++ cli/src/zshell/subcommands/wallpaper.py | 14 +++ plans/ideas.md | 2 +- 21 files changed, 270 insertions(+), 2 deletions(-) create mode 100644 PKGBUILD create mode 100755 cli/bin/zshell create mode 100644 cli/dist/zshell-0.1.0-py3-none-any.whl create mode 100644 cli/pyproject.toml create mode 100644 cli/src/zshell/__init__.py create mode 100644 cli/src/zshell/__main__.py create mode 100644 cli/src/zshell/__pycache__/__init__.cpython-313.pyc create mode 100644 cli/src/zshell/__pycache__/__init__.cpython-314.pyc create mode 100644 cli/src/zshell/__pycache__/__main__.cpython-314.pyc create mode 100644 cli/src/zshell/subcommands/__pycache__/scheme.cpython-313.pyc create mode 100644 cli/src/zshell/subcommands/__pycache__/screenshot.cpython-313.pyc create mode 100644 cli/src/zshell/subcommands/__pycache__/shell.cpython-313.pyc create mode 100644 cli/src/zshell/subcommands/__pycache__/wallpaper.cpython-313.pyc create mode 100644 cli/src/zshell/subcommands/scheme.py create mode 100644 cli/src/zshell/subcommands/screenshot.py create mode 100644 cli/src/zshell/subcommands/shell.py create mode 100644 cli/src/zshell/subcommands/wallpaper.py diff --git a/CMakeLists.txt b/CMakeLists.txt index bc89f44..302c0df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,10 +7,11 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -set(ENABLE_MODULES "plugin" CACHE STRING "Modules to build/install") +set(ENABLE_MODULES "plugin;shell" CACHE STRING "Modules to build/install") set(INSTALL_LIBDIR "usr/lib/ZShell" CACHE STRING "Library install dir") set(INSTALL_QMLDIR "usr/lib/qt6/qml" CACHE STRING "QML install dir") +set(INSTALL_QSCONFDIR "etc/xdg/quickshell/zshell" CACHE STRING "Quickshell config install dir") add_compile_options( -Wall -Wextra -Wpedantic -Wshadow -Wconversion diff --git a/Helpers/Wallpapers.qml b/Helpers/Wallpapers.qml index 393fb4d..a37e9df 100644 --- a/Helpers/Wallpapers.qml +++ b/Helpers/Wallpapers.qml @@ -41,6 +41,14 @@ Searcher { forward: false }) + IpcHandler { + target: "wallpaper" + + function set(path: string): void { + root.setWallpaper(path); + } + } + FileSystemModel { id: wallpapers diff --git a/Modules/Lock/Lock.qml b/Modules/Lock/Lock.qml index 90b6358..54b41a4 100644 --- a/Modules/Lock/Lock.qml +++ b/Modules/Lock/Lock.qml @@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound import Quickshell import Quickshell.Wayland import Quickshell.Hyprland +import Quickshell.Io import QtQuick import QtQuick.Effects import qs.Components @@ -33,6 +34,14 @@ Scope { lock: lock } + IpcHandler { + target: "lock" + + function lock() { + return lock.locked = true; + } + } + CustomShortcut { name: "lock" description: "Lock the current session" diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 0000000..16b02ca --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,29 @@ +pkgname='zshell' +pkgver=0.1.0 +pkgrel=1 +pkgdesc='The cli for zshell' +arch=('any') +url='https://github.com/Zacharias-Brohn/z-bar-qt' +license=('GPL-3.0-only') +depends=('python' 'python-pillow' 'python-materialyoucolor' 'libnotify' 'swappy' 'dart-sass' + 'app2unit' 'wl-clipboard' 'dconf' 'cliphist') +makedepends=('python-build' 'python-installer' 'python-hatch' 'python-hatch-vcs') +source=("$pkgname::git+$url.git") +sha256sums=('SKIP') + +build() { + cd "${srcdir}/${pkgname}/cli" + python -m build --wheel --no-isolation + + cd .. + cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/ + cmake --build build +} + +package() { + cd "${srcdir}/${pkgname}/cli" + python -m installer --destdir="$pkgdir" dist/*.whl + + cd .. + DESTDIR="$pkgdir" cmake --install build +} diff --git a/cli/bin/zshell b/cli/bin/zshell new file mode 100755 index 0000000..cf03348 --- /dev/null +++ b/cli/bin/zshell @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +cd "$(dirname $0)/../src" || exit + +python3 -m zshell "$@" diff --git a/cli/dist/zshell-0.1.0-py3-none-any.whl b/cli/dist/zshell-0.1.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..99281d0f55e706b9e2102cf544e590c2540a1eca GIT binary patch literal 3913 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 literal 0 HcmV?d00001 diff --git a/cli/pyproject.toml b/cli/pyproject.toml new file mode 100644 index 0000000..a234745 --- /dev/null +++ b/cli/pyproject.toml @@ -0,0 +1,27 @@ +[build-system] +requires = ["hatchling >= 1.26"] +build-backend = "hatchling.build" + +[project] +name = "zshell" +requires-python = ">=3.13" +version = "0.1.0" +dependencies = [ + "typer", + "pillow", + "materialyoucolor" +] + +[project.scripts] +zshell-cli = "zshell:main" + +[tool.hatch.version] +source = "vcs" + +[tool.hatch.build.targets.sdist] +only-include = [ + "src", +] + +[tool.ruff] +line-length = 120 diff --git a/cli/src/zshell/__init__.py b/cli/src/zshell/__init__.py new file mode 100644 index 0000000..2dee338 --- /dev/null +++ b/cli/src/zshell/__init__.py @@ -0,0 +1,14 @@ +from __future__ import annotations +import typer +from zshell.subcommands import shell, scheme, screenshot, wallpaper + +app = typer.Typer() + +app.add_typer(shell.app, name="shell") +app.add_typer(scheme.app, name="scheme") +app.add_typer(screenshot.app, name="screenshot") +app.add_typer(wallpaper.app, name="wallpaper") + + +def main() -> None: + app() diff --git a/cli/src/zshell/__main__.py b/cli/src/zshell/__main__.py new file mode 100644 index 0000000..868d99e --- /dev/null +++ b/cli/src/zshell/__main__.py @@ -0,0 +1,4 @@ +from . import main + +if __name__ == "__main__": + main() diff --git a/cli/src/zshell/__pycache__/__init__.cpython-313.pyc b/cli/src/zshell/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bf89ada1c3a1c0b370f04e0b6196a0610baef48 GIT binary patch literal 859 zcmaJ<&x_MQ6rM>Y$@WJ?78LPR_8=DB#)}7K@v?}}LXpOk7D6_iZPQIA**7V=Jyk{4 zo_Z?maj*V4;zdTqf+r7xP`o>nZY)UI2Q%+`-{gDw=Eu^u%SguJ*F1cV5&EHuB8(Nl z%e!)Aj$Gv87HVR^HHEd72Aa%zOK%b&O#_Uk31-s*tA@H-=W5Yrop;dvivmjBQs>%w zr9fTM*)H%pyTmmfXtL{Ojj>TK@(oHlZQ0Z&+%1>p!jzz_1 zEXn*VOc-z1i7@zpMv*XiFrYCNWgY;fj1Q7blwSH#l=>+JAS*FpeoR5#0+?#D}%-aUq@#C1)WK(i4r zLD~tU^{Oa)-r-0x)bl`^MZ(BVNKbF&P9b^0r?R-Ji?`Z!M+FzKJ)1x;>Z{vx+ zK>Dfu+I~-G;WRw!PwbEA*5?cEa5kI{&t56+cEJs2Y|75}6nC%S!dX0x&+jO%@yEot HoLl+}k36j{ literal 0 HcmV?d00001 diff --git a/cli/src/zshell/__pycache__/__init__.cpython-314.pyc b/cli/src/zshell/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d26b5cbca33e23dbbba9bc4cd95391899c3f13a1 GIT binary patch literal 1859 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 Ky~7fc9`%2|=Iw9* literal 0 HcmV?d00001 diff --git a/cli/src/zshell/subcommands/__pycache__/screenshot.cpython-313.pyc b/cli/src/zshell/subcommands/__pycache__/screenshot.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..043fc1df55b2e6a5d932ad16cb9504f6c6f86496 GIT binary patch literal 978 zcmc&zF>ljA6u$G>PDqoM(u#pl1YN2~1T&!Z3aU3eAcZ`urO$o(e{Lh4DTKJ;8Di8 zAkgay-GK(5piu28_N=DYVOHOvP3u`JcnRJcMgwm3i$@L=PXmj(EsF!S<|-}OjC!4p z(>>-Er@&a3H@)DIe^?0Q2QFG(1nZ~F4EdS3ldy4=3pdcQl~AMbrydpKRc z`)=o&;Prdc2V3K`@(R<(rI28w46AbCf4EIhj|x%>(h@{Q-Q-iLu+QqC9xY@Q+*F{B z2)87NY^3`2NmK{7<XHFDvoZw7jFlSE9~^G~`roBRKOJfNCg=y7C2ad|#yE zFA&{zwCA6vN>@7GanEJDke7?)e}?!A2{VE*zCx>4DElR~G0;DoOT+eg`=T=-GZSgX eF#k4xv2m?wxEvCst<01+%lww9L>W~xKkQEidBfQN literal 0 HcmV?d00001 diff --git a/cli/src/zshell/subcommands/__pycache__/shell.cpython-313.pyc b/cli/src/zshell/subcommands/__pycache__/shell.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b611f82824a920f4f8a6a0d5dfa095c6a13d6b2b GIT binary patch literal 1689 zcmb_c%}*0S6rb6h-G1<;f?p64LWt66Sz`bLF__4QCMKn_l?x2j>ZMV#pC_Nz@ zxJn{Py>U{wapX_%N_rbEL`{r0O#K6Vv)yfLMH-@$%x~W8d-LY^K4!~pZ9xQM^4m^o zKtSjV-*|(#LirX(Xa}iC#m^9}te9d2slszig+)9kdq-+(KN@j2lq{0DmYT+sJiRJ* z*KFk`wgHta`i2En>PE|C8GAmczsWhd?v6kcTVI`Ru!*g|&bB3iL&5Jnyhuo7!irrG z!a9=+cG56S-3yzq5=;?hc>-VuEdW-=9Mqt3^rHo@5>NpJhrvJu!+8Zblg|_o616k{3Tr)COR)=P)j%p&J@aZCnc!368CmN(oL9@b{seuZ_W7G$x zGyo97^b#yKr_e_`0GVXxHJYbaKyKx#9)P+)KHPkN|DfwYKI(jMm@knjCz`WsIRhsz z5<-ozTT@XbZcU{K6H_^z5j$zUs^d@F;0}j^L!MscTMkZCy&%+4FOC#%Z%^#b?>;^1 zyn8TJB4g)}|38f=npWZ*y4N{f4qY(+Xc>p@URQ|>ox^h;PX1exy=1#9Q6)F&a)feT zjOdzaGGbbK`kYw0!IW~i0n@$%@YmGKd#`!>j2;dibw2(CZ(`O7Fob79t(5<~sA`&`IxpXQcL8@t{@!Qx> hgz+@4noQ#coAIh@yg{Q>HA;gfTJgs(k76e|zW_d+6(Rrt literal 0 HcmV?d00001 diff --git a/cli/src/zshell/subcommands/__pycache__/wallpaper.cpython-313.pyc b/cli/src/zshell/subcommands/__pycache__/wallpaper.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe1b0a80ce362ba64de4597d48828b803a48fab8 GIT binary patch literal 731 zcmY*X&ubGw6n-^6$_zetCs{}GhLE2n`S$+L7Ica z_K<4@13l)b|A|*`VR{jN96Sgq`wuv?*#vxt_kG`cZ{NN*Gf_G{1IoVs?bXr<;HMU2 zBMFJ#E7Ai89JB{~goq=h@g9CjILQD7hrB}ED4{~!Z`@*pYp{_7xK*+W3;$=e8s{CO zL~__MZ^Mx>j`67qvaLV5EN>%e?7LyrCK8{BHqJ6>wMEtQeL4Nk_5HvNJkHc26EhXl zi$rgg>p^jnDBua5kTob8W8ol*vPw8OL6V>`!q<>!)3LU21}b2u@{-g7CJm-W;gM{2cWe79!1^|ShUqeF%kV6(gOVdZ>vh%wqh7r6*DMg;J}bsUQS F@eg_3pC14K literal 0 HcmV?d00001 diff --git a/cli/src/zshell/subcommands/scheme.py b/cli/src/zshell/subcommands/scheme.py new file mode 100644 index 0000000..3ab34dd --- /dev/null +++ b/cli/src/zshell/subcommands/scheme.py @@ -0,0 +1,113 @@ +from typing import Annotated +import typer +import json + +from pathlib import Path +from PIL import Image +from materialyoucolor.quantize import QuantizeCelebi +from materialyoucolor.score.score import Score +from materialyoucolor.dynamiccolor.material_dynamic_colors import MaterialDynamicColors +from materialyoucolor.hct.hct import Hct + +app = typer.Typer() + + +@app.command() +def generate( + path: Annotated[ + Path, + typer.Option(), + ], + output: Annotated[ + Path, + typer.Option(), + ], + thumbnail: Annotated[ + Path, + typer.Option(), + ], + scheme: Annotated[ + str, + typer.Option() + ] +): + match scheme: + case "fruit-salad": + from materialyoucolor.scheme.scheme_fruit_salad import SchemeFruitSalad as Scheme + case 'expressive': + from materialyoucolor.scheme.scheme_expressive import SchemeExpressive as Scheme + case 'monochrome': + from materialyoucolor.scheme.scheme_monochrome import SchemeMonochrome as Scheme + case 'rainbow': + from materialyoucolor.scheme.scheme_rainbow import SchemeRainbow as Scheme + case 'tonal-spot': + from materialyoucolor.scheme.scheme_tonal_spot import SchemeTonalSpot as Scheme + case 'neutral': + from materialyoucolor.scheme.scheme_neutral import SchemeNeutral as Scheme + case 'fidelity': + from materialyoucolor.scheme.scheme_fidelity import SchemeFidelity as Scheme + case 'content': + from materialyoucolor.scheme.scheme_content import SchemeContent as Scheme + case 'vibrant': + from materialyoucolor.scheme.scheme_vibrant import SchemeVibrant as Scheme + case _: + from materialyoucolor.scheme.scheme_fruit_salad import SchemeFruitSalad as Scheme + + def generate_thumbnail(image_path, thumbnail_path, size=(128, 128)): + thumbnail_file = Path(thumbnail_path) + + image = Image.open(image_path) + image = image.convert("RGB") + image.thumbnail(size, Image.NEAREST) + + thumbnail_file.parent.mkdir(parents=True, exist_ok=True) + image.save(thumbnail_path, "JPEG") + + def generate_color_scheme(thumbnail_path, output_path): + image = Image.open(thumbnail_path) + pixel_len = image.width * image.height + image_data = image.getdata() + + quality = 1 + pixel_array = [image_data[_] for _ in range(0, pixel_len, quality)] + + result = QuantizeCelebi(pixel_array, 128) + score = Score.score(result)[0] + + scheme = Scheme( + Hct.from_int(score), + True, + 0.0 + ) + + color_dict = {} + for color in vars(MaterialDynamicColors).keys(): + color_name = getattr(MaterialDynamicColors, color) + if hasattr(color_name, "get_hct"): + color_int = color_name.get_hct(scheme).to_int() + color_dict[color] = int_to_hex(color_int) + + output_dict = { + "name": "dynamic", + "flavour": "default", + "mode": "dark", + "variant": "tonalspot", + "colors": color_dict + } + + output_file = Path(output_path) + output_file.parent.mkdir(parents=True, exist_ok=True) + + with open(output_file, "w") as f: + json.dump(output_dict, f, indent=4) + + def int_to_hex(argb_int): + return "#{:06X}".format(argb_int & 0xFFFFFF) + + try: + generate_thumbnail(path, str(thumbnail)) + generate_color_scheme(str(thumbnail), output) + except Exception as e: + print(f"Error: {e}") + with open(output, "w") as f: + f.write(f"Error: {e}") diff --git a/cli/src/zshell/subcommands/screenshot.py b/cli/src/zshell/subcommands/screenshot.py new file mode 100644 index 0000000..8edcb7f --- /dev/null +++ b/cli/src/zshell/subcommands/screenshot.py @@ -0,0 +1,18 @@ +import subprocess +import typer + +args = ["qs", "-c", "zshell"] + +app = typer.Typer() + + +@app.command() +def start(): + subprocess.run(args + ["ipc"] + ["call"] + + ["picker"] + ["open"], check=True) + + +@app.command() +def start_freeze(): + subprocess.run(args + ["ipc"] + ["call"] + + ["picker"] + ["openFreeze"], check=True) diff --git a/cli/src/zshell/subcommands/shell.py b/cli/src/zshell/subcommands/shell.py new file mode 100644 index 0000000..c503891 --- /dev/null +++ b/cli/src/zshell/subcommands/shell.py @@ -0,0 +1,26 @@ +import subprocess +import typer + +args = ["qs", "-c", "zshell"] + +app = typer.Typer() + +@app.command() +def kill(): + subprocess.run(args + ["kill"], check=True) + +@app.command() +def start(no_daemon: bool = False): + subprocess.run(args + ([] if no_daemon else ["-d"]), check=True) + +@app.command() +def show(): + subprocess.run(args + ["ipc"] + ["show"], check=True) + +@app.command() +def log(): + subprocess.run(args + ["log"], check=True) + +@app.command() +def lock(): + subprocess.run(args + ["ipc"] + ["call"] + ["lock"] + ["lock"], check=True) diff --git a/cli/src/zshell/subcommands/wallpaper.py b/cli/src/zshell/subcommands/wallpaper.py new file mode 100644 index 0000000..42256c6 --- /dev/null +++ b/cli/src/zshell/subcommands/wallpaper.py @@ -0,0 +1,14 @@ +import subprocess +import typer + +from pathlib import Path + +args = ["qs", "-c", "zshell"] + +app = typer.Typer() + + +@app.command() +def set(wallpaper: Path): + subprocess.run(args + ["ipc"] + ["call"] + + ["wallpaper"] + ["set"] + [wallpaper], check=True) diff --git a/plans/ideas.md b/plans/ideas.md index 988133c..125f1c0 100644 --- a/plans/ideas.md +++ b/plans/ideas.md @@ -7,5 +7,5 @@ - [ ] Quick toggle for BT, WiFi (modules in the tray do this too) - [x] Auto hide unless on mouse hover. Also implement bar changes to mute/volume to show notif or show bar for a couple seconds. - [x] Maybe already possible; have keybinds to show certain menus. I do not want to touch my mouse to see notifications for example. Not everything in the bar needs this, but some would be good to have. -- [ ] Pressing ESC or some obvious button to close nc. +- [x] Pressing ESC or some obvious button to close nc. - [x] Another branch for development, hold off big changes so that a working bar or if there are big config changes.