From 857bd955c5fe99314619c7fecdc296528364fb45 Mon Sep 17 00:00:00 2001 From: Karim Date: Thu, 18 Jun 2026 22:16:43 +0200 Subject: [PATCH] Add [tanin] repo build script; build 5 own packages + DB - packaging/build-tanin-repo.sh: builds own pkgs + repo-add DB (-> ~/projects/tanin-repo) - built: tanin-greet, tanin-libadwaita, tanin-setup, tanin-eww, tanin-desktop - manifest: cliphist + cage are in extra (not AUR rebuilds); only eww/tiramisu/ waypaper need rebuilding into [tanin]; record repo-build status Co-Authored-By: Claude Opus 4.8 --- distro/MANIFEST.md | 3 +- distro/camel.toml | 8 +- packaging/build-tanin-repo.sh | 52 + .../pkg/tanin-desktop/.BUILDINFO | 1159 ++++++++ .../tanin-desktop/pkg/tanin-desktop/.MTREE | Bin 0 -> 216 bytes .../tanin-desktop/pkg/tanin-desktop/.PKGINFO | 55 + .../tanin-desktop-0.2.0-1-any.pkg.tar.zst | Bin 0 -> 11699 bytes packaging/tanin-eww/pkg/tanin-eww/.BUILDINFO | 1159 ++++++++ packaging/tanin-eww/pkg/tanin-eww/.MTREE | Bin 0 -> 1955 bytes packaging/tanin-eww/pkg/tanin-eww/.PKGINFO | 34 + .../tanin/skel/.config/eww/data/emoji.tsv | 2547 +++++++++++++++++ .../share/tanin/skel/.config/eww/dock-pins | 5 + .../usr/share/tanin/skel/.config/eww/eww.scss | 721 +++++ .../usr/share/tanin/skel/.config/eww/eww.yuck | 690 +++++ .../share/tanin/skel/.config/eww/launch.sh | 105 + .../tanin/skel/.config/eww/scripts/accent.sh | 51 + .../tanin/skel/.config/eww/scripts/audio.sh | 36 + .../skel/.config/eww/scripts/bluetooth.sh | 23 + .../tanin/skel/.config/eww/scripts/clock.sh | 6 + .../skel/.config/eww/scripts/colorscheme.sh | 21 + .../tanin/skel/.config/eww/scripts/dismiss.sh | 12 + .../tanin/skel/.config/eww/scripts/dock.sh | 308 ++ .../skel/.config/eww/scripts/doupdate.sh | 27 + .../tanin/skel/.config/eww/scripts/font.sh | 37 + .../tanin/skel/.config/eww/scripts/guard.sh | 62 + .../tanin/skel/.config/eww/scripts/music.sh | 43 + .../tanin/skel/.config/eww/scripts/network.sh | 24 + .../tanin/skel/.config/eww/scripts/night.sh | 18 + .../skel/.config/eww/scripts/notifications.sh | 79 + .../tanin/skel/.config/eww/scripts/panel.sh | 47 + .../skel/.config/eww/scripts/panelcfg.sh | 64 + .../tanin/skel/.config/eww/scripts/power.sh | 12 + .../skel/.config/eww/scripts/settings.sh | 8 + .../skel/.config/eww/scripts/spotlight.sh | 275 ++ .../tanin/skel/.config/eww/scripts/sysinfo.sh | 30 + .../tanin/skel/.config/eww/scripts/updates.sh | 15 + .../tanin/skel/.config/eww/scripts/volume.sh | 20 + .../tanin/skel/.config/eww/scripts/wm.sh | 45 + .../skel/.config/eww/scripts/workspaces.sh | 33 + .../tanin/skel/.config/eww/scripts/ws.sh | 7 + .../share/tanin/skel/.config/niri/config.kdl | 195 ++ .../tanin-eww-0.1.0-1-any.pkg.tar.zst | Bin 0 -> 74335 bytes .../tanin-greet/pkg/tanin-greet/.BUILDINFO | 1159 ++++++++ packaging/tanin-greet/pkg/tanin-greet/.MTREE | Bin 0 -> 418 bytes .../tanin-greet/pkg/tanin-greet/.PKGINFO | 23 + .../pkg/tanin-greet/etc/greetd/config.toml | 8 + .../tanin-greet/etc/greetd/tanin-greet.css | 176 ++ .../pkg/tanin-greet/usr/bin/tanin-greet | 328 +++ .../tanin-greet-0.1.0-1-any.pkg.tar.zst | Bin 0 -> 18342 bytes .../pkg/tanin-libadwaita/.BUILDINFO | 1159 ++++++++ .../pkg/tanin-libadwaita/.MTREE | Bin 0 -> 629 bytes .../pkg/tanin-libadwaita/.PKGINFO | 16 + .../tanin-libadwaita/usr/bin/tanin-libadwaita | 62 + .../lib/systemd/user/tanin-libadwaita.service | 13 + .../share/tanin/libadwaita/gtk-3.0/dark.css | 66 + .../share/tanin/libadwaita/gtk-3.0/light.css | 65 + .../share/tanin/libadwaita/gtk-4.0/dark.css | 74 + .../share/tanin/libadwaita/gtk-4.0/light.css | 71 + .../tanin-libadwaita-0.1.0-1-any.pkg.tar.zst | Bin 0 -> 15637 bytes .../tanin-setup/pkg/tanin-setup/.BUILDINFO | 1159 ++++++++ packaging/tanin-setup/pkg/tanin-setup/.MTREE | Bin 0 -> 381 bytes .../tanin-setup/pkg/tanin-setup/.PKGINFO | 16 + .../pkg/tanin-setup/usr/bin/tanin-setup | 55 + .../usr/share/tanin/tanin-session.target | 7 + .../tanin-setup-0.1.0-1-any.pkg.tar.zst | Bin 0 -> 12923 bytes 65 files changed, 12486 insertions(+), 7 deletions(-) create mode 100755 packaging/build-tanin-repo.sh create mode 100644 packaging/tanin-desktop/pkg/tanin-desktop/.BUILDINFO create mode 100644 packaging/tanin-desktop/pkg/tanin-desktop/.MTREE create mode 100644 packaging/tanin-desktop/pkg/tanin-desktop/.PKGINFO create mode 100644 packaging/tanin-desktop/tanin-desktop-0.2.0-1-any.pkg.tar.zst create mode 100644 packaging/tanin-eww/pkg/tanin-eww/.BUILDINFO create mode 100644 packaging/tanin-eww/pkg/tanin-eww/.MTREE create mode 100644 packaging/tanin-eww/pkg/tanin-eww/.PKGINFO create mode 100644 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/data/emoji.tsv create mode 100644 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/dock-pins create mode 100644 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/eww.scss create mode 100644 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/eww.yuck create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/launch.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/accent.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/audio.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/bluetooth.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/clock.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/colorscheme.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/dismiss.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/dock.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/doupdate.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/font.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/guard.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/music.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/network.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/night.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/notifications.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/panel.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/panelcfg.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/power.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/settings.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/spotlight.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/sysinfo.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/updates.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/volume.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/wm.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/workspaces.sh create mode 100755 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/ws.sh create mode 100644 packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/niri/config.kdl create mode 100644 packaging/tanin-eww/tanin-eww-0.1.0-1-any.pkg.tar.zst create mode 100644 packaging/tanin-greet/pkg/tanin-greet/.BUILDINFO create mode 100644 packaging/tanin-greet/pkg/tanin-greet/.MTREE create mode 100644 packaging/tanin-greet/pkg/tanin-greet/.PKGINFO create mode 100644 packaging/tanin-greet/pkg/tanin-greet/etc/greetd/config.toml create mode 100644 packaging/tanin-greet/pkg/tanin-greet/etc/greetd/tanin-greet.css create mode 100755 packaging/tanin-greet/pkg/tanin-greet/usr/bin/tanin-greet create mode 100644 packaging/tanin-greet/tanin-greet-0.1.0-1-any.pkg.tar.zst create mode 100644 packaging/tanin-libadwaita/pkg/tanin-libadwaita/.BUILDINFO create mode 100644 packaging/tanin-libadwaita/pkg/tanin-libadwaita/.MTREE create mode 100644 packaging/tanin-libadwaita/pkg/tanin-libadwaita/.PKGINFO create mode 100755 packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/bin/tanin-libadwaita create mode 100644 packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/lib/systemd/user/tanin-libadwaita.service create mode 100644 packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-3.0/dark.css create mode 100644 packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-3.0/light.css create mode 100644 packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-4.0/dark.css create mode 100644 packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-4.0/light.css create mode 100644 packaging/tanin-libadwaita/tanin-libadwaita-0.1.0-1-any.pkg.tar.zst create mode 100644 packaging/tanin-setup/pkg/tanin-setup/.BUILDINFO create mode 100644 packaging/tanin-setup/pkg/tanin-setup/.MTREE create mode 100644 packaging/tanin-setup/pkg/tanin-setup/.PKGINFO create mode 100755 packaging/tanin-setup/pkg/tanin-setup/usr/bin/tanin-setup create mode 100644 packaging/tanin-setup/pkg/tanin-setup/usr/share/tanin/tanin-session.target create mode 100644 packaging/tanin-setup/tanin-setup-0.1.0-1-any.pkg.tar.zst diff --git a/distro/MANIFEST.md b/distro/MANIFEST.md index f881fd5..aa0c726 100644 --- a/distro/MANIFEST.md +++ b/distro/MANIFEST.md @@ -61,8 +61,7 @@ AUR → OPT-IN only (paru = optdepend) **Rebuilt AUR deps** — the desktop's hard requirements that aren't in the official repos. We rebuild them into `[tanin]` so `tanin-desktop` can hard-depend on them **without the AUR** (binary repos must never need it): `eww`, `tiramisu`, -`waypaper`, `cliphist`. ⚠️ Verify each before publishing — any that -turn out to live in `extra` should be dropped from this list. +`waypaper`. (`cliphist` + `cage` are in `extra` — pulled from official repos.) The full Arch package set (compositor, portals, audio, connectivity, fonts, …) is enumerated under `[packages.arch]` in `camel.toml` and is the seed for the diff --git a/distro/camel.toml b/distro/camel.toml index f086086..445bfb7 100644 --- a/distro/camel.toml +++ b/distro/camel.toml @@ -140,10 +140,7 @@ name = "waypaper" reason = "wallpaper setter (niri autostart: waypaper --restore)" verify = "AUR" -[[packages.rebuilt_aur]] -name = "cliphist" -reason = "clipboard history for Spotlight" -verify = "extra? else AUR" +# cliphist + cage are in `extra` (verified) — NOT rebuilt, pulled from official repos. # ============================================================================= # ARCH PACKAGE SET — hard depends of tanin-desktop, pulled from official repos. @@ -200,5 +197,6 @@ project = "taninux.kgva.ch" # homepage + [tanin] pacman Ser name = "Final project/OS name: keep TANINUX, or split app=tanin / OS=?" repo_hosting = "Gitea/Forgejo Arch registry vs static dir behind taninux.kgva.ch" signing = "Move [tanin] SigLevel to Required + distribute the packager key" -aur_repo_check = "Confirm which rebuilt_aur entries are actually in extra (drop those)" +aur_repo_check = "DONE — cliphist+cage in extra; only eww/tiramisu/waypaper need AUR rebuild into [tanin]" +repo_build = "packaging/build-tanin-repo.sh builds the 5 own pkgs + DB at ~/projects/tanin-repo. Still need: taninux (sudo pacman -S python-build python-installer python-hatchling), the 3 AUR rebuilds (paru/makepkg + sudo), optional GPG signing key, then host." blur_shadow = "niri layer-rule blur/shadow for eww layers (template commented in niri config)" diff --git a/packaging/build-tanin-repo.sh b/packaging/build-tanin-repo.sh new file mode 100755 index 0000000..a06590b --- /dev/null +++ b/packaging/build-tanin-repo.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +# Build the [tanin] binary repo from our own packages. +# ./build-tanin-repo.sh # build what's possible, refresh the DB +# TANIN_REPO_DIR=/path ./... # output elsewhere (default ~/projects/tanin-repo) +# +# Coverage: +# - own simple packages (file installs / metapackage): built here, no sudo. +# - taninux: needs python-build/installer/hatchling -> built only if present. +# - AUR rebuilds (eww, tiramisu, waypaper): NOT in official repos; build them +# separately (paru/makepkg) and drop the .pkg.tar.zst into the repo dir. +# (cliphist + cage are in extra -> no rebuild needed.) +set -uo pipefail +HERE="$(cd "$(dirname "$0")" && pwd)" +OUT="${TANIN_REPO_DIR:-$HOME/projects/tanin-repo}" +DB="$OUT/tanin.db.tar.zst" +mkdir -p "$OUT" + +OWN_SIMPLE=(tanin-greet tanin-libadwaita tanin-setup tanin-eww tanin-desktop) +OWN_BUILD=(taninux) +AUR_REBUILD=(eww tiramisu waypaper) + +build() { + local p="$1" + echo "==> building $p" + ( cd "$HERE/$p" && makepkg -d -f --noconfirm >/dev/null 2>&1 ) \ + && cp "$HERE/$p/"*.pkg.tar.zst "$OUT/" 2>/dev/null \ + && echo " ok" || { echo " FAILED ($p)"; return 1; } +} + +for p in "${OWN_SIMPLE[@]}"; do build "$p"; done + +for p in "${OWN_BUILD[@]}"; do + if pacman -Q python-build python-installer python-hatchling >/dev/null 2>&1; then + build "$p" + else + echo "** skip $p — needs: sudo pacman -S python-build python-installer python-hatchling" + fi +done + +echo "** AUR rebuilds TODO (not in official repos): ${AUR_REBUILD[*]}" +echo " build each with paru/makepkg and copy the .pkg.tar.zst into $OUT, then re-run." + +# refresh the DB (unsigned for now -> pacman.conf: SigLevel = Optional TrustAll) +shopt -s nullglob +pkgs=("$OUT"/*.pkg.tar.zst) +if (( ${#pkgs[@]} )); then + ( cd "$OUT" && repo-add -q "$DB" ./*.pkg.tar.zst >/dev/null 2>&1 ) + echo "== [tanin] repo refreshed at $OUT ==" + ls -1 "$OUT" | grep -E '\.pkg\.tar\.zst$|tanin\.db' +else + echo "no packages built yet." +fi \ No newline at end of file diff --git a/packaging/tanin-desktop/pkg/tanin-desktop/.BUILDINFO b/packaging/tanin-desktop/pkg/tanin-desktop/.BUILDINFO new file mode 100644 index 0000000..f7a3f06 --- /dev/null +++ b/packaging/tanin-desktop/pkg/tanin-desktop/.BUILDINFO @@ -0,0 +1,1159 @@ +format = 2 +pkgname = tanin-desktop +pkgbase = tanin-desktop +pkgver = 0.2.0-1 +pkgarch = any +pkgbuild_sha256sum = bed9c1968a52f6b5eff080354d1b5272e79c7140938fa1763d7ff0a3bc30d0e4 +packager = Unknown Packager +builddate = 1781813721 +builddir = /home/karim/projects/taninux/packaging/tanin-desktop +startdir = /home/karim/projects/taninux/packaging/tanin-desktop +buildtool = makepkg +buildtoolver = 7.1.0 +buildenv = !distcc +buildenv = color +buildenv = !ccache +buildenv = check +buildenv = !sign +options = strip +options = docs +options = !libtool +options = !staticlibs +options = emptydirs +options = zipman +options = purge +options = debug +options = lto +installed = 7zip-26.01-1-x86_64 +installed = aalib-1.4rc5-19-x86_64 +installed = abseil-cpp-20260526.0-2-x86_64 +installed = accountsservice-26.13.3-1-x86_64 +installed = acl-2.3.2-2-x86_64 +installed = ada-3.4.4-1-x86_64 +installed = adw-gtk-theme-6.5-1-any +installed = adwaita-cursors-50.0-1-any +installed = adwaita-fonts-50.0-1-any +installed = adwaita-icon-theme-50.0-1-any +installed = adwaita-icon-theme-legacy-46.2-3-any +installed = alembic-1.8.11-2-x86_64 +installed = alsa-card-profiles-1:1.6.6-1-x86_64 +installed = alsa-lib-1.2.16.1-1-x86_64 +installed = alsa-plugins-1:1.2.12-5-x86_64 +installed = alsa-topology-conf-1.2.5.1-4-any +installed = alsa-ucm-conf-1.2.16.1-1-any +installed = alsa-utils-1.2.16-1-x86_64 +installed = amd-ucode-20260519-1-any +installed = ananicy-cpp-1.2.0-1-x86_64 +installed = antimicrox-3.6.1-1-x86_64 +installed = aom-3.14.1-1-x86_64 +installed = appstream-1.1.2-1-x86_64 +installed = aquamarine-0.12.1-1-x86_64 +installed = arch-update-3.20.1-1-any +installed = archlinux-contrib-20260611-1-any +installed = archlinux-keyring-20260612-1-any +installed = argon2-20190702-6-x86_64 +installed = at-spi2-core-2.60.4-1-x86_64 +installed = atkmm-2.28.5-2-x86_64 +installed = attr-2.5.2-2-x86_64 +installed = audit-4.1.4-2-x86_64 +installed = autoconf-2.73-1-any +installed = automake-1.18.1-1-any +installed = avahi-1:0.9rc4-1-x86_64 +installed = awesome-terminal-fonts-1.1.0-5-any +installed = ayatana-ido-0.10.4-1-x86_64 +installed = base-3-3-any +installed = base-devel-1-2-any +installed = bash-5.3.15-1-x86_64 +installed = bats-1.13.0-1-any +installed = binutils-2.46+r70+g155188ea10a7-1-x86_64 +installed = bison-3.8.2-8-x86_64 +installed = blas-3.12.1-2-x86_64 +installed = blender-17:5.1.2-1-x86_64 +installed = blosc-1.21.6-2-x86_64 +installed = bluez-5.86-6-x86_64 +installed = bluez-libs-5.86-6-x86_64 +installed = bluez-utils-5.86-6-x86_64 +installed = boost-libs-1.91.0-1-x86_64 +installed = botan-3.12.0-1-x86_64 +installed = brotli-1.2.0-1-x86_64 +installed = btrfs-progs-7.0-1-x86_64 +installed = bubblewrap-0.11.2-1-x86_64 +installed = bzip2-1.0.8-6-x86_64 +installed = c-ares-1.34.6-1-x86_64 +installed = ca-certificates-20240618-1-any +installed = ca-certificates-mozilla-3.125-1-x86_64 +installed = ca-certificates-utils-20240618-1-any +installed = cabextract-1.11-2-x86_64 +installed = cage-0.3.0-1-x86_64 +installed = cairo-1.18.4-1-x86_64 +installed = cairomm-1.14.6-1-x86_64 +installed = cairomm-1.16-1.18.1-1-x86_64 +installed = capstone-5.0.9-1-x86_64 +installed = cblas-3.12.1-2-x86_64 +installed = cdparanoia-10.2-9-x86_64 +installed = ceres-solver-2.2.0-5-x86_64 +installed = chatbox-bin-1.21.0-1-x86_64 +installed = cifs-utils-7.5-1-x86_64 +installed = clang-22.1.6-1-x86_64 +installed = claude-code-2.1.177-1-x86_64 +installed = cliphist-1:0.7.0-2-x86_64 +installed = clucene-2.3.3.4-17-x86_64 +installed = cmake-4.3.3-1-x86_64 +installed = code-1.124.2-1-x86_64 +installed = compiler-rt-22.1.6-1-x86_64 +installed = composefs-1.0.8-1-x86_64 +installed = coreutils-9.11-1-x86_64 +installed = cpio-2.15-3-x86_64 +installed = cppdap-1.58.0-3-x86_64 +installed = cracklib-2.10.3-1-x86_64 +installed = cronie-1.7.2-2-x86_64 +installed = cryptsetup-2.8.6-1-x86_64 +installed = cups-2:2.4.19-1-x86_64 +installed = cups-filters-2.0.1-2-x86_64 +installed = curl-8.20.0-7-x86_64 +installed = dav1d-1.5.3-1-x86_64 +installed = db5.3-5.3.28-7-x86_64 +installed = dbus-1.16.2-1-x86_64 +installed = dbus-broker-37-3-x86_64 +installed = dbus-broker-units-37-3-x86_64 +installed = dbus-glib-0.114-1-x86_64 +installed = dbus-units-37-3-x86_64 +installed = dconf-0.49.0-1-x86_64 +installed = debugedit-5.3-1-x86_64 +installed = default-cursors-3-1-any +installed = desktop-file-utils-0.28-1-x86_64 +installed = device-mapper-2.03.41-1-x86_64 +installed = dialog-1:1.3_20260107-1-x86_64 +installed = diffutils-3.12-2-x86_64 +installed = djvulibre-3.5.30-1-x86_64 +installed = dmidecode-3.7-1-x86_64 +installed = dnsmasq-2.93-1-x86_64 +installed = dos2unix-7.5.6-1-x86_64 +installed = dosfstools-4.2-5-x86_64 +installed = double-conversion-3.4.0-1-x86_64 +installed = draco-1.5.7-2-x86_64 +installed = dtc-1:1.7.2-1-x86_64 +installed = duktape-2.7.0-7-x86_64 +installed = e2fsprogs-1.47.4-1-x86_64 +installed = editorconfig-core-c-0.12.11-1-x86_64 +installed = edk2-ovmf-202605-1-any +installed = efibootmgr-18-4-x86_64 +installed = efivar-39-2-x86_64 +installed = electron39-39.8.10-1-x86_64 +installed = electron42-42.3.0-1-x86_64 +installed = elfutils-0.195-1-x86_64 +installed = embree-4.4.1-1-x86_64 +installed = enchant-2.8.15-2-x86_64 +installed = epson-inkjet-printer-escpr2-1.2.39-1-x86_64 +installed = eww-git-0.6.0.r89.g865cf63-1-x86_64 +installed = exempi-2.6.6-3-x86_64 +installed = exiv2-0.28.8-2-x86_64 +installed = expat-2.8.1-1-x86_64 +installed = extra-cmake-modules-6.27.0-1-any +installed = fakeroot-1:1.37.2-1-x86_64 +installed = fd-10.4.2-2-x86_64 +installed = ffmpeg-2:8.1.1-2-x86_64 +installed = fftw-3.3.11-1-x86_64 +installed = file-5.48-1-x86_64 +installed = filesystem-2025.10.12-1-any +installed = findutils-4.10.0-3-x86_64 +installed = flac-1.5.0-1-x86_64 +installed = flatpak-1:1.18.0-1-x86_64 +installed = flex-2.6.4-6-x86_64 +installed = fmt-12.1.0-2-x86_64 +installed = font-manager-0.9.4-3-x86_64 +installed = fontconfig-2:2.18.1-1-x86_64 +installed = freeglut-3.8.0-1-x86_64 +installed = freetype2-2.14.3-1-x86_64 +installed = fribidi-1.0.16-2-x86_64 +installed = fuse-common-3.18.2-1-x86_64 +installed = fuse2-2.9.9-5-x86_64 +installed = fuse3-3.18.2-1-x86_64 +installed = gamemode-1.8.2-2-x86_64 +installed = gawk-5.4.0-1-x86_64 +installed = gc-8.2.12-1-x86_64 +installed = gcc-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = gcc-libs-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = gcr-3.41.2-2-x86_64 +installed = gcr-4-4.4.0.1-1-x86_64 +installed = gdb-17.2-1-x86_64 +installed = gdb-common-17.2-1-x86_64 +installed = gdbm-1.26-2-x86_64 +installed = gdk-pixbuf2-2.44.6-2-x86_64 +installed = gedit-50.0-3-x86_64 +installed = geoclue-2.8.1-1-x86_64 +installed = geocode-glib-3.26.4-6-x86_64 +installed = gettext-1.0-2-x86_64 +installed = gexiv2-0.16.0-2-x86_64 +installed = gflags-2.2.2-6-x86_64 +installed = gfxstream-0.1.2-2-x86_64 +installed = ghostscript-10.07.1-1-x86_64 +installed = giflib-6.1.3-1-x86_64 +installed = git-2.54.0-1-x86_64 +installed = glew-2.3.1-1-x86_64 +installed = glfw-1:3.4-1-x86_64 +installed = glib-networking-1:2.80.1-1-x86_64 +installed = glib2-2.88.1-1-x86_64 +installed = glibc-2.43+r22+g8362e8ce10b2-2-x86_64 +installed = glibmm-2.66.8-2-x86_64 +installed = glibmm-2.68-2.88.0-2-x86_64 +installed = glm-1.0.3-1-x86_64 +installed = glslang-1:1.4.350.0-1-x86_64 +installed = glu-9.0.3-3-x86_64 +installed = glycin-2.1.1-1-x86_64 +installed = glycin-gtk4-2.1.1-1-x86_64 +installed = gmp-6.3.0-3-x86_64 +installed = gnome-autoar-0.4.5-1-x86_64 +installed = gnome-clocks-50.0-2-x86_64 +installed = gnome-desktop-4-1:44.5-1-x86_64 +installed = gnome-desktop-common-1:44.5-1-x86_64 +installed = gnome-disk-utility-46.1-2-x86_64 +installed = gnome-keyring-1:50.0-1-x86_64 +installed = gnome-text-editor-50.1-1-x86_64 +installed = gnu-free-fonts-20120503-9-any +installed = gnulib-l10n-20241231-1-any +installed = gnupg-2.4.9-1-x86_64 +installed = gnutls-3.8.13-2-x86_64 +installed = go-2:1.26.4-1-x86_64 +installed = gobject-introspection-runtime-1.86.0-2-x86_64 +installed = google-glog-0.7.1-2-x86_64 +installed = gperftools-2.18.1-1-x86_64 +installed = gpgme-2.1.0-1-x86_64 +installed = gpgmepp-2.1.0-1-x86_64 +installed = gpm-1.20.7.r38.ge82d1a6-6-x86_64 +installed = gpsd-3.27.5-1-x86_64 +installed = graphene-1.10.8-2-x86_64 +installed = graphite-1:1.3.15-1-x86_64 +installed = greetd-0.10.3-2-x86_64 +installed = greetd-agreety-0.10.3-2-x86_64 +installed = greetd-regreet-0.4.0-1-x86_64 +installed = greetd-tuigreet-0.9.1-2-x86_64 +installed = grep-3.12-2-x86_64 +installed = grim-1.5.0-2-x86_64 +installed = groff-1.24.1-1-x86_64 +installed = grub-2:2.14-1-x86_64 +installed = gsettings-desktop-schemas-50.1-1-any +installed = gsettings-system-schemas-50.1-1-any +installed = gsm-1.0.24-1-x86_64 +installed = gspell-1.14.3-1-x86_64 +installed = gssdp-1.6.5-1-x86_64 +installed = gst-plugins-bad-libs-1.28.4-1-x86_64 +installed = gst-plugins-base-1.28.4-1-x86_64 +installed = gst-plugins-base-libs-1.28.4-1-x86_64 +installed = gst-plugins-good-1.28.4-1-x86_64 +installed = gstreamer-1.28.4-1-x86_64 +installed = gtest-1.17.0-2-x86_64 +installed = gtk-layer-shell-0.10.1-1-x86_64 +installed = gtk-update-icon-cache-1:4.22.4-1-x86_64 +installed = gtk-vnc-1.5.0-1-x86_64 +installed = gtk3-1:3.24.52-1-x86_64 +installed = gtk4-1:4.22.4-1-x86_64 +installed = gtkmm-4.0-4.22.0-2-x86_64 +installed = gtkmm3-3.24.11-1-x86_64 +installed = gtksourceview4-4.8.4-2-x86_64 +installed = gtksourceview5-5.20.0-1-x86_64 +installed = guile-3.0.11-1-x86_64 +installed = gumbo-parser-0.13.2-1-x86_64 +installed = gupnp-1:1.6.10-1-x86_64 +installed = gupnp-dlna-0.12.0-5-x86_64 +installed = gupnp-igd-1.6.0-2-x86_64 +installed = gvfs-1.60.0-2-x86_64 +installed = gweather-locations-2026.2-1-x86_64 +installed = gzip-1.14-2-x86_64 +installed = harfbuzz-14.2.1-1-x86_64 +installed = harfbuzz-icu-14.2.1-1-x86_64 +installed = hdf5-2.1.1-1-x86_64 +installed = heroic-games-launcher-bin-2.22.0-1-x86_64 +installed = hicolor-icon-theme-0.18-1-any +installed = hidapi-0.15.0-1-x86_64 +installed = highway-1.4.0-1-x86_64 +installed = htmlq-0.4.0-3-x86_64 +installed = hugo-0.163.1-1-x86_64 +installed = hunspell-1.7.3-1-x86_64 +installed = hwdata-0.408-1-any +installed = hwloc-2.14.0-1-x86_64 +installed = hyphen-2.8.9-1-x86_64 +installed = hyprcursor-0.1.13-6-x86_64 +installed = hyprgraphics-0.5.1-2-x86_64 +installed = hyprland-0.55.4-1-x86_64 +installed = hyprland-guiutils-0.2.1-6-x86_64 +installed = hyprlang-0.6.8-4-x86_64 +installed = hyprshot-1.3.0-4-any +installed = hyprtoolkit-0.5.4-2-x86_64 +installed = hyprutils-0.13.1-1-x86_64 +installed = hyprwayland-scanner-0.4.6-1-x86_64 +installed = hyprwire-0.3.1-2-x86_64 +installed = iana-etc-20260530-1-any +installed = icu-78.3-1-x86_64 +installed = ijs-0.35-7-x86_64 +installed = imagemagick-7.1.2.25-1-x86_64 +installed = imath-3.2.2-6-x86_64 +installed = imlib2-1.12.6-1-x86_64 +installed = iniparser-4.2.6-2-x86_64 +installed = intel-oneapi-common-2026.0.0_235-1-any +installed = intel-oneapi-compiler-dpcpp-cpp-runtime-libs-2026.0.0_947-2-x86_64 +installed = intel-oneapi-compiler-shared-runtime-libs-2026.0.0_947-1-x86_64 +installed = intel-oneapi-openmp-2026.0.0_947-1-x86_64 +installed = intel-oneapi-tbb-2023.0.0_724-1-x86_64 +installed = intel-oneapi-tcm-1.5.0_489-1-x86_64 +installed = intel-oneapi-umf-1.1.0_340-2-x86_64 +installed = inter-font-4.1-1-any +installed = iproute2-7.0.0-1-x86_64 +installed = iptables-1:1.8.13-1-x86_64 +installed = iputils-20250605-1-x86_64 +installed = iso-codes-4.20.1-1-any +installed = jansson-2.15.0-1-x86_64 +installed = jbig2dec-0.20-2-x86_64 +installed = jbigkit-2.1-8-x86_64 +installed = jemalloc-1:5.3.1-2-x86_64 +installed = jq-1.8.1-3-x86_64 +installed = json-c-0.18-2-x86_64 +installed = json-glib-1.10.8-1-x86_64 +installed = jsoncpp-1.9.6-3-x86_64 +installed = karchive-6.27.0-1-x86_64 +installed = kbd-2.10.0-1-x86_64 +installed = kddockwidgets-2.4.0-3-x86_64 +installed = kdsingleapplication-1.2.1-1-x86_64 +installed = keyutils-1.6.3-4-x86_64 +installed = kguiaddons-6.27.0-1-x86_64 +installed = kitty-0.47.1-1-x86_64 +installed = kitty-shell-integration-0.47.1-1-x86_64 +installed = kitty-terminfo-0.47.1-1-x86_64 +installed = kmod-34.2-1-x86_64 +installed = krb5-1.22.2-1-x86_64 +installed = l-smash-2.14.5-4-x86_64 +installed = lact-0.9.0-1-x86_64 +installed = lame-3.101.r6531-1-x86_64 +installed = lapack-3.12.1-2-x86_64 +installed = lcms2-2.19.1-1-x86_64 +installed = ldb-2:4.24.3-1-x86_64 +installed = leancrypto-1.7.2-1-x86_64 +installed = level-zero-loader-1.28.2-1-x86_64 +installed = lib32-alsa-lib-1.2.16.1-1-x86_64 +installed = lib32-alsa-plugins-1.2.12-1-x86_64 +installed = lib32-brotli-1.1.0-1-x86_64 +installed = lib32-bzip2-1.0.8-4-x86_64 +installed = lib32-curl-8.20.0-7-x86_64 +installed = lib32-dbus-1.16.2-1-x86_64 +installed = lib32-e2fsprogs-1.47.4-1-x86_64 +installed = lib32-expat-2.8.1-1-x86_64 +installed = lib32-fontconfig-2:2.18.1-1-x86_64 +installed = lib32-freetype2-2.14.3-1-x86_64 +installed = lib32-gcc-libs-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = lib32-glib2-2.88.1-1-x86_64 +installed = lib32-glibc-2.43+r22+g8362e8ce10b2-2-x86_64 +installed = lib32-gmp-6.3.0-2-x86_64 +installed = lib32-gnutls-3.8.13-3-x86_64 +installed = lib32-icu-78.3-1-x86_64 +installed = lib32-json-c-0.18-2-x86_64 +installed = lib32-keyutils-1.6.3-4-x86_64 +installed = lib32-krb5-1.22.2-1-x86_64 +installed = lib32-libdisplay-info-0.3.0-1-x86_64 +installed = lib32-libdrm-2.4.134-1-x86_64 +installed = lib32-libelf-0.195-1-x86_64 +installed = lib32-libffi-3.5.2-1-x86_64 +installed = lib32-libgcrypt-1.12.2-1-x86_64 +installed = lib32-libglvnd-1.7.0-1-x86_64 +installed = lib32-libgpg-error-1.61-1-x86_64 +installed = lib32-libidn2-2.3.8-1-x86_64 +installed = lib32-libldap-2.6.13-1-x86_64 +installed = lib32-libnghttp2-1.69.0-1-x86_64 +installed = lib32-libnghttp3-1.16.0-1-x86_64 +installed = lib32-libngtcp2-1.23.0-1-x86_64 +installed = lib32-libnm-1.56.1-1-x86_64 +installed = lib32-libpciaccess-0.19-1-x86_64 +installed = lib32-libpipewire-1:1.6.6-1-x86_64 +installed = lib32-libpng-1.6.58-1-x86_64 +installed = lib32-libpsl-0.21.5-1-x86_64 +installed = lib32-libssh2-1.11.1-1-x86_64 +installed = lib32-libtasn1-4.21.0-1-x86_64 +installed = lib32-libunistring-1.4.2-1-x86_64 +installed = lib32-libva-2.22.0-1-x86_64 +installed = lib32-libx11-1.8.13-1-x86_64 +installed = lib32-libxau-1.0.12-1-x86_64 +installed = lib32-libxcb-1.17.0-1-x86_64 +installed = lib32-libxcrypt-4.5.2-1-x86_64 +installed = lib32-libxcrypt-compat-4.5.2-1-x86_64 +installed = lib32-libxdmcp-1.1.5-1-x86_64 +installed = lib32-libxext-1.3.7-1-x86_64 +installed = lib32-libxfixes-6.0.1-2-x86_64 +installed = lib32-libxinerama-1.1.6-1-x86_64 +installed = lib32-libxml2-2.15.3-1-x86_64 +installed = lib32-libxshmfence-1.3.3-1-x86_64 +installed = lib32-libxss-1.2.5-1-x86_64 +installed = lib32-libxxf86vm-1.1.5-2-x86_64 +installed = lib32-llvm-libs-1:22.1.6-1-x86_64 +installed = lib32-lm_sensors-1:3.6.2-2-x86_64 +installed = lib32-mesa-1:26.1.2-2-x86_64 +installed = lib32-ncurses-6.6-2-x86_64 +installed = lib32-nettle-4.0-2-x86_64 +installed = lib32-nspr-4.39-1-x86_64 +installed = lib32-nss-3.125-1-x86_64 +installed = lib32-openssl-1:3.6.3-1-x86_64 +installed = lib32-p11-kit-0.26.2-1-x86_64 +installed = lib32-pcre2-10.47-1-x86_64 +installed = lib32-pipewire-1:1.6.6-1-x86_64 +installed = lib32-spirv-tools-1:1.4.350.0-1-x86_64 +installed = lib32-sqlite-3.53.2-1-x86_64 +installed = lib32-systemd-260.2-1-x86_64 +installed = lib32-util-linux-2.42.1-1-x86_64 +installed = lib32-vulkan-icd-loader-1.4.350.0-1-x86_64 +installed = lib32-vulkan-mesa-implicit-layers-1:26.1.2-2-x86_64 +installed = lib32-vulkan-radeon-1:26.1.2-2-x86_64 +installed = lib32-wayland-1.25.0-1-x86_64 +installed = lib32-xcb-util-keysyms-0.4.1-2-x86_64 +installed = lib32-xz-5.8.3-1-x86_64 +installed = lib32-zlib-1.3.2-1-x86_64 +installed = lib32-zstd-1.5.7-2-x86_64 +installed = libabw-0.1.4-1-x86_64 +installed = libadwaita-1:1.9.1-1-x86_64 +installed = libaec-1.1.7-1-x86_64 +installed = libaemu-0.1.2-5-x86_64 +installed = libaio-0.3.113-4-x86_64 +installed = libappindicator-12.10.1-1-x86_64 +installed = libarchive-3.8.7-1-x86_64 +installed = libasan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libass-0.17.4-2-x86_64 +installed = libassuan-3.0.0-1-x86_64 +installed = libasyncns-1:0.8+r3+g68cd5af-3-x86_64 +installed = libatasmart-0.19-8-x86_64 +installed = libatomic-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libatomic_ops-7.8.2-2-x86_64 +installed = libavc1394-0.5.4-7-x86_64 +installed = libavif-1.4.2-1-x86_64 +installed = libayatana-appindicator-0.5.94-1-x86_64 +installed = libayatana-indicator-0.9.5-1-x86_64 +installed = libb2-0.98.1-3-x86_64 +installed = libb64-1.2.1-5-x86_64 +installed = libbacktrace-1.0.git1-1-x86_64 +installed = libblockdev-3.5.0-2-x86_64 +installed = libblockdev-crypto-3.5.0-2-x86_64 +installed = libblockdev-fs-3.5.0-2-x86_64 +installed = libblockdev-loop-3.5.0-2-x86_64 +installed = libblockdev-mdraid-3.5.0-2-x86_64 +installed = libblockdev-nvme-3.5.0-2-x86_64 +installed = libblockdev-part-3.5.0-2-x86_64 +installed = libblockdev-smart-3.5.0-2-x86_64 +installed = libblockdev-swap-3.5.0-2-x86_64 +installed = libbluray-1.4.1-1-x86_64 +installed = libbpf-1.7.0-1-x86_64 +installed = libbs2b-3.1.0-10-x86_64 +installed = libbsd-0.12.2-2-x86_64 +installed = libburn-1.5.8-1-x86_64 +installed = libbytesize-2.12-3-x86_64 +installed = libcaca-0.99.beta20-7-x86_64 +installed = libcacard-2.8.1-1-x86_64 +installed = libcanberra-1:0.30+r2+gc0620e4-6-x86_64 +installed = libcap-2.78-1-x86_64 +installed = libcap-ng-0.9.3-1-x86_64 +installed = libcbor-0.14.0-1-x86_64 +installed = libcdio-2.3.0-1-x86_64 +installed = libcdio-paranoia-10.2+2.0.2-2-x86_64 +installed = libcdr-0.1.9-1-x86_64 +installed = libcloudproviders-0.4.0-1-x86_64 +installed = libcmis-0.6.3-1-x86_64 +installed = libcolord-1.4.8-1-x86_64 +installed = libcue-2.3.0-2-x86_64 +installed = libcups-2:2.4.19-1-x86_64 +installed = libcupsfilters-2.1.1-4-x86_64 +installed = libdaemon-0.14-6-x86_64 +installed = libdatrie-0.2.14-1-x86_64 +installed = libdbusmenu-glib-18.10.20180917-1-x86_64 +installed = libdbusmenu-gtk3-18.10.20180917-1-x86_64 +installed = libde265-1.1.1-1-x86_64 +installed = libdecor-0.2.5-1-x86_64 +installed = libdeflate-1.25-1-x86_64 +installed = libdisplay-info-0.3.0-1-x86_64 +installed = libdovi-3.3.2-1-x86_64 +installed = libdrm-2.4.134-1-x86_64 +installed = libdv-1.0.0-12-x86_64 +installed = libdvdnav-7.0.0-1-x86_64 +installed = libdvdread-7.0.1-1-x86_64 +installed = libe-book-0.1.3-20-x86_64 +installed = libebur128-1.2.6-2-x86_64 +installed = libedit-20260512_3.1-1-x86_64 +installed = libei-1.6.0-1-x86_64 +installed = libelf-0.195-1-x86_64 +installed = libepoxy-1.5.10-3-x86_64 +installed = libepubgen-0.1.1-6-x86_64 +installed = libetonyek-0.1.13-2-x86_64 +installed = libevdev-1.13.6-1-x86_64 +installed = libevent-2.1.12-5-x86_64 +installed = libexif-0.6.26-1-x86_64 +installed = libexttextcat-3.4.8-1-x86_64 +installed = libfdk-aac-2.0.3-2-x86_64 +installed = libffi-3.5.2-1-x86_64 +installed = libfontenc-1.1.9-1-x86_64 +installed = libfreeaptx-0.2.2-1-x86_64 +installed = libfreehand-0.1.3-1-x86_64 +installed = libfyaml-0.9.6-2-x86_64 +installed = libgcc-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libgcrypt-1.12.2-1-x86_64 +installed = libgedit-amtk-5.10.0-1-x86_64 +installed = libgedit-gfls-1:0.4.1-1-x86_64 +installed = libgedit-gtksourceview-299.7.0-1-x86_64 +installed = libgedit-tepl-6.14.0-2-x86_64 +installed = libgee-0.20.8-1-x86_64 +installed = libgfortran-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libgirepository-1.86.0-2-x86_64 +installed = libglvnd-1.7.0-3-x86_64 +installed = libgnomekbd-1:3.28.1-2-x86_64 +installed = libgomp-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libgpg-error-1.61-1-x86_64 +installed = libgsf-1.14.58-1-x86_64 +installed = libgudev-238-3-x86_64 +installed = libgweather-4-4.6.0-1-x86_64 +installed = libgxps-0.3.2-5-x86_64 +installed = libhandy-1.8.3-2-x86_64 +installed = libharu-2.4.6-1-x86_64 +installed = libheif-1.23.0-1-x86_64 +installed = libice-1.1.2-1-x86_64 +installed = libidn-1.43-1-x86_64 +installed = libidn2-2.3.8-1-x86_64 +installed = libiec61883-1.2.0-9-x86_64 +installed = libimagequant-4.4.1-2-x86_64 +installed = libimobiledevice-1.4.0-2-x86_64 +installed = libimobiledevice-glue-1.3.2-1-x86_64 +installed = libinih-62-2-x86_64 +installed = libinput-1.31.3-1-x86_64 +installed = libiptcdata-1.0.5-5-x86_64 +installed = libisl-0.27-1-x86_64 +installed = libisoburn-1.5.8.2-1-x86_64 +installed = libisofs-1.5.8.2-1-x86_64 +installed = libixion-0.20.0-7-x86_64 +installed = libjpeg-turbo-3.1.4.1-1-x86_64 +installed = libjxl-0.11.2-2-x86_64 +installed = libksba-1.8.0-1-x86_64 +installed = liblangtag-0.6.8-1-x86_64 +installed = liblc3-1.1.3-2-x86_64 +installed = libldac-2.0.2.3-3-x86_64 +installed = libldap-2.6.13-1-x86_64 +installed = libliftoff-0.5.0-1-x86_64 +installed = liblqr-0.4.3-1-x86_64 +installed = liblsan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libmakepkg-dropins-20-1-any +installed = libmalcontent-0.14.0-4-x86_64 +installed = libmanette-0.2.13-2-x86_64 +installed = libmd-1.2.0-1-x86_64 +installed = libmm-glib-1.24.2-1-x86_64 +installed = libmnl-1.0.5-2-x86_64 +installed = libmodplug-0.8.9.0-7-x86_64 +installed = libmpc-1.4.1-1-x86_64 +installed = libmpdclient-2.23-1-x86_64 +installed = libmspub-0.1.5-1-x86_64 +installed = libmwaw-0.3.22-4-x86_64 +installed = libmysofa-1.3.4-1-x86_64 +installed = libnatpmp-20230423-3-x86_64 +installed = libnautilus-extension-50.2.2-1-x86_64 +installed = libnbd-1.24.2-2-x86_64 +installed = libndp-1.9-1-x86_64 +installed = libnetfilter_conntrack-1.1.1-1-x86_64 +installed = libnewt-0.52.25-2-x86_64 +installed = libnfnetlink-1.0.2-2-x86_64 +installed = libnfs-6.0.2-5-x86_64 +installed = libnftnl-1.3.1-1-x86_64 +installed = libnghttp2-1.69.0-1-x86_64 +installed = libnghttp3-1.16.0-1-x86_64 +installed = libngtcp2-1.23.0-1-x86_64 +installed = libnice-0.1.23-1-x86_64 +installed = libnl-3.12.0-1-x86_64 +installed = libnm-1.56.1-1-x86_64 +installed = libnma-1.10.6-3-x86_64 +installed = libnma-common-1.10.6-3-x86_64 +installed = libnotify-0.8.8-1-x86_64 +installed = libnsl-2.0.1-2-x86_64 +installed = libnumbertext-1.0.11-3-x86_64 +installed = libnvme-1.16.1-3-x86_64 +installed = libobjc-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libodfgen-0.1.8-5-x86_64 +installed = libogg-1.3.6-1-x86_64 +installed = libopenmpt-0.8.7-1-x86_64 +installed = liborcus-0.21.0-6-x86_64 +installed = libosinfo-1.12.0-3-x86_64 +installed = libp11-0.4.18-1-x86_64 +installed = libp11-kit-0.26.2-1-x86_64 +installed = libpagemaker-0.0.4-5-x86_64 +installed = libpaper-2.2.8-1-x86_64 +installed = libpcap-1.10.6-1-x86_64 +installed = libpciaccess-0.19-1-x86_64 +installed = libpeas-1.38.1-1-x86_64 +installed = libpgm-5.3.128-4-x86_64 +installed = libpipewire-1:1.6.6-1-x86_64 +installed = libplacebo-7.360.1-2-x86_64 +installed = libplist-2.7.0-3-x86_64 +installed = libpng-1.6.58-1-x86_64 +installed = libportal-0.9.1-3-x86_64 +installed = libportal-gtk4-0.9.1-3-x86_64 +installed = libppd-2.1.1-2-x86_64 +installed = libproxy-0.5.12-1-x86_64 +installed = libpsl-0.21.5-2-x86_64 +installed = libpulse-17.0+r98+gb096704c0-1-x86_64 +installed = libpwquality-1.4.5-7-x86_64 +installed = libqalculate-5.11.0-1-x86_64 +installed = libquadmath-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libqxp-0.0.3-1-x86_64 +installed = libraqm-0.10.5-1-x86_64 +installed = libraw-0.22.1-1-x86_64 +installed = libraw1394-2.1.2-4-x86_64 +installed = libre-trainsim-bin-0.8-1-x86_64 +installed = libreoffice-fresh-26.2.4-2-x86_64 +installed = librevenge-0.0.5-4-x86_64 +installed = librewolf-bin-1:151.0.4_1-1-x86_64 +installed = librsvg-2:2.62.3-1-x86_64 +installed = librsync-1:2.3.4-2-x86_64 +installed = libsamplerate-0.2.2-3-x86_64 +installed = libsasl-2.1.28-5-x86_64 +installed = libseccomp-2.6.0-1-x86_64 +installed = libsecret-0.21.7-1-x86_64 +installed = libshout-1:2.4.6-5-x86_64 +installed = libsigc++-2.12.2-1-x86_64 +installed = libsigc++-3.0-3.8.1-1-x86_64 +installed = libslirp-4.9.3-1-x86_64 +installed = libsm-1.2.6-1-x86_64 +installed = libsndfile-1.2.2-4-x86_64 +installed = libsodium-1.0.22-1-x86_64 +installed = libsoup3-3.6.6-2-x86_64 +installed = libsoxr-0.1.3-4-x86_64 +installed = libspelling-0.4.10-1-x86_64 +installed = libspnav-1.2-1-x86_64 +installed = libssh-0.12.0-1-x86_64 +installed = libssh2-1.11.1-1-x86_64 +installed = libstaroffice-0.0.7-5-x86_64 +installed = libstdc++-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libstemmer-3.1.1-1-x86_64 +installed = libsysprof-capture-50.0-2-x86_64 +installed = libtasn1-4.21.0-1-x86_64 +installed = libtatsu-1.0.5-1-x86_64 +installed = libteam-1.32-3-x86_64 +installed = libthai-0.1.30-1-x86_64 +installed = libtheora-1.2.0-1-x86_64 +installed = libtiff-4.7.1-2-x86_64 +installed = libtirpc-1.3.7-1-x86_64 +installed = libtommath-1.3.0-2-x86_64 +installed = libtool-2.6.1-1-x86_64 +installed = libtpms-0.10.2-1-x86_64 +installed = libtraceevent-1:1.9.0-1-x86_64 +installed = libtracefs-1.8.3-1-x86_64 +installed = libtsan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libubsan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libunibreak-7.0-1-x86_64 +installed = libunistring-1.4.2-1-x86_64 +installed = libunwind-1.8.2-1-x86_64 +installed = liburing-2.14-1-x86_64 +installed = libusb-1.0.30-1-x86_64 +installed = libusbmuxd-2.1.1-2-x86_64 +installed = libuv-1.52.1-1-x86_64 +installed = libva-2.23.0-1-x86_64 +installed = libvdpau-1.5-4-x86_64 +installed = libverto-0.3.2-6-x86_64 +installed = libvirt-1:12.4.0-1-x86_64 +installed = libvirt-glib-5.0.0-3-x86_64 +installed = libvirt-python-1:12.4.0-1-x86_64 +installed = libvisio-0.1.11-1-x86_64 +installed = libvorbis-1.3.7-4-x86_64 +installed = libvpl-2.16.0-2-x86_64 +installed = libvpx-1.16.0-3-x86_64 +installed = libwacom-2.19.0-1-x86_64 +installed = libwbclient-2:4.24.3-1-x86_64 +installed = libwebp-1.6.0-2-x86_64 +installed = libwireplumber-0.5.14-1-x86_64 +installed = libwpd-0.10.3-6-x86_64 +installed = libwps-0.4.14-4-x86_64 +installed = libx11-1.8.13-1-x86_64 +installed = libxau-1.0.12-1-x86_64 +installed = libxcb-1.17.0-1-x86_64 +installed = libxcomposite-0.4.7-1-x86_64 +installed = libxcrypt-4.5.2-1-x86_64 +installed = libxcrypt-compat-4.5.2-1-x86_64 +installed = libxcursor-1.2.3-1-x86_64 +installed = libxcvt-0.1.3-1-x86_64 +installed = libxdamage-1.1.7-1-x86_64 +installed = libxdmcp-1.1.5-2-x86_64 +installed = libxdp-1.6.3-1-x86_64 +installed = libxext-1.3.7-1-x86_64 +installed = libxfixes-6.0.2-1-x86_64 +installed = libxfont2-2.0.7-1-x86_64 +installed = libxft-2.3.9-1-x86_64 +installed = libxi-1.8.3-1-x86_64 +installed = libxinerama-1.1.6-1-x86_64 +installed = libxkbcommon-1.13.2-1-x86_64 +installed = libxkbcommon-x11-1.13.2-1-x86_64 +installed = libxkbfile-1.2.0-1-x86_64 +installed = libxklavier-5.4-7-x86_64 +installed = libxml2-2.15.3-1-x86_64 +installed = libxmlb-0.3.27-1-x86_64 +installed = libxrandr-1.5.5-1-x86_64 +installed = libxrender-0.9.12-1-x86_64 +installed = libxshmfence-1.3.3-1-x86_64 +installed = libxslt-1.1.45-2-x86_64 +installed = libxss-1.2.5-1-x86_64 +installed = libxt-1.3.1-1-x86_64 +installed = libxtst-1.2.5-1-x86_64 +installed = libxv-1.0.13-1-x86_64 +installed = libxxf86vm-1.1.7-1-x86_64 +installed = libyaml-0.2.5-3-x86_64 +installed = libyuv-r2426+464c51a03-1-x86_64 +installed = libzip-1.11.4-1-x86_64 +installed = libzmf-0.0.2-20-x86_64 +installed = licenses-20240728-1-any +installed = lilv-0.28.0-1-x86_64 +installed = linux-api-headers-7.1-1-x86_64 +installed = linux-firmware-20260519-1-any +installed = linux-firmware-amdgpu-20260519-1-any +installed = linux-firmware-atheros-20260519-1-any +installed = linux-firmware-broadcom-20260519-1-any +installed = linux-firmware-cirrus-20260519-1-any +installed = linux-firmware-intel-20260519-1-any +installed = linux-firmware-mediatek-20260519-1-any +installed = linux-firmware-nvidia-20260519-1-any +installed = linux-firmware-other-20260519-1-any +installed = linux-firmware-radeon-20260519-1-any +installed = linux-firmware-realtek-20260519-1-any +installed = linux-firmware-whence-20260519-1-any +installed = linux-zen-7.0.12.zen1-1-x86_64 +installed = linux-zen-headers-7.0.12.zen1-1-x86_64 +installed = litehtml0.9-0.9-2-x86_64 +installed = littlenavmap-bin-3.0.18-1-x86_64 +installed = lld-22.1.6-1-x86_64 +installed = llvm-22.1.6-1-x86_64 +installed = llvm-libs-22.1.6-1-x86_64 +installed = lm_sensors-1:3.6.2-1-x86_64 +installed = lmdb-0.9.35-1-x86_64 +installed = localsearch-3.11.1-1-x86_64 +installed = log4cplus-2.1.2-1-x86_64 +installed = loupe-50.0-1-x86_64 +installed = lpsolve-5.5.2.14-1-x86_64 +installed = lsb-release-2.0.r55.a25a4fc-1-any +installed = lsof-4.99.6-1-x86_64 +installed = lua-5.5.0-2-x86_64 +installed = lua54-5.4.8-6-x86_64 +installed = lv2-1.18.10-2-x86_64 +installed = lz4-1:1.10.0-2-x86_64 +installed = lzo-2.10-5-x86_64 +installed = m4-1.4.21-2-x86_64 +installed = mailcap-2.1.54-2-any +installed = make-4.4.1-3-x86_64 +installed = manifold-3.4.1-1-x86_64 +installed = materialx-1.39.4-5-x86_64 +installed = md4c-0.5.3-1-x86_64 +installed = mdadm-4.6-2-x86_64 +installed = mesa-1:26.1.2-2-x86_64 +installed = meson-1.11.1-3-any +installed = mingw-w64-binutils-2.46.0-1-x86_64 +installed = mingw-w64-crt-14.0.0-1-any +installed = mingw-w64-gcc-16.1.0-1-x86_64 +installed = mingw-w64-headers-14.0.0-1-any +installed = mingw-w64-winpthreads-14.0.0-1-any +installed = miniupnpc-2.3.3-3-x86_64 +installed = minizip-1:1.3.2-3-x86_64 +installed = minizip-ng-4.2.1-1-x86_64 +installed = mkinitcpio-41-4-any +installed = mkinitcpio-busybox-1.36.1-1-x86_64 +installed = mobile-broadband-provider-info-20251101-1-any +installed = mpdecimal-4.0.1-3-x86_64 +installed = mpfr-4.2.2-1-x86_64 +installed = mpg123-1.33.5-1-x86_64 +installed = mtdev-1.1.7-1-x86_64 +installed = mtools-1:4.0.49-1-x86_64 +installed = muparser-2.3.5-2-x86_64 +installed = nano-9.0-1-x86_64 +installed = nanobind-2.12.0-3-any +installed = nautilus-50.2.2-1-x86_64 +installed = ncurses-6.6-2-x86_64 +installed = ndctl-84-1-x86_64 +installed = neon-0.37.1-1-x86_64 +installed = nettle-4.0-1-x86_64 +installed = network-manager-applet-1.36.0-2-x86_64 +installed = networkmanager-1.56.1-1-x86_64 +installed = nextcloud-client-2:33.0.5-1-x86_64 +installed = nftables-1:1.1.6-3-x86_64 +installed = ninja-1.13.2-3-x86_64 +installed = niri-26.04-1-x86_64 +installed = nm-connection-editor-1.36.0-2-x86_64 +installed = node-gyp-13.0.0-1-any +installed = nodejs-26.2.0-1-x86_64 +installed = nodejs-nopt-10.0.1-1-any +installed = noto-fonts-emoji-1:2.051-1-any +installed = npm-11.16.0-1-any +installed = npth-1.8-1-x86_64 +installed = nspr-4.39-1-x86_64 +installed = nss-3.125-1-x86_64 +installed = numactl-2.0.19-1-x86_64 +installed = nwg-look-1.1.1-3-x86_64 +installed = obsidian-1.12.7-2-x86_64 +installed = ocl-icd-2.3.4-1-x86_64 +installed = onetbb-2023.0.0-1-x86_64 +installed = oniguruma-6.9.10-1-x86_64 +installed = openal-1.25.2-1-x86_64 +installed = opencolorio-2.5.1-1-x86_64 +installed = opencore-amr-0.1.6-2-x86_64 +installed = openexr-3.4.12-2-x86_64 +installed = openh264-2.6.0-2-x86_64 +installed = openimagedenoise-2.4.1-2-x86_64 +installed = openimageio-3.1.12.1-2-x86_64 +installed = openjpeg2-2.5.4-1-x86_64 +installed = openjph-0.28.1-1-x86_64 +installed = openpgl-0.7.1-1-x86_64 +installed = openpomodoro-0.3.0-2-x86_64 +installed = openshadinglanguage-1.15.3.0-1-x86_64 +installed = openssh-10.3p1-1-x86_64 +installed = openssl-3.6.3-1-x86_64 +installed = opensubdiv-3.7.0-1-x86_64 +installed = openvdb-13.0.0-1-x86_64 +installed = openxr-1.1.60-1-x86_64 +installed = opus-1.6.1-1-x86_64 +installed = orc-0.4.42-1-x86_64 +installed = osinfo-db-20251212-1-any +installed = ostree-2025.7-3-x86_64 +installed = otf-font-awesome-7.2.0-1-any +installed = p11-kit-0.26.2-1-x86_64 +installed = pacman-7.1.0.r9.g54d9411-2-x86_64 +installed = pacman-contrib-1.13.1-1-x86_64 +installed = pacman-mirrorlist-20260610-1-any +installed = pahole-1:1.31-2-x86_64 +installed = pam-1.7.2-2-x86_64 +installed = pambase-20260614-1-any +installed = pango-1:1.57.1-1-x86_64 +installed = pangomm-2.46.4-3-x86_64 +installed = pangomm-2.48-2.56.1-2-x86_64 +installed = papers-50.2-1-x86_64 +installed = papirus-folders-1.14.0-1-any +installed = papirus-icon-theme-20250501-1-any +installed = parallel-20260522-1-any +installed = parted-3.7-1-x86_64 +installed = paru-2.1.0-2-x86_64 +installed = patch-2.8-1-x86_64 +installed = pavucontrol-1:6.2-1-x86_64 +installed = pciutils-3.15.0-1-x86_64 +installed = pcre-8.45-4-x86_64 +installed = pcre2-10.47-1-x86_64 +installed = pcsclite-2.5.1-1-x86_64 +installed = pcsx2-git-2.7.419.r0.ge0566546c6-1-x86_64 +installed = perl-5.42.2-1-x86_64 +installed = perl-error-0.17030-3-any +installed = perl-mailtools-2.22-3-any +installed = perl-timedate-2.35-1-any +installed = pfetch-1.11.0-1-any +installed = phodav-3.0-4-x86_64 +installed = pinentry-1.3.2-2-x86_64 +installed = pipewire-1:1.6.6-1-x86_64 +installed = pipewire-audio-1:1.6.6-1-x86_64 +installed = pipewire-jack-1:1.6.6-1-x86_64 +installed = pipewire-pulse-1:1.6.6-1-x86_64 +installed = pipewire-session-manager-1:1.6.6-1-x86_64 +installed = pixman-0.46.4-1-x86_64 +installed = pkgconf-2.5.1-1-x86_64 +installed = playerctl-2.4.1-5-x86_64 +installed = plutosvg-0.0.8-1-x86_64 +installed = plutovg-git-1.3.3+12.r311.20260606.dd73459-1-x86_64 +installed = polkit-127-3-x86_64 +installed = polkit-gnome-0.105-12-x86_64 +installed = poppler-26.06.0-1-x86_64 +installed = poppler-data-0.4.12-2-any +installed = poppler-glib-26.06.0-1-x86_64 +installed = popt-1.19-2-x86_64 +installed = portaudio-1:19.7.0-4-x86_64 +installed = potrace-1.16-5-x86_64 +installed = pps-tools-1.0.3-2-x86_64 +installed = procps-ng-4.0.6-2-x86_64 +installed = psmisc-23.7-2-x86_64 +installed = ptex-2.5.2-1-x86_64 +installed = pugixml-1.15-3-x86_64 +installed = pyalpm-0.11.1-1-x86_64 +installed = pybind11-3.0.4-1-any +installed = pyside6-6.11.1-1-x86_64 +installed = pystring-1.2.0-1-x86_64 +installed = python-3.14.5-1-x86_64 +installed = python-autocommand-2.2.2-9-any +installed = python-cairo-1.29.0-2-x86_64 +installed = python-certifi-2026.05.20-1-any +installed = python-charset-normalizer-3.4.7-1-x86_64 +installed = python-gobject-3.56.3-1-x86_64 +installed = python-idna-3.18-1-any +installed = python-imageio-2.37.3-1-any +installed = python-imageio-ffmpeg-0.6.0-2-any +installed = python-jaraco.collections-5.1.0-3-any +installed = python-jaraco.context-6.1.2-1-any +installed = python-jaraco.functools-4.1.0-3-any +installed = python-jaraco.text-4.0.0-4-any +installed = python-jinja-1:3.1.6-3-any +installed = python-markupsafe-3.0.3-1-x86_64 +installed = python-more-itertools-11.1.0-1-any +installed = python-numpy-2.4.6-1-x86_64 +installed = python-opengl-3.1.10-3-any +installed = python-packaging-26.2-1-any +installed = python-pillow-12.2.0-1-x86_64 +installed = python-pkg_resources-81.0.0-1-any +installed = python-platformdirs-4.10.0-1-any +installed = python-pyqt6-6.11.0-2-x86_64 +installed = python-pyqt6-sip-13.11.1-1-x86_64 +installed = python-requests-2.34.2-1-any +installed = python-screeninfo-0.8.1-2-any +installed = python-setproctitle-1.3.7-2-x86_64 +installed = python-setuptools-1:82.0.1-1-any +installed = python-tqdm-4.68.2-1-any +installed = python-typing_extensions-4.15.0-3-any +installed = python-urllib3-2.7.0-1-any +installed = python-wheel-0.47.0-1-any +installed = qemu-audio-alsa-11.0.1-1-x86_64 +installed = qemu-audio-dbus-11.0.1-1-x86_64 +installed = qemu-audio-jack-11.0.1-1-x86_64 +installed = qemu-audio-oss-11.0.1-1-x86_64 +installed = qemu-audio-pa-11.0.1-1-x86_64 +installed = qemu-audio-pipewire-11.0.1-1-x86_64 +installed = qemu-audio-sdl-11.0.1-1-x86_64 +installed = qemu-audio-spice-11.0.1-1-x86_64 +installed = qemu-base-11.0.1-1-x86_64 +installed = qemu-block-curl-11.0.1-1-x86_64 +installed = qemu-block-dmg-11.0.1-1-x86_64 +installed = qemu-block-nfs-11.0.1-1-x86_64 +installed = qemu-block-ssh-11.0.1-1-x86_64 +installed = qemu-chardev-spice-11.0.1-1-x86_64 +installed = qemu-common-11.0.1-1-x86_64 +installed = qemu-desktop-11.0.1-1-x86_64 +installed = qemu-hw-display-qxl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-gl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-pci-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-pci-gl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-pci-rutabaga-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-rutabaga-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-vga-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-vga-gl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-vga-rutabaga-11.0.1-1-x86_64 +installed = qemu-hw-uefi-vars-11.0.1-1-x86_64 +installed = qemu-hw-usb-host-11.0.1-1-x86_64 +installed = qemu-hw-usb-redirect-11.0.1-1-x86_64 +installed = qemu-hw-usb-smartcard-11.0.1-1-x86_64 +installed = qemu-img-11.0.1-1-x86_64 +installed = qemu-system-x86-11.0.1-1-x86_64 +installed = qemu-system-x86-firmware-11.0.1-1-x86_64 +installed = qemu-ui-curses-11.0.1-1-x86_64 +installed = qemu-ui-dbus-11.0.1-1-x86_64 +installed = qemu-ui-egl-headless-11.0.1-1-x86_64 +installed = qemu-ui-gtk-11.0.1-1-x86_64 +installed = qemu-ui-opengl-11.0.1-1-x86_64 +installed = qemu-ui-sdl-11.0.1-1-x86_64 +installed = qemu-ui-spice-app-11.0.1-1-x86_64 +installed = qemu-ui-spice-core-11.0.1-1-x86_64 +installed = qemu-vhost-user-gpu-11.0.1-1-x86_64 +installed = qpdf-12.3.2-2-x86_64 +installed = qt5-base-5.15.19+kde+r96-1-x86_64 +installed = qt5-declarative-5.15.19+kde+r23-1-x86_64 +installed = qt5-svg-5.15.19+kde+r5-1-x86_64 +installed = qt5-translations-5.15.19-1-any +installed = qt6-5compat-6.11.1-1-x86_64 +installed = qt6-base-6.11.1-1-x86_64 +installed = qt6-declarative-6.11.1-3-x86_64 +installed = qt6-positioning-6.11.1-1-x86_64 +installed = qt6-shadertools-6.11.1-1-x86_64 +installed = qt6-svg-6.11.1-1-x86_64 +installed = qt6-tools-6.11.1-3-x86_64 +installed = qt6-translations-6.11.1-1-any +installed = qt6-wayland-6.11.1-1-x86_64 +installed = qt6-webchannel-6.11.1-1-x86_64 +installed = qt6-webengine-6.11.1-3-x86_64 +installed = qt6-websockets-6.11.1-1-x86_64 +installed = qtkeychain-qt6-0.16.0-1-x86_64 +installed = rapidyaml-0.11.1-2-x86_64 +installed = raptor-2.0.16-9-x86_64 +installed = rasqal-1:0.9.33-9-x86_64 +installed = rav1e-0.8.1-2-x86_64 +installed = rdma-core-63.0-2-x86_64 +installed = re2-2:2025.11.05-5-x86_64 +installed = readline-8.3.003-1-x86_64 +installed = redland-1:1.0.17-10-x86_64 +installed = reflector-2023-5-any +installed = retroarch-1.22.2-1-x86_64 +installed = rhash-1.4.6-1-x86_64 +installed = ripgrep-15.1.0-4-x86_64 +installed = robin-map-1.4.1-1-x86_64 +installed = rofi-2.0.0-1-x86_64 +installed = rofi-calc-2.5.1-1-x86_64 +installed = rofi-themes-collection-git-1:r28.43ec2f5-1-any +installed = rpcs3-bin-0.0.41.19433-1-x86_64 +installed = rsync-3.4.4-1-x86_64 +installed = rtkit-0.14-1-x86_64 +installed = rubberband-4.0.0-2-x86_64 +installed = run-parts-5.23.2-1-x86_64 +installed = rutabaga-ffi-0.1.75-1-x86_64 +installed = sbc-2.2-1-x86_64 +installed = scdoc-1.11.4-1-x86_64 +installed = scenefx0.4-0.4.1-2-x86_64 +installed = sdbus-cpp-2.3.1-1-x86_64 +installed = sdl2-compat-2.32.70-1-x86_64 +installed = sdl2_image-2.8.12-1-x86_64 +installed = sdl3-3.4.10-1-x86_64 +installed = seabios-1.17.0-2-any +installed = seatd-0.9.3-1-x86_64 +installed = sed-4.10-1-x86_64 +installed = semver-7.8.2-1-any +installed = serd-0.32.10-1-x86_64 +installed = shaderc-2026.2-1-x86_64 +installed = shadow-4.19.4.arch1-1-x86_64 +installed = shared-mime-info-2.4-3-x86_64 +installed = shiboken6-6.11.1-1-x86_64 +installed = signal-desktop-8.14.0-1-x86_64 +installed = simdjson-1:4.6.4-1-x86_64 +installed = slang-2.3.3-4-x86_64 +installed = slurp-1.5.0-2-x86_64 +installed = smbclient-2:4.24.3-1-x86_64 +installed = snappy-1.2.2-3-x86_64 +installed = sndio-1.10.0-1-x86_64 +installed = sord-0.16.22-1-x86_64 +installed = sound-theme-freedesktop-0.8-6-any +installed = source-highlight-3.1.9-18-x86_64 +installed = spandsp-0.0.6-7-x86_64 +installed = spdlog-1.17.0-2-x86_64 +installed = speex-1.2.1-2-x86_64 +installed = speexdsp-1.2.1-2-x86_64 +installed = spice-0.16.0-2-x86_64 +installed = spice-gtk-0.42-5-x86_64 +installed = spice-protocol-0.14.5-1-any +installed = spirv-tools-1:1.4.350.0-1-x86_64 +installed = sqlite-3.53.2-1-x86_64 +installed = sratom-0.6.22-1-x86_64 +installed = srt-1.5.5-1-x86_64 +installed = startup-notification-0.12-9-x86_64 +installed = steam-1.0.0.85-7-x86_64 +installed = steam-devices-1.0.0.85-7-x86_64 +installed = sudo-1.9.17.p2-2-x86_64 +installed = suitesparse-7.12.2-2-x86_64 +installed = svt-av1-4.1.0-1-x86_64 +installed = swaybg-1.2.2-1-x86_64 +installed = swayfx-0.5.3-4-x86_64 +installed = swig-4.4.1-1-x86_64 +installed = swtpm-0.10.1-2-x86_64 +installed = systemd-260.2-2-x86_64 +installed = systemd-libs-260.2-2-x86_64 +installed = systemd-sysvcompat-260.2-2-x86_64 +installed = taglib-2.3-1-x86_64 +installed = talloc-2.4.4-1-x86_64 +installed = tar-1.35-2-x86_64 +installed = tdb-1.4.15-1-x86_64 +installed = tevent-1:0.17.1-2-x86_64 +installed = texinfo-7.3-1-x86_64 +installed = thunderbird-151.0.1-1-x86_64 +installed = thunderbird-gnome-theme-git-r95.c61b897-1-any +installed = thunderbird-i18n-de-151.0.1-1-x86_64 +installed = thunderbird-ublock-origin-1.70.0-1-any +installed = timeshift-25.12.4-1-x86_64 +installed = timeshift-autosnap-0.10.0-1-any +installed = tinysparql-3.11.1-1-x86_64 +installed = tomlplusplus-3.4.0-2-x86_64 +installed = totem-pl-parser-3.26.7-1-x86_64 +installed = tpm2-tss-4.1.3-1-x86_64 +installed = transmission-gtk-4.1.1-1-x86_64 +installed = tslib-1.24-1-x86_64 +installed = ttc-iosevka-34.6.1-1-any +installed = ttc-iosevka-aile-34.6.1-1-any +installed = ttc-iosevka-curly-34.6.1-1-any +installed = ttc-iosevka-curly-slab-34.6.1-1-any +installed = ttc-iosevka-etoile-34.6.1-1-any +installed = ttf-iosevka-nerd-3.4.0-2-any +installed = ttf-iosevkaterm-nerd-3.4.0-2-any +installed = ttf-liberation-2.1.5-2-any +installed = ttf-nerd-fonts-symbols-3.4.0-1-any +installed = ttf-nerd-fonts-symbols-common-3.4.0-1-any +installed = twolame-0.4.0-4-x86_64 +installed = tzdata-2026b-1-x86_64 +installed = uchardet-0.0.8-4-x86_64 +installed = udisks2-2.11.1-2-x86_64 +installed = unzip-6.0-23-x86_64 +installed = upower-1.91.2-1-x86_64 +installed = usbredir-0.15.0-1-x86_64 +installed = usbutils-019-1-x86_64 +installed = usd-26.05-3-x86_64 +installed = util-linux-2.42.1-1-x86_64 +installed = util-linux-libs-2.42.1-1-x86_64 +installed = uv-0.11.21-1-x86_64 +installed = v4l-utils-1.32.0-2-x86_64 +installed = vapoursynth-76-1-x86_64 +installed = vde2-2.3.3-8-x86_64 +installed = vid.stab-1.1.1-2-x86_64 +installed = vim-9.2.0653-1-x86_64 +installed = vim-runtime-9.2.0653-1-x86_64 +installed = virglrenderer-1.3.0-2-x86_64 +installed = virt-install-5.1.0-3-any +installed = virt-manager-5.1.0-3-any +installed = virtiofsd-1.13.3-1-x86_64 +installed = vmaf-3.1.0-1-x86_64 +installed = volume_key-0.3.12-12-x86_64 +installed = vte-common-0.84.0-1-x86_64 +installed = vte3-0.84.0-1-x86_64 +installed = vulkan-headers-1:1.4.350.0-1-any +installed = vulkan-icd-loader-1.4.350.0-1-x86_64 +installed = vulkan-mesa-implicit-layers-1:26.1.2-2-x86_64 +installed = vulkan-radeon-1:26.1.2-2-x86_64 +installed = vulkan-tools-1.4.350.0-1-x86_64 +installed = wavpack-5.9.0-1-x86_64 +installed = waybar-0.15.0-2-x86_64 +installed = wayland-1.25.0-1-x86_64 +installed = wayland-protocols-1.49-1-any +installed = waypaper-2.8-1-any +installed = webkit2gtk-4.1-2.52.4-1-x86_64 +installed = webkitgtk-6.0-2.52.4-1-x86_64 +installed = webrtc-audio-processing-1-1.3-5-x86_64 +installed = wget-1.25.0-5-x86_64 +installed = which-2.25-1-x86_64 +installed = wine-11.11-1-x86_64 +installed = winetricks-20260125-2-any +installed = wireplumber-0.5.14-1-x86_64 +installed = wl-clipboard-1:2.3.0-1-x86_64 +installed = wlroots0.19-0.19.3-1-x86_64 +installed = wlroots0.20-0.20.1-1-x86_64 +installed = wlsunset-0.4.0-1-x86_64 +installed = woff2-1.0.2-6-x86_64 +installed = wolfssl-5.9.1-1-x86_64 +installed = wpa_supplicant-2:2.11-5-x86_64 +installed = x264-3:0.165.r3222.b35605a-2-x86_64 +installed = x265-4.1-1-x86_64 +installed = xapp-3.2.2-1-x86_64 +installed = xapp-symbolic-icons-1.1.0-1-any +installed = xcb-imdkit-1.0.9-1-x86_64 +installed = xcb-proto-1.17.0-4-any +installed = xcb-util-0.4.1-2-x86_64 +installed = xcb-util-cursor-0.1.6-1-x86_64 +installed = xcb-util-errors-1.0.1-2-x86_64 +installed = xcb-util-image-0.4.1-3-x86_64 +installed = xcb-util-keysyms-0.4.1-5-x86_64 +installed = xcb-util-renderutil-0.3.10-2-x86_64 +installed = xcb-util-wm-0.4.2-2-x86_64 +installed = xcur2png-0.7.1-9-x86_64 +installed = xdg-dbus-proxy-0.1.7-1-x86_64 +installed = xdg-desktop-portal-1.22.0-1-x86_64 +installed = xdg-desktop-portal-gtk-1.15.3-1-x86_64 +installed = xdg-desktop-portal-hyprland-1.3.12-2-x86_64 +installed = xdg-terminal-exec-0.14.0-1-any +installed = xdg-user-dirs-0.20-1-x86_64 +installed = xdg-user-dirs-gtk-0.16-1-x86_64 +installed = xdg-utils-1.2.1-2-any +installed = xdotool-4.20260303.1-1-x86_64 +installed = xenia-canary-bin-02d2cb5-2-x86_64 +installed = xenia-edge-bin-20260614125312.ce9fb29-1-x86_64 +installed = xkeyboard-config-2.47-1-any +installed = xmlsec-1.3.11-1-x86_64 +installed = xorg-fonts-encodings-1.1.0-2-any +installed = xorg-server-common-21.1.23-1-x86_64 +installed = xorg-setxkbmap-1.3.5-1-x86_64 +installed = xorg-xkbcomp-1.5.0-1-x86_64 +installed = xorg-xprop-1.2.8-1-x86_64 +installed = xorg-xrandr-1.5.4-1-x86_64 +installed = xorg-xwayland-24.1.12-1-x86_64 +installed = xorgproto-2025.1-1-any +installed = xvidcore-1.3.7-3-x86_64 +installed = xxhash-0.8.3-1-x86_64 +installed = xz-5.8.3-1-x86_64 +installed = yaml-cpp-0.9.0-1-x86_64 +installed = yazi-26.5.6-4-x86_64 +installed = zenity-4.2.2-1-x86_64 +installed = zeromq-4.3.5-3-x86_64 +installed = zimg-3.0.6-1-x86_64 +installed = zint-2.16.0-2-x86_64 +installed = zix-0.8.2-1-x86_64 +installed = zlib-1:1.3.2-3-x86_64 +installed = zlib-ng-2.3.3-1-x86_64 +installed = zram-generator-1.2.1-1-x86_64 +installed = zsh-5.9.1-1-x86_64 +installed = zstd-1.5.7-3-x86_64 +installed = zxing-cpp-3.0.2-1-x86_64 diff --git a/packaging/tanin-desktop/pkg/tanin-desktop/.MTREE b/packaging/tanin-desktop/pkg/tanin-desktop/.MTREE new file mode 100644 index 0000000000000000000000000000000000000000..a2f07b44a699c53d3004268908fab8774ec311aa GIT binary patch literal 216 zcmV;}04M(+iwFP!000001AWfBP6ROwh2eglA`<- zDB$TCC@E-8b)@gVTF1NUbl7y5@%g5yFRyAomX^Sre|Nn!O-wY+hxz*XbboVtI6j)O zteP-HjOc>J8O*kPX(A8g&GwS5=eC@68wtIL?VU?0jY(bYBwb2HhL9UsfX3`K)_{_2 z2#V1csg*(wRgiz&r@Pz#RCN3Y^;lvog*ki0g2+w+sNEkHq-wWrXI+= SD!%O@G<^e}0S(F+0RRAS1Z7G9 literal 0 HcmV?d00001 diff --git a/packaging/tanin-desktop/pkg/tanin-desktop/.PKGINFO b/packaging/tanin-desktop/pkg/tanin-desktop/.PKGINFO new file mode 100644 index 0000000..29081d0 --- /dev/null +++ b/packaging/tanin-desktop/pkg/tanin-desktop/.PKGINFO @@ -0,0 +1,55 @@ +# Generated by makepkg 7.1.0 +# using fakeroot version 1.37.2 +pkgname = tanin-desktop +pkgbase = tanin-desktop +xdata = pkgtype=pkg +pkgver = 0.2.0-1 +pkgdesc = TANINUX desktop — metapackage pulling the full niri/eww environment +url = https://taninux.kgva.ch +builddate = 1781813721 +packager = Unknown Packager +size = 0 +arch = any +license = GPL-3.0-or-later +depend = taninux +depend = tanin-greet +depend = tanin-libadwaita +depend = tanin-eww +depend = tanin-setup +depend = niri +depend = greetd +depend = cage +depend = xdg-desktop-portal +depend = xdg-desktop-portal-gtk +depend = xdg-desktop-portal-gnome +depend = eww +depend = tiramisu +depend = waypaper +depend = cliphist +depend = foot +depend = jq +depend = wl-clipboard +depend = xdg-utils +depend = libqalculate +depend = grim +depend = slurp +depend = networkmanager +depend = bluez +depend = bluez-utils +depend = pipewire +depend = pipewire-pulse +depend = wireplumber +depend = brightnessctl +depend = playerctl +depend = flatpak +depend = pacman-contrib +depend = adw-gtk3 +depend = adwaita-icon-theme +depend = papirus-icon-theme +depend = inter-font +depend = ttf-iosevka-nerd +optdepend = paru: AUR support in the Software Hub (opt-in) +optdepend = wlsunset: night light +optdepend = cups: printer management +optdepend = timeshift: system snapshots/backups +optdepend = waybar: fallback bar if eww is missing (launch.sh falls back to it) diff --git a/packaging/tanin-desktop/tanin-desktop-0.2.0-1-any.pkg.tar.zst b/packaging/tanin-desktop/tanin-desktop-0.2.0-1-any.pkg.tar.zst new file mode 100644 index 0000000000000000000000000000000000000000..b64f74adab5ee4cc9531ae7e57cac55b9385775f GIT binary patch literal 11699 zcmV;kElkoVwJ-eyST$_{8s8C8MWC)EX#+$E(m%swUxO({O`$7}D>dH>Tj;!wHPp7& zEwcA_cklL-NJ^3SlYo+=CZhg?ZLJYPBy!Q@h#3>mf|M!!`~va>*aX=GaKut}ghC26 zs-1(X(GD{Gh%nfYE*Vt(X2*dXH#d}&)V1I2sDIzyI*UT9m)8k)w>U@WZk^!mok;Qb@+Ac^NNKn2V}_V`3Mr2BFR2m=q>=qwkdkU; z(%(YK<2#LGW{x-h=Z*!X_7PtEGc%O7{-Cxsxiyx8nD!W?`Y8x|olsh+(a~m<(CTX) z$9MYHtk8lM#p+vg1FfzZ`^9x)9RsQMpVTIWR=1B2$816k2C1&>)v7e3&}#bCDdccV z)ph*RDk-*YJ${wcElVMV7KZ8tDL&oh=ot9^Q$IR}LJGCN%%VbTHJmIWhV%1VOK8LF zam;G#kVtP|x9)nOq?$dQ%(D8N10}??Pl|74u94I}a|%lBkU7=ZF^eVMSd3pmWkWS- zS!wlk%-lPVt-EG!QIP8EmbGi3gjBEk6$+)U%tk!6mKl8^wY9Hfar=m=oea~a97y3y z>1`jI24cFxb8HP#3#oRO#>P-ER9k=3V_QmJ78|`#11UY}eFjU4d845iM!^w@VMjCz zTJxKtkm`$BV-!*l)6Z(v(INhn_RE?=sp

lVLVtIw6HrWb>tU+%D<$h_eoqC{+K$ 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 avoids the "double frame" look; depth comes from a soft drop +// shadow plus a 1px inner top highlight (the Apple glass edge). +.dock-hot { background-color: transparent; } +// left-edge hover strip that opens the dock (niri has no cursor-pos IPC). +.dock-trigger { background-color: transparent; min-width: 6px; } +// the glassy box IS the eventbox (single styled element — no theme rectangle +// behind it). The inner layout box stays transparent. +.dock-evt { background-color: transparent; background-image: none; } +.dock { + background-color: rgba(15, 15, 15, 0.45); + border-radius: 22px; + padding: 10px 8px; + margin: 0; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12); +} +.dock-inner { background-color: transparent; } +.dock-icon { + min-width: 42px; + min-height: 42px; + background-size: contain; + background-repeat: no-repeat; + background-position: center; +} +.dock-item { + padding: 4px; + border-radius: 14px; +} +.dock-item:hover { background-color: rgba(255, 255, 255, 0.10); } +.dock-item.unpinned { opacity: 0.92; } +.dock-dot { + min-width: 4px; + min-height: 4px; + border-radius: 999px; + background-color: transparent; // reserve space so icons stay aligned +} +.dock-dot.on { background-color: $fg; } // white running indicator +.dock-dot-spacer { min-width: 4px; } // matches the dot, keeps icon centred + +// ---- dock right-click menu ------------------------------------------------ +.dock-menu-backdrop { background-color: transparent; } +.dock-catcher { background-color: transparent; } +.panel-backdrop { background-color: transparent; } +.spot-backdrop { background-color: transparent; } + +// even opacity fade for the top panels (content pre-rendered at opacity 0, then +// only opacity animates → no size change, no re-layout → perfectly smooth) +.panel-fade { opacity: 0; transition: opacity 100ms ease-in-out; } +.panel-fade.shown { opacity: 1; } +.dock-menu { + background-color: rgba(16, 16, 20, 0.93); + border-radius: 16px; + padding: 6px; + margin: 6px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.10); +} +.dock-menu-title { + color: $muted; + font-size: 11px; + font-weight: 700; + padding: 4px 12px 4px 12px; +} +.dock-menu-item { + color: $fg; + font-size: 13px; + padding: 8px 12px; + border-radius: 10px; +} +.dock-menu-item:hover { background-color: $accent-14; color: $accent; } +.dock-menu-item.danger:hover { background-color: rgba(220, 90, 90, 0.22); color: #ff7a7a; } +.dock-menu-ws { color: $accent; font-size: 11px; font-weight: 700; } +.dock-menu-sep { + min-height: 1px; + background-color: rgba(255, 255, 255, 0.08); + margin: 4px 8px; +} + +// ---- notifications -------------------------------------------------------- +.notif-list { margin-top: 6px; } +.notif-head { margin-bottom: 2px; } +.notif-clear { + color: $muted; + font-size: 12px; + padding: 2px 10px; + border-radius: 999px; +} +.notif-clear:hover { color: $accent; background-color: $bg-alt; } +.notif-empty { color: $muted; font-size: 13px; padding: 4px 2px; } + +.notif-card { + background-color: $bg-alt; + border: 1px solid rgba(255, 255, 255, 0.04); + border-radius: 14px; + padding: 10px 12px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.4); +} +.notif-app { color: $accent; font-size: 11px; font-weight: 700; } +.notif-time { color: $muted; font-size: 11px; } +.notif-summary { color: $fg; font-size: 13px; font-weight: 600; } +.notif-body { color: $muted; font-size: 12px; } +.notif-x { + color: $muted; + font-size: 14px; + padding: 0 4px; + border-radius: 8px; +} +.notif-x:hover { color: $fg; background-color: $bg-hi; } + +// the top-right toast: same card look, a touch more presence. +// Keep the shadow blur smaller than the margin below, otherwise GTK clips it +// to the window rectangle and the rounded corners look square. +.notif-popup { + border: 1px solid $accent-22; + margin: 10px 10px 14px 10px; // right = gaps_out (10) so it lines up with windows + box-shadow: 0 2px 7px rgba(0, 0, 0, 0.4); +} + +// ---- updates panel -------------------------------------------------------- +.upd-head { margin-bottom: 2px; } +.upd-count { + color: $accent; + font-size: 13px; + font-weight: 700; + background-color: $accent-14; + padding: 1px 9px; + border-radius: 999px; +} +.upd-list { padding-right: 6px; } +.upd-row { padding: 5px 8px; border-radius: 8px; } +.upd-row:hover { background-color: $bg-alt; } +.upd-name { color: $fg; font-size: 13px; } +.upd-old { color: $muted; font-size: 12px; } +.upd-arrow { color: $muted; font-size: 12px; } +.upd-new { color: $accent; font-size: 12px; font-weight: 600; } +.upd-all { margin-top: 4px; } + +// ---- control-center now-playing ------------------------------------------- +.cc-music { + background-color: $bg-alt; + border: 1px solid rgba(255, 255, 255, 0.04); + border-radius: 16px; + padding: 10px 12px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.04); +} +.cc-cover { + min-width: 52px; + min-height: 52px; + border-radius: 12px; + background-color: $bg-hi; + background-size: cover; + background-position: center; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.4); +} +.cc-cover-fallback { font-size: 24px; color: $muted; } +.cc-m-title { font-size: 14px; font-weight: 700; color: $fg; } +.cc-m-artist { font-size: 12px; color: $muted; } +.cc-m-controls { margin-top: 4px; } +.cc-m-btn { + font-size: 18px; + color: $fg; + padding: 2px 4px; + border-radius: 8px; +} +.cc-m-btn:hover { color: $accent; background-color: $bg-hi; } +.cc-m-btn.play { color: $accent; } + +// =========================================================================== +// LIGHT ("Shibui") — applied to panels/dock when GNOME is in light mode. +// The .light class is added to each panel/dock root; the bar never gets it. +// =========================================================================== +$bg-l: #f3f1ec; // soft warm white +$bg-alt-l: #e8e4dc; // cards / tiles +$bg-hi-l: #ddd8ce; // hover +$fg-l: #2a2926; // near-black ink +$muted-l: #6f6b62; // muted ink +$border-l: rgba(0, 0, 0, 0.10); +$acc-l: $accent-dim; // darker violet reads better on white + +// ---- generic panel --------------------------------------------------------- +.panel.light { + background-color: $bg-l; + color: $fg-l; + border: 1px solid $border-l; + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.18); +} +.light .panel-title { color: $fg-l; } + +// ---- control-center tiles / actions --------------------------------------- +.light .tile { + background-color: $bg-alt-l; + color: $muted-l; + border: 1px solid $border-l; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.10), inset 0 1px 0 rgba(255, 255, 255, 0.6); +} +.light .tile:hover { background-color: $bg-hi-l; } +.light .tile.active { + background-color: $accent-14; + color: $acc-l; + border: 1px solid $accent-22; +} +.light .tile.active:hover { background-color: $accent-08; } + +.light .action { + background-color: $bg-alt-l; + color: $fg-l; + border: 1px solid $border-l; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.10), inset 0 1px 0 rgba(255, 255, 255, 0.6); +} +.light .action:hover { background-color: $accent; color: #fff; box-shadow: 0 2px 8px rgba(163, 158, 196, 0.4); } + +// ---- sliders --------------------------------------------------------------- +.light .slider-icon { color: $fg-l; } +.light .slider-val { color: $muted-l; } +.light scale trough { background-color: $bg-hi-l; } +.light scale slider { background-color: $fg-l; } +.light .metric-bar trough { background-color: $bg-hi-l; } + +// ---- audio dropdown -------------------------------------------------------- +.light .audio-caret { color: $muted-l; } +.light .audio-caret:hover { color: $fg-l; } +.light .audio-dev { background-color: $bg-alt-l; color: $muted-l; border: 1px solid $border-l; } +.light .audio-dev:hover { background-color: $bg-hi-l; color: $fg-l; } +.light .audio-dev.active { background-color: $accent-14; color: $acc-l; border: 1px solid $accent-22; } + +// ---- calendar -------------------------------------------------------------- +.light calendar { color: $fg-l; } +.light calendar.header { color: $fg-l; } +.light calendar:indeterminate { color: $muted-l; } + +// ---- music ----------------------------------------------------------------- +.light .m-title { color: $fg-l; } +.light .m-artist { color: $muted-l; } +.light .cover { background-color: $bg-alt-l; } +.light .m-btn { color: $fg-l; } +.light .m-btn:hover { background-color: $bg-alt-l; color: $acc-l; } + +// ---- sysmon ---------------------------------------------------------------- +.light .metric-icon { color: $acc-l; } + +// ---- notifications --------------------------------------------------------- +.light .notif-card { + background-color: $bg-alt-l; + border: 1px solid $border-l; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.10); +} +.light .notif-app { color: $acc-l; } +.light .notif-time { color: $muted-l; } +.light .notif-summary { color: $fg-l; } +.light .notif-body { color: $muted-l; } +.light .notif-x { color: $muted-l; } +.light .notif-x:hover { color: $fg-l; background-color: $bg-hi-l; } +.light .notif-clear { color: $muted-l; } +.light .notif-clear:hover { color: $acc-l; background-color: $bg-alt-l; } +.light .notif-empty { color: $muted-l; } + +// ---- dock (frosted white) -------------------------------------------------- +.dock.light { + background-color: rgba(243, 241, 236, 0.55); + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.22), + inset 0 1px 0 rgba(255, 255, 255, 0.55); +} +.dock.light .dock-item:hover { background-color: rgba(0, 0, 0, 0.06); } +.dock.light .dock-dot.on { background-color: $fg-l; } // dark dot on light glass + +// ---- dock menu ------------------------------------------------------------- +.dock-menu.light { + background-color: rgba(243, 241, 236, 0.96); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6); +} +.dock-menu.light .dock-menu-title { color: $muted-l; } +.dock-menu.light .dock-menu-ws { color: $acc-l; } +.dock-menu.light .dock-menu-sep { background-color: rgba(0, 0, 0, 0.12); } +.dock-menu.light .dock-menu-item { color: $fg-l; } +.dock-menu.light .dock-menu-item:hover { background-color: $accent-14; color: $acc-l; } + +// ---- updates panel (light) ------------------------------------------------- +.light .upd-count { color: $acc-l; background-color: $accent-14; } +.light .upd-row:hover { background-color: $bg-alt-l; } +.light .upd-name { color: $fg-l; } +.light .upd-old { color: $muted-l; } +.light .upd-arrow { color: $muted-l; } +.light .upd-new { color: $acc-l; } + +// ---- control-center header / power (light) -------------------------------- +.light .cc-iconbtn { color: $muted-l; } +.light .cc-iconbtn:hover { color: $fg-l; background-color: $bg-alt-l; } +.light .cc-iconbtn.active { color: $acc-l; background-color: $accent-14; } +.light .power-menu { background-color: $bg-alt-l; border: 1px solid $border-l; } +.light .power-item { color: $fg-l; } +.light .power-item:hover { background-color: $accent-14; color: $acc-l; } + +// ---- now-playing (light) --------------------------------------------------- +.light .cc-music { background-color: $bg-alt-l; border: 1px solid $border-l; } +.light .cc-cover { background-color: $bg-hi-l; } +.light .cc-m-title { color: $fg-l; } +.light .cc-m-artist { color: $muted-l; } +.light .cc-m-btn { color: $fg-l; } +.light .cc-m-btn:hover { color: $acc-l; background-color: $bg-hi-l; } +.light .cc-m-btn.play { color: $acc-l; } + +// =========================================================================== +// SPOTLIGHT LAUNCHER +// =========================================================================== +.spot { + background-color: $bg; + border: 1px solid $accent-22; + border-radius: 18px; + padding: 8px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05); +} +.spot-search { padding: 8px 12px; } +.spot-search-icon { color: $muted; font-size: 19px; } +.spot-input { + color: $fg; + font-size: 19px; + background-color: transparent; + border: none; + box-shadow: none; + caret-color: $accent; +} +.spot-list { padding: 6px 4px 2px; } +.spot-row { + padding: 7px 10px; + border-radius: 12px; + background-color: transparent; +} +.spot-row:hover { background-color: $accent-14; } +.spot-icon { min-width: 36px; } +.spot-img { + min-width: 30px; min-height: 30px; + background-size: contain; + background-repeat: no-repeat; + background-position: center; +} +.spot-glyph { color: $accent; font-size: 22px; } +.spot-title { color: $fg; font-size: 14px; } +.spot-sub { color: $muted; font-size: 11px; } + +// ---- spotlight (light) ---------------------------------------------------- +.spot.light { + background-color: $bg-l; + border: 1px solid $accent-22; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.50); +} +.spot.light .spot-search-icon { color: $muted-l; } +.spot.light .spot-input { color: $fg-l; caret-color: $acc-l; } +.spot.light .spot-row:hover { background-color: $accent-14; } +.spot.light .spot-glyph { color: $acc-l; } +.spot.light .spot-title { color: $fg-l; } +.spot.light .spot-sub { color: $muted-l; } + +// ---- spotlight category pills --------------------------------------------- +.spot-pills { padding: 6px 6px 2px; } +.spot-pill { + padding: 4px 11px; + border-radius: 999px; + background-color: rgba(255, 255, 255, 0.05); + color: $muted; +} +.spot-pill:hover { background-color: $accent-14; color: $fg; } +.spot-pill.active { background-color: $accent-22; color: $fg; } +.spot-pill-icon { font-size: 13px; } +.spot-pill-label { font-size: 12px; } +.spot.light .spot-pill { background-color: rgba(0, 0, 0, 0.05); color: $muted-l; } +.spot.light .spot-pill:hover { color: $fg-l; } +.spot.light .spot-pill.active { color: $fg-l; } + +// AUR badge in the updates panel +.upd-src.aur { + font-size: 9px; + color: $accent; + background-color: $accent-14; + border-radius: 5px; + padding: 0 4px; +} +.light .upd-src.aur { color: $acc-l; background-color: $accent-14; } + +// pill sigil hint + keyboard focus (GTK Tab traversal) +.spot-pill-key { + font-size: 10px; + color: $muted; + background-color: rgba(255, 255, 255, 0.07); + border-radius: 5px; + padding: 0 4px; + margin-left: 2px; +} +.spot-pill:focus { + background-color: $accent-22; + color: $fg; + outline: none; + box-shadow: 0 0 0 2px $accent; +} +.spot-row:focus { background-color: $accent-22; outline: none; } +.spot.light .spot-pill-key { color: $muted-l; background-color: rgba(0,0,0,0.06); } + +// in-panel update progress +.upd-prog { + background-color: $bg-alt; + border: 1px solid rgba(255, 255, 255, 0.04); + border-radius: 14px; + padding: 12px 14px; +} +.upd-prog-spin { color: $accent; font-size: 16px; } +.upd-prog-text { color: $muted; font-size: 11px; } +.light .upd-prog { background-color: $bg-alt-l; border: 1px solid $border-l; } +.light .upd-prog-spin { color: $acc-l; } +.light .upd-prog-text { color: $muted-l; } diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/eww.yuck b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/eww.yuck new file mode 100644 index 0000000..a249b10 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/eww.yuck @@ -0,0 +1,690 @@ +;; ============================================================================ +;; eww config — niri top bar + slide-in panels + dock +;; Monochrome / Fuji-accent theme. +;; Icons: Material Design Icons (nf-md-*) from Iosevka Nerd Font. +;; Repo lives in ~/eww and is symlinked to ~/.config/eww +;; ============================================================================ + +;; --------------------------------------------------------------------------- +;; DATA SOURCES (poll / listen) +;; --------------------------------------------------------------------------- + +(deflisten workspaces :initial "[]" + "scripts/workspaces.sh") + +(deflisten music + :initial {'{"status":"Stopped","title":"","artist":"","icon":"","cover":""}'} + "scripts/music.sh") + +(defpoll volume :interval "1s" + :initial {'{"percent":0,"muted":false,"icon":""}'} + "scripts/volume.sh get") + +;; audio output devices for the Control Center dropdown +(defpoll sinks :interval "3s" :initial "[]" "scripts/audio.sh sinks") +(defvar audio-menu false) + +;; dock: pinned apps (real Papirus icons) + running state +;; 4s (not 2s): the poll re-renders the icon row, which briefly re-applies hover +;; state (a small flicker). 4s keeps running-dots fresh enough with less flicker. +(defpoll dock-apps :interval "4s" :initial "[]" "scripts/dock.sh apps") +;; dock visibility — drives the slide-in/out revealer (window stays mapped). +(defvar dock-open false) +;; panel + spotlight slide animation (one panel open at a time → one shared var). +(defvar panel-open false) +(defvar spot-open false) + +;; live settings from TANINUX panel.json (pushed via eww update by panelcfg.sh) +(defvar cfg-icon-size 42) +(defvar cfg-modules {'{"music":true,"sys":true,"updates":true,"net":true,"bt":true,"vol":true}'}) + +;; GNOME light/dark — panels follow it (the bar stays dark). "light" = Shibui. +;; Polled (not a gsettings-monitor deflisten — that dies in eww's spawn env). +(defpoll colorscheme :interval "2s" :initial "dark" "scripts/colorscheme.sh get") +;; right-click context-menu target +(defvar dock-sel-class "") +(defvar dock-sel-exec "") +(defvar dock-sel-pinned false) +(defvar dock-sel-running false) +(defvar dock-sel-windows "[]") ; open windows of the selected app (multi-instance) + +(defpoll network :interval "5s" + :initial {'{"icon":"","label":"…"}'} + "scripts/network.sh status") + +(defpoll bluetooth :interval "5s" + :initial {'{"icon":"","label":"…","on":false}'} + "scripts/bluetooth.sh status") + +(defpoll updates-list :interval "900s" :initial "[]" "scripts/updates.sh list") +(defvar updates-open true) ; dropdown state in the updates panel +(defvar upd-running false) ; a system update is in progress (panel shows progress) +(defvar upd-progress "") ; latest line of the running update +(defvar power-open false) ; power dropdown in the control center +(defpoll nightlight :interval "5s" :initial "true" "scripts/night.sh status") +;; DnD is our own flag now (mako is gone — replaced by tiramisu + eww). +(defpoll dnd :interval "2s" :initial "false" "scripts/notifications.sh dnd-get") + +;; Notifications: pushed in by scripts/notifications.sh via `eww update`. +;; notifications — full history (newest first), rendered in the Control Center +;; popup — the single toast currently shown top-right +(defvar notifications "[]") +(defvar popup {'{"id":"0","app":"","summary":"","body":"","time":""}'}) + +;; Spotlight launcher — query text + active category + results +(defvar spot-q "") +(defvar spot-mode "apps") +(defvar spot-results "[]") + +(defpoll sys :interval "2s" + :initial {'{"cpu":0,"mem":0,"disk":0,"temp":0}'} + "scripts/sysinfo.sh") + +(defpoll time :interval "10s" :initial "" "scripts/clock.sh") + +;; --------------------------------------------------------------------------- +;; THE BAR +;; --------------------------------------------------------------------------- + +(defwidget bar [] + (centerbox :class "bar" :vexpand true + (left) + (center) + (right))) + +(defwidget left [] + (box :halign "start" :valign "center" :space-evenly false + (workspaces))) + +(defwidget center [] + (box :halign "center" :valign "center" :space-evenly false + (clock))) + +(defwidget right [] + (box :halign "end" :valign "center" :space-evenly false :spacing 14 + (sys-mini) + (updates-mod) + (net) + (bt) + (vol))) + +;; --- workspaces ------------------------------------------------------------- +(defwidget workspaces [] + (eventbox + :onscroll "test {} = up && scripts/ws.sh cycle up || scripts/ws.sh cycle down" + (box :class "workspaces" :space-evenly false :spacing 6 + (for ws in workspaces + (button + :class {ws.active ? "ws active" : (ws.windows > 0 ? "ws occupied" : "ws")} + :onclick "scripts/ws.sh switch ${ws.id}" + "${ws.id}"))))) + +;; --- clock (center) --------------------------------------------------------- +(defwidget clock [] + (button :class "clock" :onclick "scripts/panel.sh toggle calendar" + "${time}")) + +;; --- right-hand modules ----------------------------------------------------- +(defwidget music-mini [] + (revealer :transition "slideleft" :duration "200ms" + :reveal {cfg-modules.music && music.status != "Stopped" && music.title != ""} + (button :class "module music" :onclick "scripts/panel.sh toggle music" + (label :limit-width 28 :text "${music.icon} ${music.title}")))) + +(defwidget sys-mini [] + (button :class "module sys" :visible {cfg-modules.sys} :onclick "scripts/panel.sh toggle sysmon" + (label :text "󰓅 ${sys.cpu}% 󰍛 ${sys.mem}%"))) + +(defwidget updates-mod [] + (revealer :transition "slideleft" :duration "200ms" :reveal {cfg-modules.updates && arraylength(updates-list) > 0} + (button :class "module updates" :onclick "scripts/panel.sh toggle updates" + (label :text "󰚰 ${arraylength(updates-list)}")))) + +(defwidget net [] + (button :class "module net" :visible {cfg-modules.net} :onclick "scripts/panel.sh toggle control-center" + :onrightclick "" + (label :text {network.icon}))) + +(defwidget bt [] + (button :class "module bt" :visible {cfg-modules.bt} :onclick "scripts/panel.sh toggle control-center" + :onrightclick "" + (label :text {bluetooth.icon}))) + +(defwidget vol [] + (eventbox + :onscroll "test {} = up && wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ || wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + (button :class "module vol" :visible {cfg-modules.vol} :onclick "scripts/panel.sh toggle control-center" + :onrightclick "scripts/volume.sh mute" + (label :text "${volume.icon} ${volume.percent}%")))) + +;; --------------------------------------------------------------------------- +;; CONTROL CENTER (slides in top-right) +;; --------------------------------------------------------------------------- + +(defwidget toggle-tile [icon label active onclick onrc] + (button :class {active ? "tile active" : "tile"} :onclick onclick :onrightclick onrc + (box :orientation "vertical" :space-evenly false :spacing 5 + (label :class "tile-icon" :text icon) + (label :class "tile-label" :limit-width 14 :text label)))) + +(defwidget action-btn [icon label cmd] + (button :class "action" :onclick cmd + (box :orientation "vertical" :space-evenly false :spacing 4 + (label :class "action-icon" :text icon) + (label :class "action-label" :text label)))) + +(defwidget vol-slider [] + (box :orientation "vertical" :space-evenly false :spacing 8 + (box :class "slider-row" :space-evenly false :spacing 10 + ;; dropdown caret on the LEFT — opens the output-device menu below + (button :class {audio-menu ? "audio-caret open" : "audio-caret"} + :onclick "eww update audio-menu=${!audio-menu}" + (label :text {audio-menu ? "▴" : "▾"})) + (button :class "slider-icon" :onclick "scripts/volume.sh mute" + (label :text {volume.icon})) + (scale :hexpand true :min 0 :max 100 :value {volume.percent} + :onchange "wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ {}%") + (label :class "slider-val" :text "${volume.percent}%")) + (revealer :transition "slidedown" :duration "200ms" :reveal audio-menu + (box :class "audio-list" :orientation "vertical" :space-evenly false :spacing 4 + (for s in sinks + (button :class {s.default ? "audio-dev active" : "audio-dev"} + :onclick "scripts/audio.sh set-default ${s.id} && eww update audio-menu=false" + (box :space-evenly false :spacing 8 + (label :class "audio-dev-icon" :text "󰕾") + (label :halign "start" :hexpand true :limit-width 30 :text {s.name}) + (label :class "audio-dev-check" :visible {s.default} :text "󰄬")))))))) + +(defwidget cc-music [] + (revealer :transition "slidedown" :duration "200ms" + :reveal {music.status != "Stopped" && music.title != ""} + (box :class "cc-music" :space-evenly false :spacing 12 + (overlay + (box :class "cc-cover" :style "background-image: url('${music.cover}');") + (label :class "cc-cover-fallback" :visible {music.cover == ""} :text "󰝚")) + (box :orientation "vertical" :hexpand true :space-evenly false :spacing 2 :valign "center" + (label :class "cc-m-title" :halign "start" :limit-width 22 :text {music.title}) + (label :class "cc-m-artist" :halign "start" :limit-width 26 :text {music.artist}) + (box :class "cc-m-controls" :halign "start" :space-evenly false :spacing 16 + (button :class "cc-m-btn" :onclick "playerctl previous" "󰒮") + (button :class "cc-m-btn play" :onclick "playerctl play-pause" {music.icon}) + (button :class "cc-m-btn" :onclick "playerctl next" "󰒭")))))) + +(defwidget power-item [icon label action] + (button :class "power-item" :onclick "scripts/power.sh ${action}" + (box :space-evenly false :spacing 12 + (label :class "power-item-icon" :text icon) + (label :halign "start" :hexpand true :text label)))) + +;; generic slide-in wrapper for panels + spotlight (top-anchored → slide down). +;; Pure OPACITY fade (not a revealer): the content is always realized, so it +;; renders ONCE (during the realize wait, while still at opacity 0) and then only +;; the opacity animates via a CSS transition — perfectly even, no size change, no +;; per-frame re-layout. `open` just toggles the `.shown` class. +(defwidget reveal-box [open] + (box :class {open ? "panel-fade shown" : "panel-fade"} + (children))) + +(defwidget control-center [] + (box :class {colorscheme == "light" ? "panel cc light" : "panel cc"} :orientation "vertical" :space-evenly false :spacing 14 + ;; header: title (left) · settings gear · power + (box :class "cc-header" :space-evenly false :spacing 6 + (label :class "panel-title" :halign "start" :hexpand true :text "Control Center") + (button :class "cc-iconbtn" :onclick "scripts/settings.sh && scripts/panel.sh close" + (label :text "󰒓")) + (button :class {power-open ? "cc-iconbtn active" : "cc-iconbtn"} + :onclick "eww update power-open=${!power-open}" + (label :text "󰐥"))) + ;; power dropdown (replaces the old block of action buttons) + (revealer :transition "slidedown" :duration "200ms" :reveal power-open + (box :class "power-menu" :orientation "vertical" :space-evenly false :spacing 2 + (power-item :icon "󰌾" :label "Lock" :action "lock") + (power-item :icon "󰍃" :label "Logout" :action "logout") + (power-item :icon "󰒲" :label "Sleep" :action "sleep") + (power-item :icon "󰜉" :label "Reboot" :action "reboot") + (power-item :icon "󰐥" :label "Shutdown" :action "shutdown"))) + (box :spacing 12 :homogeneous true + (toggle-tile :icon {network.icon} :label {network.label} + :active {network.label != "Offline"} + :onclick "scripts/network.sh toggle" :onrc "") + (toggle-tile :icon {bluetooth.icon} :label {bluetooth.label} + :active {bluetooth.on} + :onclick "scripts/bluetooth.sh toggle" :onrc "")) + (box :spacing 12 :homogeneous true + (toggle-tile :icon "󰖔" :label "Night Light" :active {nightlight} + :onclick "scripts/night.sh toggle" :onrc "") + (toggle-tile :icon "󰂛" :label "Do not Disturb" :active {dnd} + :onclick "scripts/notifications.sh dnd-toggle" :onrc "")) + (cc-music) + (vol-slider) + (notif-list))) + +;; --------------------------------------------------------------------------- +;; NOTIFICATIONS (history list in the Control Center + top-right toast) +;; --------------------------------------------------------------------------- + +(defwidget notif-card [n] + (box :class "notif-card" :space-evenly false :spacing 8 + (box :orientation "vertical" :hexpand true :space-evenly false :spacing 2 + (box :space-evenly false + (label :class "notif-app" :halign "start" :hexpand true :limit-width 24 :text {n.app}) + (label :class "notif-time" :halign "end" :text {n.time})) + (label :class "notif-summary" :halign "start" :wrap true :limit-width 36 :text {n.summary}) + (label :class "notif-body" :halign "start" :wrap true :limit-width 40 :show-truncated false + :visible {n.body != ""} :text {n.body})) + (button :class "notif-x" :valign "start" :onclick "scripts/notifications.sh dismiss ${n.id}" "󰅖"))) + +(defwidget notif-list [] + (box :class "notif-list" :orientation "vertical" :space-evenly false :spacing 8 + (box :class "notif-head" :space-evenly false + (label :class "panel-title" :halign "start" :hexpand true :text "Notifications") + (button :class "notif-clear" :visible {arraylength(notifications) > 0} + :onclick "scripts/notifications.sh clear" "Clear all")) + (box :visible {arraylength(notifications) == 0} + (label :class "notif-empty" :halign "start" :text "Nothing new")) + (scroll :vscroll true :height 220 :visible {arraylength(notifications) > 0} + (box :orientation "vertical" :space-evenly false :spacing 8 + (for n in notifications + (notif-card :n n)))))) + +(defwidget notif-popup [] + (box :class {colorscheme == "light" ? "panel notif-popup light" : "panel notif-popup"} :space-evenly false :spacing 8 + (box :orientation "vertical" :hexpand true :space-evenly false :spacing 2 + (box :space-evenly false + (label :class "notif-app" :halign "start" :hexpand true :text {popup.app}) + (label :class "notif-time" :halign "end" :text {popup.time})) + (label :class "notif-summary" :halign "start" :wrap true :limit-width 36 :text {popup.summary}) + (label :class "notif-body" :halign "start" :wrap true :limit-width 40 + :visible {popup.body != ""} :text {popup.body})) + (button :class "notif-x" :valign "start" :onclick "scripts/notifications.sh popup-close" "󰅖"))) + +;; --------------------------------------------------------------------------- +;; CALENDAR (slides in top-center, opened by the clock) +;; --------------------------------------------------------------------------- + +(defwidget cal [] + (box :class {colorscheme == "light" ? "panel cal light" : "panel cal"} :orientation "vertical" :space-evenly false :spacing 6 + (calendar :class "cal-widget"))) + +;; --------------------------------------------------------------------------- +;; MUSIC PANEL +;; --------------------------------------------------------------------------- + +(defwidget music-panel [] + (box :class {colorscheme == "light" ? "panel music-panel light" : "panel music-panel"} :orientation "vertical" :space-evenly false :spacing 12 + (box :class "cover" :height 180 + :style "background-image: url('${music.cover}');") + (label :class "m-title" :limit-width 30 :text {music.title}) + (label :class "m-artist" :limit-width 34 :text {music.artist}) + (box :class "m-controls" :halign "center" :space-evenly false :spacing 24 + (button :class "m-btn" :onclick "playerctl previous" "󰒮") + (button :class "m-btn play" :onclick "playerctl play-pause" {music.icon}) + (button :class "m-btn" :onclick "playerctl next" "󰒭")))) + +;; --------------------------------------------------------------------------- +;; SYSTEM MONITOR PANEL +;; --------------------------------------------------------------------------- + +(defwidget metric [icon label value] + (box :class "metric" :space-evenly false :spacing 12 + (label :class "metric-icon" :text icon) + (box :orientation "vertical" :hexpand true :space-evenly false :spacing 4 + (box :space-evenly false + (label :halign "start" :hexpand true :text label) + (label :halign "end" :text "${value}%")) + (scale :class "metric-bar" :min 0 :max 100 :value value :active false)))) + +(defwidget sysmon-panel [] + (box :class {colorscheme == "light" ? "panel sysmon light" : "panel sysmon"} :orientation "vertical" :space-evenly false :spacing 16 + (label :class "panel-title" :halign "start" :text "System") + (metric :icon "󰓅" :label "CPU" :value {sys.cpu}) + (metric :icon "󰍛" :label "RAM" :value {sys.mem}) + (metric :icon "󰋊" :label "Disk" :value {sys.disk}) + (box :class "temp-row" :space-evenly false :spacing 12 + (label :class "metric-icon" :text "󰔏") + (label :halign "start" :hexpand true :text "Temp") + (label :halign "end" :text "${sys.temp}°C")))) + +;; --------------------------------------------------------------------------- +;; UPDATES PANEL (count + dropdown list, ~10 visible then scroll) +;; --------------------------------------------------------------------------- + +(defwidget updates-panel [] + (box :class {colorscheme == "light" ? "panel updates-panel light" : "panel updates-panel"} + :orientation "vertical" :space-evenly false :spacing 10 + (box :class "upd-head" :space-evenly false :spacing 8 + (label :class "panel-title" :halign "start" :text "Updates available") + (label :class "upd-count" :text {arraylength(updates-list)}) + (box :hexpand true) + (button :class {updates-open ? "audio-caret open" : "audio-caret"} + :onclick "eww update updates-open=${!updates-open}" + (label :text {updates-open ? "▴" : "▾"}))) + (revealer :transition "slidedown" :duration "200ms" :reveal updates-open + (scroll :vscroll true :height 260 + (box :class "upd-list" :orientation "vertical" :space-evenly false :spacing 3 + (for u in updates-list + (box :class "upd-row" :space-evenly false :spacing 8 + (label :class "upd-src aur" :visible {u.src == "aur"} :text "AUR") + (label :class "upd-name" :halign "start" :hexpand true :limit-width 24 :text {u.name}) + (label :class "upd-old" :text {u.old}) + (label :class "upd-arrow" :text "→") + (label :class "upd-new" :text {u.new})))))) + (revealer :transition "crossfade" :duration "150ms" :reveal {!upd-running} + (button :class "action upd-all" :onclick "scripts/doupdate.sh &" + (label :text "Update all"))) + (revealer :transition "crossfade" :duration "150ms" :reveal upd-running + (box :class "upd-prog" :space-evenly false :spacing 10 :valign "center" + (label :class "upd-prog-spin" :text "󰦖") + (label :class "upd-prog-text" :halign "start" :hexpand true + :limit-width 40 :show-truncated false :text upd-progress))))) + +;; --------------------------------------------------------------------------- +;; DOCK (auto-hide, left edge, vertical — real app icons) +;; --------------------------------------------------------------------------- + +(defwidget dock [] + ;; Auto-hide (niri has no cursor IPC): the dock + every icon write "show" on + ;; hover (keepalive). "Leaving" is NOT detected by the dock's own onhoverlost + ;; (GTK fires that spuriously when the pointer crosses onto a child icon, so it + ;; would hide while you're still on the dock). Instead a separate `dock-catcher` + ;; surface BELOW the dock fires "leave" the moment the pointer is anywhere off + ;; the dock — a reliable signal. So while hovering the dock there is only ever + ;; "show"; the dock stays put until you actually move off it. + (eventbox :class "dock-evt" + :onhover "scripts/dock.sh keepalive" + :onrightclick "scripts/dock.sh bg-menu" + (revealer :transition "slideright" :duration "200ms" :reveal dock-open + (box :class {colorscheme == "light" ? "dock light" : "dock"} :orientation "vertical" :space-evenly false :spacing 10 :valign "center" + (for a in dock-apps + (button :class {a.pinned ? "dock-item" : "dock-item unpinned"} + :onhover "scripts/dock.sh keepalive" + :onclick "scripts/dock.sh launch ${a.class} ${a.exec}" + :onrightclick "scripts/dock.sh menu-open '${a.class}' '${a.exec}' ${a.pinned} ${a.running} ${a.idx}" + (box :space-evenly false :spacing 4 :halign "center" + (box :class {a.running ? "dock-dot on" : "dock-dot"} :valign "center") + ;; CSS background-image renders the SVG scale-aware (sharp at 1.25) + (box :class "dock-icon" :style "background-image: url('${a.icon}'); min-width: ${cfg-icon-size}px; min-height: ${cfg-icon-size}px;") + ;; mirror of the dot's width on the right so the icon stays centred + (box :class "dock-dot-spacer")))))))) + +;; thin always-present hover strip at the left edge — replaces the cursor poll. +;; Hovering it shows the dock; leaving is detected by the dock-catcher (below), +;; so the trigger only needs to fire "show". +(defwidget dock-trigger [] + (eventbox :onhover "scripts/dock.sh show" + (box :class "dock-trigger"))) + +;; full-screen-ish catcher BELOW the dock (opened by the watcher while the dock is +;; visible). The pointer entering it = the pointer is off the dock → "leave" +;; (debounced hide). A click anywhere off the dock dismisses immediately. It +;; starts at x=6 so it never covers the left-edge trigger. +(defwidget dock-catcher [] + (eventbox :hexpand true :vexpand true + :onhover "scripts/dock.sh hide" + :onclick "scripts/dock.sh hide-now" + :onrightclick "scripts/dock.sh hide-now" + (box :class "dock-catcher" :hexpand true :vexpand true))) + +;; right-click on the EMPTY dock area (not an icon) -> jump to settings +(defwidget dock-bg-menu [] + (box :class {colorscheme == "light" ? "dock-menu light" : "dock-menu"} :orientation "vertical" :space-evenly false :spacing 2 + (label :class "dock-menu-title" :halign "start" :text "Dock & Bar") + (button :class "dock-menu-item" + :onclick "scripts/settings.sh --page panel-dock ; eww close dock-bg-menu dock-menu-backdrop" + (label :halign "start" :text " Panel & Dock Settings…")) + (button :class "dock-menu-item" + :onclick "scripts/panelcfg.sh toggle-autohide ; eww close dock-bg-menu dock-menu-backdrop" + (label :halign "start" :text " Toggle auto-hide")) + (button :class "dock-menu-item" + :onclick "eww close dock-bg-menu dock-menu-backdrop ; $HOME/projects/eww/launch.sh" + (label :halign "start" :text " Restart bar")))) + +(defwidget dock-menu [] + (box :class {colorscheme == "light" ? "dock-menu light" : "dock-menu"} :orientation "vertical" :space-evenly false :spacing 2 + (label :class "dock-menu-title" :halign "start" :limit-width 18 :text {dock-sel-class}) + ;; window picker — only when more than one instance is open + (box :visible {arraylength(dock-sel-windows) > 1} :orientation "vertical" :space-evenly false :spacing 2 + (for w in dock-sel-windows + (button :class "dock-menu-item dock-menu-win" :onclick "scripts/dock.sh focus-win ${w.address}" + (box :space-evenly false :spacing 8 + (label :halign "start" :hexpand true :limit-width 20 :text {w.title}) + (label :class "dock-menu-ws" :text " ${w.ws}")))) + (box :class "dock-menu-sep")) + (button :class "dock-menu-item" :onclick "scripts/dock.sh new ${dock-sel-exec}" + (label :halign "start" :text " New Window")) + (button :class "dock-menu-item" :visible {!dock-sel-pinned} + :onclick "scripts/dock.sh pin ${dock-sel-class}" + (label :halign "start" :text " Pin to Dock")) + (button :class "dock-menu-item" :visible {dock-sel-pinned} + :onclick "scripts/dock.sh unpin ${dock-sel-class}" + (label :halign "start" :text " Unpin")) + (button :class "dock-menu-item" :visible {dock-sel-pinned} + :onclick "scripts/dock.sh move-up ${dock-sel-class}" + (label :halign "start" :text " Move up")) + (button :class "dock-menu-item" :visible {dock-sel-pinned} + :onclick "scripts/dock.sh move-down ${dock-sel-class}" + (label :halign "start" :text " Move down")) + (button :class "dock-menu-item danger" :visible {dock-sel-running} + :onclick "scripts/dock.sh close ${dock-sel-class}" + (label :halign "start" :text " Close")))) + +;; --------------------------------------------------------------------------- +;; SPOTLIGHT LAUNCHER +;; --------------------------------------------------------------------------- + +(defwidget spot-row [r] + (button :class "spot-row" :onclick "scripts/spotlight.sh activate ${r.idx}" + (box :space-evenly false :spacing 12 :valign "center" + (box :class "spot-icon" :valign "center" + (box :visible {r.img != ""} :class "spot-img" + :style "background-image: url('${r.img}');") + (label :visible {r.img == ""} :class "spot-glyph" :text {r.icon})) + (box :orientation "vertical" :space-evenly false :valign "center" :hexpand true + (label :class "spot-title" :halign "start" :limit-width 64 :text {r.title}) + (label :class "spot-sub" :halign "start" :limit-width 76 :show-truncated false :text {r.sub}))))) + +(defwidget spot-pill [mode icon label ?key] + (button :class {spot-mode == mode ? "spot-pill active" : "spot-pill"} + :onclick "eww update spot-mode='${mode}' spot-q='' && scripts/spotlight.sh qmode ${mode} ''" + (box :space-evenly false :spacing 6 :valign "center" + (label :class "spot-pill-icon" :text icon) + (label :class "spot-pill-label" :text label) + (label :class "spot-pill-key" :visible {(key ?: "") != ""} :text {key ?: ""})))) + +(defwidget spotlight [] + (box :class {colorscheme == "light" ? "spot light" : "spot"} + :orientation "vertical" :space-evenly false + ;; The search box is OUTSIDE the slide revealer so the input is realized the + ;; moment the window maps — GTK then auto-focuses it (it's the first focusable + ;; widget) and, since the surface has exclusive keyboard focus, you can type + ;; immediately without clicking. (Wrapping it in a collapsed revealer left the + ;; input unrealized → keys went nowhere until you clicked it.) + (box :class "spot-search" :space-evenly false :spacing 12 :valign "center" + (label :class "spot-search-icon" :text "") + (input :class "spot-input" :hexpand true :value spot-q + :onchange "scripts/spotlight.sh type '{}'" + :onaccept "scripts/spotlight.sh activate 0")) + ;; pills + results slide in (the animated part) + (revealer :transition "slidedown" :duration "200ms" :reveal spot-open + (box :orientation "vertical" :space-evenly false + (box :class "spot-pills" :space-evenly false :spacing 6 :halign "start" + (spot-pill :mode "apps" :icon "󰀻" :label "Apps") + (spot-pill :mode "clip" :icon "󰅍" :label "Pastebin" :key ";") + (spot-pill :mode "emoji" :icon "󰞅" :label "Emoji" :key ":") + (spot-pill :mode "calc" :icon "󰪚" :label "Rechner" :key "=") + (spot-pill :mode "web" :icon "󰖟" :label "Web" :key "?") + (spot-pill :mode "files" :icon "󰈔" :label "Dateien" :key "/")) + (revealer :transition "slidedown" :duration "120ms" :reveal {arraylength(spot-results) > 0} + (box :class "spot-list" :orientation "vertical" :space-evenly false :spacing 2 + (for r in spot-results + (spot-row :r r)))))))) + +;; --------------------------------------------------------------------------- +;; WINDOWS +;; --------------------------------------------------------------------------- + +;; NOTE: no outer reveal-box — the spotlight widget keeps its input always +;; realized (so it gets keyboard focus on open) and animates its body internally. +(defwindow spotlight + :monitor 0 + :geometry (geometry :y "-10%" :width "640px" :anchor "center") + :stacking "overlay" + :focusable "exclusive" + (spotlight)) + +;; click-outside catcher for Spotlight — opened BEFORE spotlight so it stacks +;; below. A click anywhere outside the launcher dismisses it. This is the only +;; reliable dismiss in niri (no global Escape bind) and self-heals a stuck +;; spotlight surface — which, being :focusable, would otherwise hold the keyboard. +(defwindow spot-backdrop + :monitor 0 + :geometry (geometry :width "100%" :height "100%" :anchor "center") + :stacking "overlay" + :focusable false + ;; Animated dismiss: spotlight.sh close drops the backdrop instantly (lockout- + ;; safe) then slides the body out + unmaps from a detached process. + (eventbox :hexpand true :vexpand true + :onclick "scripts/spotlight.sh close" + :onrightclick "scripts/spotlight.sh close" + (box :class "spot-backdrop" :hexpand true :vexpand true))) + +(defwindow bar + :geometry (geometry :x "0%" :y "0%" :width "100%" :height "26px" :anchor "top center") + :stacking "fg" + :exclusive true + :focusable false + (bar)) + +(defwindow control-center + :monitor 0 + :geometry (geometry :x "0px" :y "2px" :width "380px" :anchor "top right") + :stacking "overlay" + :focusable false + (reveal-box :open panel-open (control-center))) + +(defwindow calendar + :monitor 0 + :geometry (geometry :x "0px" :y "2px" :width "320px" :anchor "top center") + :stacking "overlay" + :focusable false + (reveal-box :open panel-open (cal))) + +(defwindow music + :monitor 0 + :geometry (geometry :x "0px" :y "2px" :width "320px" :anchor "top right") + :stacking "overlay" + :focusable false + (reveal-box :open panel-open (music-panel))) + +(defwindow sysmon + :monitor 0 + :geometry (geometry :x "0px" :y "2px" :width "340px" :anchor "top right") + :stacking "overlay" + :focusable false + (reveal-box :open panel-open (sysmon-panel))) + +(defwindow updates + :monitor 0 + :geometry (geometry :x "0px" :y "2px" :width "440px" :anchor "top right") + :stacking "overlay" + :focusable false + (reveal-box :open panel-open (updates-panel))) + +;; click-outside catcher for the panels — covers everything BELOW the bar (so +;; bar symbols stay clickable to switch panels). A click closes the open panel. +(defwindow panel-backdrop + :monitor 0 + :geometry (geometry :x "0px" :y "36px" :width "100%" :height "100%" :anchor "top left") + :stacking "overlay" + :focusable false + ;; Animated dismiss: panel.sh close drops the backdrop instantly (lockout-safe) + ;; then fades the panel out + unmaps from a detached process. (An instant close + ;; here skipped the fade-out entirely.) + (eventbox :hexpand true :vexpand true + :onclick "scripts/panel.sh close" + :onrightclick "scripts/panel.sh close" + (box :class "panel-backdrop" :hexpand true :vexpand true))) + +(defwindow notification-popup + :monitor 0 + :geometry (geometry :x "0px" :y "8px" :width "360px" :anchor "top right") + :stacking "overlay" + :focusable false + (notif-popup)) + +;; the dock — content-sized; opened on hover of the trigger strip, hidden by the +;; dock's own hover/hoverlost (catcher-free; niri has no cursor IPC). +;; Opened only while visible. On open the revealer is collapsed (invisible), then +;; dock-open flips true and it slides in; on hide it slides out, then the window +;; closes. (niri doesn't animate layer map/unmap, so the revealer does it.) +;; NO fixed width — width is the axis `slideright` animates, so it must be free to +;; grow with the revealer (a fixed width makes the layer surface full-size at once +;; and the slide looks instant). Height is content-sized too. Mirrors how the +;; panels leave their animated axis (height, for slidedown) unfixed. +(defwindow dock + :monitor 0 + :geometry (geometry :x "6px" :y "0px" :anchor "left center") + :stacking "overlay" + :focusable false + (dock)) + +;; leave-catcher: full-screen, opened by the watcher while the dock is visible. +;; It lives on the `fg` (top) layer-shell layer while the dock + trigger are on +;; `overlay` (which is ABOVE fg). So the dock/trigger are ALWAYS above the catcher +;; regardless of map order — hovering the dock never hits the catcher. The catcher +;; is still above normal app windows, so moving the pointer anywhere off the dock +;; enters it → reliable "leave" (debounced hide), in every direction. +(defwindow dock-catcher + :monitor 0 + :geometry (geometry :x "0px" :y "0px" :width "100%" :height "100%" :anchor "center") + :stacking "fg" + :focusable false + (dock-catcher)) + +;; always-on hover strip (6px) at the left edge that opens the dock. +(defwindow dock-trigger + :monitor 0 + :geometry (geometry :x "0px" :y "0px" :width "6px" :height "60%" :anchor "left center") + :stacking "overlay" + :focusable false + (dock-trigger)) + +;; (no dock-backdrop window — auto-hide is catcher-free; see the dock widget.) + +;; full-screen transparent catcher behind the menu — a click anywhere outside +;; the menu dismisses it. Opened BEFORE the menu so the menu stacks on top. +;; starts to the RIGHT of the dock (~104px) so the dock icons stay +;; right-clickable — right-clicking another icon switches the menu. A click +;; anywhere on the backdrop (left or right button) dismisses it. +(defwindow dock-menu-backdrop + :monitor 0 + :geometry (geometry :x "104px" :y "0px" :width "100%" :height "100%" :anchor "top left") + :stacking "overlay" + :focusable false + ;; onhover keeps the dock alive while the menu is up; clicking dismisses both + ;; the menu and (debounced) the dock. + (eventbox :hexpand true :vexpand true :onhover "scripts/dock.sh show" + :onclick "eww close dock-menu dock-bg-menu dock-menu-backdrop && scripts/dock.sh hide" + :onrightclick "eww close dock-menu dock-bg-menu dock-menu-backdrop && scripts/dock.sh hide" + (box :class "dock-menu-backdrop" :hexpand true :vexpand true))) + +;; right-click context menu — right of the dock, vertically centred. NO fixed +;; height: with a fixed height eww centres that tiny box and the real content +;; spills downward (looked vertically shifted). Content-sized + center-left +;; anchors the whole menu's middle to the screen middle. (niri exposes no cursor +;; Y, so we can't track the clicked icon's height; centred is the clean default.) +(defwindow dock-menu + :monitor 0 + :geometry (geometry :x "104px" :y "0px" :anchor "center left") + :stacking "overlay" + :focusable false + (dock-menu)) + +;; vertically centred next to the dock (no fixed y/height — a fixed height made +;; eww centre the tiny box and the content spilled, and y=150 sat too high). +(defwindow dock-bg-menu + :monitor 0 + :geometry (geometry :x "104px" :y "0px" :width "210px" :anchor "center left") + :stacking "overlay" + :focusable false + (dock-bg-menu)) diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/launch.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/launch.sh new file mode 100755 index 0000000..21e6661 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/launch.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +# Launch the eww bar on every monitor. Safe to call from Hyprland autostart. +# If eww isn't installed yet, fall back to waybar so you're never bar-less. +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +if ! command -v eww >/dev/null 2>&1; then + echo "eww not found — falling back to waybar" >&2 + exec waybar +fi + +# niri helpers — provides $WM (=niri), wm_outputs, wm_blur_layer, … +. "$DIR/scripts/wm.sh" + +# Defensive: if GDK_SCALE is exported anywhere, unset it so eww uses native +# Wayland fractional scaling (GTK >= 3.24.49) and renders crisp at scale 1.25. +# (The niri config deliberately does NOT set GDK_SCALE.) +unset GDK_SCALE GDK_DPI_SCALE + +# Make sure helper scripts are executable. +chmod +x "$DIR"/scripts/*.sh 2>/dev/null + +# Stop waybar (we're replacing it). +pkill -x waybar 2>/dev/null + +# HARD-restart the daemon. A plain `eww close-all` is NOT enough: across daemon +# hiccups/restarts the compositor keeps old layer surfaces mapped while the daemon +# forgets them — orphans that pile up (e.g. "5 header bars") and that eww can no +# longer close (it doesn't know their ids). Killing the daemon makes the +# compositor drop ALL its surfaces, so we always start from a truly clean slate. +eww kill 2>/dev/null +pkill -9 -f '[e]ww daemon' 2>/dev/null +sleep 0.5 +# Give it time to initialise (cold start ~2s) before opening windows, or the open +# calls no-op against a not-yet-ready server. +eww daemon >/dev/null 2>&1 & +sleep 2 + +eww close-all 2>/dev/null + +# Use the compositor's active-output count as 0-based eww --screen indices. +n=$(wm_outputs) +[ -z "$n" ] || [ "$n" -lt 1 ] 2>/dev/null && n=1 +m=0 +while [ "$m" -lt "$n" ]; do + eww open bar --id "bar-$m" --screen "$m" 2>/dev/null + m=$((m+1)) +done + +# Auto-hide dock + frosted-glass blur for the gtk-layer-shell namespace. +# (Blur/rounding/shadow live in ~/.config/niri/config.kdl as a layer-rule; +# wm_blur_layer is a no-op on niri.) + + +wm_blur_layer "gtk-layer-shell" +eww close dock dock-backdrop dock-menu 2>/dev/null +# Auto-hide: a thin left-edge hover trigger requests "show"; the dock keeps itself +# alive on hover and requests "leave" on hoverlost. The actual open/close + timing +# is done by the `dock.sh watch` DAEMON below — NOT in the eww hover handlers, +# because eww kills a handler the moment it sleeps (which would strand the dock / +# a backdrop and lock out the pointer). Handlers only write intent to a state file. +eww update dock-open=false 2>/dev/null +eww close dock dock-catcher 2>/dev/null # start hidden (mapped on hover) +printf 'hidden' > "$HOME/.cache/eww/.dock-hide-token" 2>/dev/null +eww open dock-trigger 2>/dev/null +pkill -f '[d]ock\.sh watch' 2>/dev/null +"$DIR/scripts/dock.sh" watch >/dev/null 2>&1 & + +# Accent: mirror TANINUX's gui.json into eww's $accent and keep it in sync. +pkill -f "accent.sh watch" 2>/dev/null +"$DIR/scripts/accent.sh" watch >/dev/null 2>&1 & + +# UI font: follow the GNOME/TANINUX appearance font (gsettings font-name). +pkill -f "font.sh watch" 2>/dev/null +"$DIR/scripts/font.sh" watch >/dev/null 2>&1 & + +# Panel/Dock settings: mirror TANINUX's panel.json (icon size, modules, …). +pkill -f "panelcfg.sh watch" 2>/dev/null +"$DIR/scripts/panelcfg.sh" watch >/dev/null 2>&1 & + +# Safety net: close orphaned backdrops that would otherwise swallow all clicks. +# Rewritten for niri — deterministic owner-pairing via `eww active-windows` +# (no niri geometry, no daemon kill), so it no longer over-fires. See guard.sh. +pkill -f "scripts/guard.sh" 2>/dev/null +"$DIR/scripts/guard.sh" >/dev/null 2>&1 & + +# Spotlight: clipboard history watcher (cliphist) + warm the app index. +if command -v cliphist >/dev/null 2>&1; then + pkill -f "wl-paste --watch cliphist store" 2>/dev/null + wl-paste --type text --watch cliphist store >/dev/null 2>&1 & + wl-paste --type image --watch cliphist store >/dev/null 2>&1 & +fi +"$DIR/scripts/spotlight.sh" reindex >/dev/null 2>&1 & + +# --- Notifications: tiramisu (headless) + our eww UI, replacing mako -------- +# mako is D-Bus-activated, so we kill it and immediately let tiramisu grab the +# org.freedesktop.Notifications name — while tiramisu holds it, D-Bus won't +# re-activate mako. If tiramisu isn't installed yet, leave mako alone. +if command -v tiramisu >/dev/null 2>&1; then + pkill -x mako 2>/dev/null + [ -f "$HOME/.cache/eww/dnd" ] || echo false > "$HOME/.cache/eww/dnd" + pkill -f "notifications.sh listen" 2>/dev/null + "$DIR/scripts/notifications.sh" listen >/dev/null 2>&1 & + sleep 0.3 + "$DIR/scripts/notifications.sh" refresh 2>/dev/null +fi diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/accent.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/accent.sh new file mode 100755 index 0000000..4f09338 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/accent.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +# Mirror TANINUX's accent into eww. +# get print the accent hex (from gui.json, fallback default) +# apply write it into eww.scss's $accent-dim line + eww reload (if changed) +# watch apply now, then re-apply whenever gui.json changes +# +# Contract: ~/.local/share/taninux/gui.json -> field accent_hex (#rrggbb). +# Only the $accent-dim line is managed; $accent + washes derive from it in SCSS. +set -u + +SCSS="$HOME/.config/eww/eww.scss" +GUI="${XDG_DATA_HOME:-$HOME/.local/share}/taninux/gui.json" +DEFAULT="#8f8aac" # ume — same as the spec's fallback + +get() { + local h="" + [ -f "$GUI" ] && h=$(jq -r '.accent_hex // empty' "$GUI" 2>/dev/null) + case "$h" in + \#[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]) printf '%s' "$h" ;; + *) printf '%s' "$DEFAULT" ;; + esac +} + +current() { + grep -m1 -oE '^\$accent-dim:[[:space:]]*#[0-9a-fA-F]{6}' "$SCSS" 2>/dev/null | grep -oE '#[0-9a-fA-F]{6}' +} + +apply() { + local hex; hex=$(get) + [ "$(current)" = "$hex" ] && return 0 # nothing changed + # awk handles the literal `$` in `$accent-dim` cleanly (no sed escaping pain) + awk -v hex="$hex" ' + /accent_hex \(managed/ { print "$accent-dim: " hex "; // accent_hex (managed by scripts/accent.sh)"; next } + { print } + ' "$SCSS" > "$SCSS.tmp" && mv "$SCSS.tmp" "$SCSS" + eww reload 2>/dev/null +} + +case "${1:-apply}" in + get) get; echo ;; + apply) apply ;; + watch) + apply + last=$(stat -c %Y "$GUI" 2>/dev/null || echo 0) + while :; do + sleep 2 + now=$(stat -c %Y "$GUI" 2>/dev/null || echo 0) + if [ "$now" != "$last" ]; then last="$now"; apply; fi + done + ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/audio.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/audio.sh new file mode 100755 index 0000000..500a4c7 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/audio.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# Audio output devices via wireplumber (wpctl). +# sinks JSON list of output devices [{id,name,default}] +# set-default make the default sink (and move running streams) +set -u + +case "${1:-sinks}" in + sinks) + wpctl status | awk ' + /^Audio/{sec="audio"} /^Video/{sec="video"} + /Sinks:/{insink=(sec=="audio")?1:0; next} + /Sources:|Filters:|Streams:/{insink=0} + insink && match($0,/[0-9]+\./){ + def=($0 ~ /\*/)?"true":"false" + id=substr($0,RSTART,RLENGTH-1) + name=substr($0,RSTART+RLENGTH) + sub(/ *\[vol:.*$/,"",name) + gsub(/^[ \t]+|[ \t]+$/,"",name) + printf "%s\t%s\t%s\n",id,def,name + }' \ + | jq -R -s -c 'split("\n")|map(select(length>0))|map(split("\t")) + |map({id:.[0],default:(.[1]=="true"),name:.[2]})' + ;; + set-default) + id="${2:-}" + [ -n "$id" ] || exit 1 + wpctl set-default "$id" + # move already-playing streams onto the new default too + def=$(pactl get-default-sink 2>/dev/null) + if [ -n "$def" ]; then + pactl list short sink-inputs 2>/dev/null | awk '{print $1}' | while read -r si; do + pactl move-sink-input "$si" "$def" 2>/dev/null + done + fi + ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/bluetooth.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/bluetooth.sh new file mode 100755 index 0000000..983e547 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/bluetooth.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# Bluetooth status / toggle via bluetoothctl. + +powered() { bluetoothctl show 2>/dev/null | awk '/Powered:/{print $2; exit}'; } + +case "${1:-status}" in + toggle) + if [ "$(powered)" = yes ]; then bluetoothctl power off + else bluetoothctl power on; fi + ;; + status|*) + if [ "$(powered)" != yes ]; then + jq -nc '{icon:"󰂲",label:"Off",on:false}' + exit 0 + fi + dev=$(bluetoothctl devices Connected 2>/dev/null | head -1 | cut -d' ' -f3-) + if [ -n "$dev" ]; then + jq -nc --arg d "$dev" '{icon:"󰂱",label:$d,on:true}' + else + jq -nc '{icon:"󰂯",label:"On",on:true}' + fi + ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/clock.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/clock.sh new file mode 100755 index 0000000..b513989 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/clock.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +# Clock for the bar — strftime format comes from TANINUX's panel.json. +fmt=$(jq -r '.bar.clock_format // empty' \ + "${XDG_DATA_HOME:-$HOME/.local/share}/taninux/panel.json" 2>/dev/null) +[ -z "$fmt" ] && fmt='%H:%M · %A, %d %B %Y' +date "+$fmt" diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/colorscheme.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/colorscheme.sh new file mode 100755 index 0000000..ba962bf --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/colorscheme.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Reports GNOME's light/dark preference for eww. +# get print "light" or "dark" once +# listen print it now, then again on every change (for deflisten) +set -u +KEY="org.gnome.desktop.interface color-scheme" + +emit() { + case "$(gsettings get $KEY 2>/dev/null)" in + *dark*) echo dark ;; + *) echo light ;; # 'prefer-light' and 'default' -> light + esac +} + +case "${1:-get}" in + get) emit ;; + listen) + emit + gsettings monitor $KEY 2>/dev/null | while read -r _; do emit; done + ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/dismiss.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/dismiss.sh new file mode 100755 index 0000000..d72ca5c --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/dismiss.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# Close every eww overlay and reset the animation vars in one shot. +# Entry point for niri's panic bind (Mod+Escape) and any "close everything" need. +# Safe to call anytime — closing a not-open window is a no-op. +set -u + +eww update panel-open=false dock-open=false spot-open=false 2>/dev/null +eww close \ + spotlight spot-backdrop \ + dock-menu dock-bg-menu dock-menu-backdrop \ + control-center calendar music sysmon updates panel-backdrop \ + dock 2>/dev/null diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/dock.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/dock.sh new file mode 100755 index 0000000..44b16ce --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/dock.sh @@ -0,0 +1,308 @@ +#!/usr/bin/env bash +# Dock backend (niri): pinned apps (real Papirus icons) + running +# apps, launch/focus, pin/unpin, new-window, close, and a hover-driven auto-hide. +# +# apps JSON [{exec,class,icon,running,pinned}] (pinned first) +# launch focus if running, else launch; then hide menus +# new always launch a fresh instance +# close close all windows of that class +# pin add a running app to the pinned list +# unpin remove an app from the pinned list +# show open the dock now (cancels a pending hide) +# hide hide the dock after HIDE_DELAY (debounced) +set -u + +# ---- settings ------------------------------------------------------------- +HIDE_DELAY=$(jq -r '.dock.hide_delay // 0.4' "${XDG_DATA_HOME:-$HOME/.local/share}/taninux/panel.json" 2>/dev/null) +case "$HIDE_DELAY" in ''|*[!0-9.]*) HIDE_DELAY="${DOCK_HIDE_DELAY:-0.4}";; esac +: "${HIDE_DELAY:=0.4}" # seconds the dock lingers after the + # pointer leaves it (decimals allowed) +ANIM=0.2 # slide duration — matches the revealer +dlog() { :; } # diagnostics off (flip to append-to-file if you need to trace) +CFG="$HOME/.config/eww" +PINS="$CFG/dock-pins" # one app per line: exec|class|icon +HTOK="$HOME/.cache/eww/.dock-hide-token" +STAMP="$HOME/.cache/eww/.dock-menu-stamp" # icon right-click marker (vs bg) +mkdir -p "$CFG" "$HOME/.cache/eww" + +# seed the default pins on first run +if [ ! -f "$PINS" ]; then + cat > "$PINS" <<'EOF' +librewolf|librewolf|librewolf +kitty|kitty|kitty +nautilus|org.gnome.Nautilus|org.gnome.Nautilus +code|Code|code-oss +obsidian|obsidian|obsidian +EOF +fi + +# ---- niri helpers --------------------------------------------------------- +. "$(dirname "$0")/wm.sh" +clients_json() { wm_clients; } # normalised [{id,pid,class,title,ws}] + +# Hide is handled by the `watch` daemon (see bottom), NOT here — because eww +# kills an event-handler process the moment it lingers (a `sleep` for the +# slide-out gets killed → `eww close` never runs → the dock/backdrop sticks). +# So all the hover handlers do is write an instant intent to $HTOK; the daemon +# (a normal long-running process eww can't kill) does the timing + open/close. +# +# $HTOK states: show | leave: | hidden +dock_dismiss() { # instant: request hide + close menus + eww close dock-menu dock-menu-backdrop dock-bg-menu 2>/dev/null + printf 'hidden' > "$HTOK" 2>/dev/null +} +HIDE_MS=$(awk "BEGIN{print int($HIDE_DELAY*1000)}") # debounce in ms for the daemon + +# On-screen Y (logical px) of the TOP of dock icon , derived from the +# vertically-centred dock layout (niri has no cursor IPC, but we know the index). +# Used to place the right-click menu at the icon's height. +menu_y() { + local idx="${1:-0}" H N isz itemH pitch content dtop y maxy + H=$(niri msg --json outputs 2>/dev/null | jq -r 'first(.[] | .logical.height // empty) // 1152' 2>/dev/null) + case "$H" in ''|*[!0-9]*) H=1152;; esac + N=$(eww get dock-apps 2>/dev/null | jq 'length' 2>/dev/null); case "$N" in ''|*[!0-9]*) N=1;; esac + isz=$(eww get cfg-icon-size 2>/dev/null); case "$isz" in ''|*[!0-9]*) isz=42;; esac + [ "$isz" -lt 42 ] && isz=42 # scss enforces a 42px min icon + itemH=$((isz + 8)); pitch=$((itemH + 10)) # +padding, +inter-item spacing + content=$((20 + N * itemH + (N - 1) * 10)) # +dock padding top/bottom + dtop=$(( (H - content) / 2 )); [ "$dtop" -lt 0 ] && dtop=0 + y=$(( dtop + 10 + idx * pitch )) # top of icon + maxy=$(( H - 280 )); [ "$maxy" -lt 8 ] && maxy=8 # keep an ~270px menu on screen + [ "$y" -gt "$maxy" ] && y=$maxy + [ "$y" -lt 8 ] && y=8 + printf '%s' "$y" +} + +# ---- helpers -------------------------------------------------------------- +resolve_icon() { # icon name -> best file path (Papirus svg preferred) + local name="$1" base sz ext f + [ -z "$name" ] && name="application-x-executable" + for base in /usr/share/icons/Papirus-Dark /usr/share/icons/Papirus; do + for sz in 64x64 48x48 32x32 24x24; do + for ext in svg png; do + [ -f "$base/$sz/apps/$name.$ext" ] && { printf '%s' "$base/$sz/apps/$name.$ext"; return; } + done + done + done + f=$(find /usr/share/icons/hicolor -type f \( -name "$name.svg" -o -name "$name.png" \) 2>/dev/null \ + | sort -t/ -k6 -rn | head -1) + [ -n "$f" ] && { printf '%s' "$f"; return; } + for ext in svg png xpm; do + [ -f "/usr/share/pixmaps/$name.$ext" ] && { printf '%s' "/usr/share/pixmaps/$name.$ext"; return; } + done + # generic fallback so every tile has something + resolve_generic +} +resolve_generic() { + local p + for p in /usr/share/icons/Papirus-Dark/64x64/apps/application-x-executable.svg \ + /usr/share/icons/Papirus/64x64/apps/application-x-executable.svg; do + [ -f "$p" ] && { printf '%s' "$p"; return; } + done + printf '' +} +lc() { printf '%s' "$1" | tr 'A-Z' 'a-z'; } +running_classes() { clients_json | jq -r '.[].class' | tr 'A-Z' 'a-z'; } +is_running() { running_classes | grep -qx "$(lc "$1")"; } + +# open windows of a class -> [{address, title, ws}] (for the multi-instance menu) +win_list() { + clients_json \ + | jq -c --arg c "$(lc "$1")" ' + [ .[] | select((.class|ascii_downcase)==$c) + | { address: (.id|tostring), + title: ((.title // "") | if length>40 then .[0:40]+"…" else . end), + ws: .ws } ]' +} + +emit_row() { # exec class iconname pinned + local exec="$1" class="$2" icon="$3" pinned="$4" run=false + is_running "$class" && run=true + printf '%s\t%s\t%s\t%s\t%s\n' "$exec" "$class" "$(resolve_icon "$icon")" "$run" "$pinned" +} + +# ---- commands ------------------------------------------------------------- +case "${1:-apps}" in + apps) + { + pinned_classes="" + while IFS='|' read -r exec class icon; do + [ -z "$exec" ] && continue + emit_row "$exec" "$class" "$icon" true + pinned_classes="$pinned_classes $(lc "$class")" + done < "$PINS" + # running apps that aren't pinned -> show them too (unpinned) + clients_json \ + | jq -r '.[]|select(.class!="")|"\(.pid)\t\(.class)"' | sort -u \ + | while IFS=$'\t' read -r pid class; do + case " $pinned_classes " in *" $(lc "$class") "*) continue;; esac + exe=$(basename "$(readlink -f "/proc/$pid/exe" 2>/dev/null)" 2>/dev/null) + [ -z "$exe" ] && exe="$class" + emit_row "$exe" "$class" "$(lc "$class")" false + done + } | awk '!seen[$2]++' \ + | jq -R -s -c 'split("\n")|map(select(length>0))|map(split("\t")) + |map({exec:.[0],class:.[1],icon:.[2],running:(.[3]=="true"),pinned:(.[4]=="true")}) + |to_entries|map(.value + {idx: .key})' + ;; + launch) + class="${2:-}"; shift 2 2>/dev/null || shift $# + # focus the running window (niri jumps to its workspace) else launch it + id=$(clients_json \ + | jq -r --arg c "$(lc "$class")" '[.[]|select((.class|ascii_downcase)==$c)][0].id // empty') + if [ -n "$id" ]; then + wm_focus "$id" + else + setsid -f ${*} >/dev/null 2>&1 + fi + dock_dismiss + ;; + menu-open) + printf '%s' "$(date +%s%N)" > "$STAMP" 2>/dev/null # mark: an icon was right-clicked + class="${2:-}"; exe="${3:-}"; pinned="${4:-false}"; running="${5:-false}"; idx="${6:-}" + eww update dock-sel-class="$class" dock-sel-exec="$exe" \ + dock-sel-pinned="$pinned" dock-sel-running="$running" 2>/dev/null + eww update "dock-sel-windows=$(win_list "$class")" 2>/dev/null + eww close dock-bg-menu 2>/dev/null # icon menu wins over the background menu + eww open dock-menu-backdrop 2>/dev/null + eww close dock-menu 2>/dev/null # re-open fresh so a switch re-renders + # niri has no cursor Y, but we KNOW the clicked icon's index — so compute its + # on-screen Y from the (vertically-centred) dock layout and open the menu + # there with --pos, instead of always centring it. + eww open dock-menu --anchor "top left" --pos "104x$(menu_y "${idx:-0}")" 2>/dev/null + ;; + bg-menu) + # The icon's button onrightclick fires first (and stamps); this eventbox + # onrightclick lands here right after. If an icon was just clicked, suppress + # the background menu — only open it on a true empty-area right-click. + now=$(date +%s%N); last=$(cat "$STAMP" 2>/dev/null || echo 0) + [ "$(( (now - last) / 1000000 ))" -lt 250 ] && exit 0 + eww close dock-menu 2>/dev/null + eww open dock-menu-backdrop 2>/dev/null + eww close dock-bg-menu 2>/dev/null + eww open dock-bg-menu 2>/dev/null + ;; + new) + shift + setsid -f ${*} >/dev/null 2>&1 + eww close dock-menu dock-menu-backdrop 2>/dev/null + ;; + focus-win) + # focus one specific window by niri window id (jumps to its workspace) + id="${2:-}" + [ -n "$id" ] && wm_focus "$id" + dock_dismiss + ;; + close) + # kill by PID — robust, independent of the IPC focus API + class="${2:-}" + for pid in $(clients_json \ + | jq -r --arg c "$(lc "$class")" '.[]|select((.class|ascii_downcase)==$c)|.pid'); do + [ "$pid" -gt 0 ] 2>/dev/null && kill "$pid" 2>/dev/null + done + dock_dismiss + ;; + pin) + class="${2:-}" + grep -qiE "^[^|]*\|${class}\|" "$PINS" 2>/dev/null && { eww close dock-menu dock-menu-backdrop 2>/dev/null; exit 0; } + pid=$(clients_json \ + | jq -r --arg c "$(lc "$class")" '[.[]|select((.class|ascii_downcase)==$c)][0].pid // empty') + exe="" + [ -n "$pid" ] && [ "$pid" -gt 0 ] 2>/dev/null && exe=$(basename "$(readlink -f "/proc/$pid/exe" 2>/dev/null)" 2>/dev/null) + [ -z "$exe" ] && exe="$class" + printf '%s|%s|%s\n' "$exe" "$class" "$(lc "$class")" >> "$PINS" + eww close dock-menu dock-menu-backdrop 2>/dev/null + ;; + unpin) + class="${2:-}" + tmp=$(mktemp) + grep -viE "^[^|]*\|${class}\|" "$PINS" > "$tmp" 2>/dev/null + mv "$tmp" "$PINS" + eww close dock-menu dock-menu-backdrop 2>/dev/null + ;; + move-up|move-down) + # reorder the pinned app in dock-pins (swap with its neighbour). Order in + # dock-pins == order in the dock. Menu stays open so you can move repeatedly. + class="${2:-}" + mapfile -t L < "$PINS" 2>/dev/null + idx=-1 + for i in "${!L[@]}"; do case "${L[$i]}" in *"|${class}|"*) idx=$i; break;; esac; done + if [ "$idx" -ge 0 ]; then + if [ "$1" = move-up ]; then j=$((idx-1)); else j=$((idx+1)); fi + if [ "$j" -ge 0 ] && [ "$j" -lt "${#L[@]}" ]; then + t="${L[$idx]}"; L[$idx]="${L[$j]}"; L[$j]="$t" + printf '%s\n' "${L[@]}" > "$PINS" + eww update dock-apps="$("$0" apps)" 2>/dev/null # reflect immediately + fi + fi + ;; + # --- INSTANT intent writes (safe inside eww handlers — no sleep to kill) ---- + show) printf 'show' > "$HTOK" 2>/dev/null ;; # trigger/dock hover → want shown + keepalive) printf 'show' > "$HTOK" 2>/dev/null ;; # pointer on dock/icon → cancel hide + hide) printf 'leave:%s' "$(date +%s%3N)" > "$HTOK" 2>/dev/null ;; # pointer left at + hide-now) printf 'hidden' > "$HTOK" 2>/dev/null ;; # close immediately + + # --- the auto-hide daemon: started once by launch.sh ----------------------- + # eww can't kill THIS (it's not an event handler), so the timing is safe here. + # + # The dock window is mapped on show and CLOSED on hide (so nothing is visible + # when hidden — an always-mapped collapsed dock leaves a faint sliver). The + # revealer animates because the window has no fixed width (the slide axis is + # free to grow). All the open/sleep/close lives HERE in the daemon, never in an + # eww handler, so eww can't kill it mid-animation. + # + # Reconciles to $HTOK: show | leave: | hidden + watch) + # Start from a guaranteed-clean hidden state (closes any stale dock/catcher a + # crash or restart left mapped — otherwise a collapsed dock shows a sliver). + eww update dock-open=false 2>/dev/null + eww close dock dock-catcher 2>/dev/null + printf 'hidden' > "$HTOK" 2>/dev/null + vis=0 + dlog "watch" "START (forced hidden)" + while :; do + st=$(cat "$HTOK" 2>/dev/null) + case "$st" in + show) + if [ "$vis" = 0 ]; then + dlog "watch" "SHOW open" + eww update dock-open=false 2>/dev/null # collapsed before map + eww open dock-catcher 2>/dev/null # catcher first (below)… + eww open dock 2>/dev/null # …dock after → on top + sleep 0.12 # let it realize collapsed + [ "$(cat "$HTOK" 2>/dev/null)" = show ] || { eww close dock dock-catcher 2>/dev/null; continue; } + eww update dock-open=true 2>/dev/null # slide in (revealer) + vis=1 + fi + ;; + leave:*) + if [ "$vis" = 1 ]; then + t=${st#leave:}; now=$(date +%s%3N) + if [ "$((now - t))" -ge "$HIDE_MS" ]; then + dlog "watch" "HIDE (leave aged $((now-t))ms)" + eww update dock-open=false 2>/dev/null # slide out + sleep "$ANIM" + if [ "$(cat "$HTOK" 2>/dev/null)" = show ]; then + eww update dock-open=true 2>/dev/null # came back mid-slide + else + eww close dock dock-catcher 2>/dev/null # unmap both → no sliver + vis=0 + printf 'hidden' > "$HTOK" 2>/dev/null + fi + fi + fi + ;; + hidden) + if [ "$vis" = 1 ]; then + dlog "watch" "HIDE (hidden state)" + eww update dock-open=false 2>/dev/null + sleep "$ANIM" + if [ "$(cat "$HTOK" 2>/dev/null)" = show ]; then eww update dock-open=true 2>/dev/null + else eww close dock dock-catcher 2>/dev/null; vis=0; fi + fi + ;; + esac + sleep 0.05 + done + ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/doupdate.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/doupdate.sh new file mode 100755 index 0000000..7f6847f --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/doupdate.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# Full system update (repo + AUR) inside the eww Updates panel — no terminal. +# sudo auth via a zenity GUI password dialog; paru output streamed to eww vars: +# upd-running true while the update runs (panel swaps button → progress) +# upd-progress the latest output line +set -u +EWW(){ eww update "$@" 2>/dev/null; } +CACHE="$HOME/.cache/eww"; mkdir -p "$CACHE" +ASK="$CACHE/askpass.sh" +cat > "$ASK" <<'EOF' +#!/bin/sh +zenity --password --title="System-Update" --width=340 2>/dev/null +EOF +chmod +x "$ASK" + +EWW upd-running=true upd-progress="Authentifiziere…" + +# --sudoloop keeps the sudo timestamp warm after the single askpass prompt, so the +# AUR build steps (makepkg → sudo pacman) never re-prompt on a missing tty. +SUDO_ASKPASS="$ASK" stdbuf -oL paru -Syu --noconfirm --skipreview --sudoloop --sudoflags -A 2>&1 \ + | while IFS= read -r line; do [ -n "$line" ] && EWW upd-progress="$line"; done +rc=${PIPESTATUS[0]} + +if [ "$rc" -eq 0 ]; then EWW upd-progress="✓ System aktuell"; else EWW upd-progress="✗ Fehlgeschlagen (Code $rc)"; fi +EWW updates-list="$("$HOME/.config/eww/scripts/updates.sh" list)" +sleep 3 +EWW upd-running=false upd-progress="" diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/font.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/font.sh new file mode 100755 index 0000000..8e159d4 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/font.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# Mirror the GNOME UI font into eww's font-family (analogous to accent.sh). +# The system font is set in the TANINUX/GTK appearance settings; eww follows it. +# get print the resolved family +# apply rewrite the font-family line in eww.scss + reload +# watch apply now, then re-apply whenever gsettings font-name changes +set -u +DIR="$(cd "$(dirname "$0")/.." && pwd)" +SCSS="$DIR/eww.scss" + +family() { + # Pango string e.g. "Iosevka Aile Semi-Bold 11" → family "Iosevka Aile". + local f + f=$(gsettings get org.gnome.desktop.interface font-name 2>/dev/null | sed "s/^'//; s/'$//") + f=$(printf '%s' "$f" | sed -E 's/ [0-9]+(\.[0-9]+)?$//') # drop size + f=$(printf '%s' "$f" | sed -E 's/ (Thin|Extra-?Light|Light|Semi-?Light|Regular|Book|Medium|Semi-?Bold|Demi-?Bold|Bold|Extra-?Bold|Ultra-?Bold|Black|Heavy|Italic|Oblique|Condensed|Expanded)$//Ig') + [ -n "$f" ] && printf '%s' "$f" || printf 'Iosevka Aile' +} + +apply() { + local fam; fam=$(family) + sed -i -E "s|^(\s*font-family:).*|\1 \"$fam\", \"Symbols Nerd Font\", sans-serif;|" "$SCSS" + eww reload >/dev/null 2>&1 +} + +case "${1:-apply}" in + get) family; echo ;; + apply) apply ;; + watch) + apply + last=$(gsettings get org.gnome.desktop.interface font-name 2>/dev/null) + while :; do + sleep 3 + now=$(gsettings get org.gnome.desktop.interface font-name 2>/dev/null) + [ "$now" != "$last" ] && { last="$now"; apply; } + done ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/guard.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/guard.sh new file mode 100755 index 0000000..effe0da --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/guard.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# Safety net: never let an orphaned eww backdrop block all input. +# +# The lockout failure mode: a full-screen click-catcher (panel-backdrop / +# spot-backdrop / dock-menu-backdrop) stays mapped after its owner window is gone +# (a race, a crash, an interrupted close) — niri keeps the layer surface up and +# it swallows every click. (The dock is catcher-free, so it can't cause this.) +# +# Detection is DETERMINISTIC and niri-geometry-free: a backdrop is an orphan iff +# it is open while NONE of its owner windows are. We only ever close eww windows +# (never kill the daemon), and we require the orphan to persist across two polls +# (~1.4 s) so a normal open/close animation never trips it. +set -u + +EWW=eww +INTERVAL=0.7 # poll period +STRIKES_NEEDED=2 # consecutive orphan readings before acting + +# backdrop -> regex of windows that legitimise it being open +declare -A OWNER=( + [panel-backdrop]='^(control-center|calendar|music|sysmon|updates):' + [spot-backdrop]='^spotlight:' + [dock-menu-backdrop]='^(dock-menu|dock-bg-menu):' + [dock-catcher]='^dock:' +) +# var to reset when we force-close each backdrop (so the next open is clean) +declare -A RESET=( + [panel-backdrop]=panel-open + [spot-backdrop]=spot-open +) + +declare -A strike +for b in "${!OWNER[@]}"; do strike[$b]=0; done + +while :; do + sleep "$INTERVAL" + wins=$("$EWW" active-windows 2>/dev/null) || continue + [ -n "$wins" ] || continue + + for b in "${!OWNER[@]}"; do + if printf '%s\n' "$wins" | grep -q "^${b}:"; then + # backdrop is open — orphan only if no owner is open + if printf '%s\n' "$wins" | grep -qE "${OWNER[$b]}"; then + strike[$b]=0 # legit (owner present) + else + strike[$b]=$(( strike[$b] + 1 )) + if [ "${strike[$b]}" -ge "$STRIKES_NEEDED" ]; then + strike[$b]=0 + "$EWW" close "$b" 2>/dev/null + [ -n "${RESET[$b]:-}" ] && "$EWW" update "${RESET[$b]}=false" 2>/dev/null + fi + fi + else + strike[$b]=0 # backdrop not open + fi + done + + # NOTE: the dock window is intentionally always mapped (collapsed when hidden, + # dock-open=false). That is the normal hidden state now — NOT an orphan — so the + # guard must never close it. The dock is catcher-free and tiny when collapsed, + # so it can't cause a lockout anyway. +done diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/music.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/music.sh new file mode 100755 index 0000000..26787ed --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/music.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# Emit current player state as JSON for eww (playerctl). Caches remote cover art. +cache="$HOME/.cache/eww" +mkdir -p "$cache" + +last="" +last_art="" + +emit() { + local status title artist art icon cover + status=$(playerctl status 2>/dev/null) + [ -z "$status" ] && status="Stopped" + title=$(playerctl metadata title 2>/dev/null) + artist=$(playerctl metadata artist 2>/dev/null) + art=$(playerctl metadata mpris:artUrl 2>/dev/null) + + if [ "$status" = "Playing" ]; then icon="󰏤"; else icon="󰐊"; fi + + cover="" + case "$art" in + file://*) cover="${art#file://}";; + http*://*) + if [ "$art" != "$last_art" ]; then + curl -sL --max-time 5 "$art" -o "$cache/cover.img" 2>/dev/null && cover="$cache/cover.img" + else + cover="$cache/cover.img" + fi + ;; + esac + last_art="$art" + + jq -nc --arg s "$status" --arg t "$title" --arg a "$artist" --arg i "$icon" --arg c "$cover" \ + '{status:$s,title:$t,artist:$a,icon:$i,cover:$c}' +} + +while true; do + cur=$(emit) + if [ "$cur" != "$last" ]; then + printf '%s\n' "$cur" + last="$cur" + fi + sleep 1 +done diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/network.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/network.sh new file mode 100755 index 0000000..5ec7cfd --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/network.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# Network status / toggle via NetworkManager. + +case "${1:-status}" in + toggle) + if [ "$(nmcli radio wifi)" = enabled ]; then nmcli radio wifi off + else nmcli radio wifi on; fi + ;; + status|*) + line=$(nmcli -t -f NAME,TYPE,DEVICE connection show --active 2>/dev/null \ + | grep -v ':loopback' | head -1) + name=$(printf '%s' "$line" | cut -d: -f1) + type=$(printf '%s' "$line" | cut -d: -f2) + icon="󰖪"; label="Offline" + if [ -n "$name" ]; then + case "$type" in + *wireless*) icon="󰖩"; label="$name";; + *ethernet*) icon="󰈀"; label="$name";; + *) icon="󰈀"; label="$name";; + esac + fi + jq -nc --arg i "$icon" --arg l "$label" '{icon:$i,label:$l}' + ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/night.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/night.sh new file mode 100755 index 0000000..0cc2dd6 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/night.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# Night light (wlsunset) status / toggle. +# Matches the args used in the niri config.kdl autostart. +ARGS="-l 47 -L 8.3 -d 600 -t 4000 -T 6500" + +case "${1:-toggle}" in + status) + pgrep -x wlsunset >/dev/null && echo true || echo false + ;; + toggle) + if pgrep -x wlsunset >/dev/null; then + pkill -x wlsunset + else + # shellcheck disable=SC2086 + setsid wlsunset $ARGS >/dev/null 2>&1 & + fi + ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/notifications.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/notifications.sh new file mode 100755 index 0000000..1d3a631 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/notifications.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +# Notification bridge: tiramisu (headless daemon) -> eww UI. +# Replaces mako. Keeps a JSON history, drives the control-center list and a +# top-right popup toast, and respects a Do-not-Disturb flag. +# +# listen run tiramisu and feed notifications into eww (the daemon) +# dismiss drop one notification from the history +# clear empty the history +# refresh re-push the current history into eww (after `eww reload`) +# popup-close close the current toast now +# dnd-toggle flip Do-not-Disturb +# dnd-get print the DnD state (for the eww poll) +set -u + +CACHE="$HOME/.cache/eww" +STORE="$CACHE/notifications.json" +DND="$CACHE/dnd" +PTIMER="$CACHE/.notif-popup-timer" +MAX=50 # keep at most this many in history +POPUP_SECS=5 # auto-dismiss the toast after N seconds + +mkdir -p "$CACHE" +[ -f "$STORE" ] || echo '[]' > "$STORE" +[ -f "$DND" ] || echo 'false' > "$DND" + +push() { eww update notifications="$(cat "$STORE")" 2>/dev/null; } + +show_popup() { # $1 = a single notification JSON object + eww update popup="$1" 2>/dev/null + eww open notification-popup 2>/dev/null + [ -f "$PTIMER" ] && kill "$(cat "$PTIMER")" 2>/dev/null + ( sleep "$POPUP_SECS"; eww close notification-popup 2>/dev/null; rm -f "$PTIMER" ) & + echo $! > "$PTIMER" +} + +case "${1:-listen}" in + listen) + command -v tiramisu >/dev/null 2>&1 || { echo "tiramisu not installed" >&2; exit 1; } + push # restore whatever is already in the history on startup + # tiramisu -j emits one sanitized JSON object per notification. + # NOTE: field names (.source/.summary/.body/.id) are verified against a + # real `tiramisu -j` probe — adjust here if the probe shows other keys. + tiramisu -j | while IFS= read -r line; do + [ -z "$line" ] && continue + obj=$(jq -c --arg t "$(date '+%H:%M')" ' + { id: ((.id // "0")|tostring), + app: (.source // .app_name // .["app-name"] // "Notification"), + summary: (.summary // ""), + body: (.body // ""), + time: $t }' <<<"$line" 2>/dev/null) || continue + [ -z "$obj" ] && continue + tmp=$(jq -c --argjson n "$obj" --argjson max "$MAX" '[$n] + . | .[0:$max]' "$STORE") || continue + printf '%s' "$tmp" > "$STORE" + push + [ "$(cat "$DND" 2>/dev/null)" != "true" ] && show_popup "$obj" + done + ;; + dismiss) + tmp=$(jq -c --arg id "${2:-}" 'map(select((.id|tostring) != $id))' "$STORE") && printf '%s' "$tmp" > "$STORE" + push + ;; + clear) + echo '[]' > "$STORE"; push + ;; + refresh) + push + ;; + popup-close) + [ -f "$PTIMER" ] && kill "$(cat "$PTIMER")" 2>/dev/null + rm -f "$PTIMER" + eww close notification-popup 2>/dev/null + ;; + dnd-toggle) + [ "$(cat "$DND" 2>/dev/null)" = "true" ] && echo false > "$DND" || echo true > "$DND" + ;; + dnd-get) + cat "$DND" 2>/dev/null || echo false + ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/panel.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/panel.sh new file mode 100755 index 0000000..092bc7d --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/panel.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# Toggle an eww panel with a click-outside backdrop. One panel open at a time. +# toggle open it (closing others) or close it if already open +# close close the open panel + backdrop +# +# IMPORTANT (niri/eww): eww KILLS an event-handler process as soon as it lingers +# (a `sleep`). So the panel buttons / backdrop call this script, and we must NOT +# rely on a sleep surviving inside it: the **backdrop is always closed FIRST and +# instantly** (so a kill can never strand a full-screen click-eater → no lockout), +# and the only sleep (for the slide animation) runs in a DETACHED `setsid` +# process that eww can't kill. +set -u + +PANELS="control-center calendar music sysmon updates" + +# detached slide helper: $1 = panel-open target, rest = windows to close after anim +_defer_close() { # usage: _defer_close "win win2 ..." + # Wait the full fade (100ms) + a margin BEFORE unmapping, so the window never + # pops away while still partly visible (that read as a "hard" cut on close). + setsid -f sh -c "sleep 0.2; eww close $1" >/dev/null 2>&1 +} + +case "${1:-close}" in + toggle) + win="${2:-}" + [ -n "$win" ] || exit 0 + if eww active-windows 2>/dev/null | grep -q "^${win}:"; then + # already open → dismiss (backdrop first, then animated close) + eww close panel-backdrop 2>/dev/null + eww update panel-open=false 2>/dev/null + _defer_close "$win" + else + eww close $PANELS panel-backdrop 2>/dev/null # only one at a time + eww update panel-open=false 2>/dev/null # start collapsed + eww open panel-backdrop 2>/dev/null # backdrop first (below) + eww open "$win" 2>/dev/null # panel on top (collapsed) + # reveal AFTER realize, in a detached process so an eww-killed handler + # can't leave the panel stuck collapsed under an open backdrop. + setsid -f sh -c 'sleep 0.12; eww update panel-open=true' >/dev/null 2>&1 + fi + ;; + close) + eww close panel-backdrop 2>/dev/null # kill any lockout instantly + eww update panel-open=false 2>/dev/null # slide out + _defer_close "$PANELS" + ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/panelcfg.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/panelcfg.sh new file mode 100755 index 0000000..fa4b09f --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/panelcfg.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# Consume TANINUX's panel/dock settings (panel.json) into eww. +# apply push settings live (eww update + imperative autohide) +# watch apply now, then re-apply whenever panel.json changes +# get read a value (used by clock.sh / dock.sh) +# +# Contract file: ~/.local/share/taninux/panel.json (see docs/eww-panel-dock-integration.md) +set -u +CFG="${XDG_DATA_HOME:-$HOME/.local/share}/taninux/panel.json" + +# seed defaults if missing, so eww always has something to read +if [ ! -f "$CFG" ]; then + mkdir -p "$(dirname "$CFG")" + cat > "$CFG" <<'EOF' +{ + "version": 1, + "dock": { "autohide": true, "icon_size": 42, "hide_delay": 1.2 }, + "bar": { "clock_format": "%H:%M %A, %d.%m.%Y", + "modules": { "music": true, "sys": true, "updates": true, "net": true, "bt": true, "vol": true } } +} +EOF +fi + +. "$(dirname "$0")/wm.sh" # niri helpers +j() { jq -r "$1" "$CFG" 2>/dev/null; } + +apply() { + # --- live vars (no reload) --- + local icon modules + icon=$(j '.dock.icon_size // 42'); case "$icon" in ''|*[!0-9]*) icon=42;; esac + [ "$icon" -lt 24 ] && icon=24; [ "$icon" -gt 64 ] && icon=64 + modules=$(jq -c '.bar.modules // {}' "$CFG" 2>/dev/null); [ -z "$modules" ] && modules='{}' + eww update cfg-icon-size="$icon" "cfg-modules=$modules" 2>/dev/null + + # --- autohide --- the dock window stays mapped; we flip dock-open (revealer) + # and the hover trigger. autohide off = parked open; on = hover to reveal. + eww open dock 2>/dev/null + if [ "$(j 'if .dock.autohide == false then "false" else "true" end')" = "false" ]; then + eww update dock-open=true 2>/dev/null; eww close dock-trigger 2>/dev/null # always visible + else + eww update dock-open=false 2>/dev/null; eww open dock-trigger 2>/dev/null # hover to reveal + fi + # clock_format + hide_delay are read on demand by clock.sh / dock.sh. +} + +case "${1:-apply}" in + get) j "${2:-.}" ;; + apply) apply ;; + toggle-autohide) + cur=$(j 'if .dock.autohide == false then "false" else "true" end') + new=$([ "$cur" = "false" ] && echo true || echo false) + tmp=$(mktemp) + jq ".dock.autohide = $new" "$CFG" > "$tmp" 2>/dev/null && mv "$tmp" "$CFG" + apply + ;; + watch) + apply + last=$(stat -c %Y "$CFG" 2>/dev/null || echo 0) + while :; do + sleep 2 + now=$(stat -c %Y "$CFG" 2>/dev/null || echo 0) + [ "$now" != "$last" ] && { last="$now"; apply; } + done ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/power.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/power.sh new file mode 100755 index 0000000..83600b7 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/power.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# Power actions for the Control Center dropdown — compositor-agnostic. +set -u +. "$(dirname "$0")/wm.sh" +eww close control-center panel-backdrop 2>/dev/null +case "${1:-}" in + lock) wm_lock ;; + logout) wm_exit ;; + sleep) systemctl suspend ;; + reboot) systemctl reboot ;; + shutdown) systemctl poweroff ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/settings.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/settings.sh new file mode 100755 index 0000000..8b5708e --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/settings.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Open the TANINUX GTK settings app. Single-instance (GTK app-id), so a second +# call just focuses the existing window. Runs with system python (needs `gi`, +# which the project venv lacks). +cd "$HOME/projects/taninux" 2>/dev/null || exit 1 +# Args are passed through for deep-linking, e.g. `--page panel-dock` (the app may +# ignore unknown args and just open normally — best effort). +setsid -f env PYTHONPATH=src /usr/bin/python -m taninux.gui "$@" >/dev/null 2>&1 diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/spotlight.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/spotlight.sh new file mode 100755 index 0000000..a994d24 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/spotlight.sh @@ -0,0 +1,275 @@ +#!/usr/bin/env bash +# Spotlight launcher backend for eww. +# query build results, push to eww (spot-results), cache for activate +# activate run the cached result's action, close the launcher +# open [clip] open + focus the launcher (optionally in clipboard mode) +# close +# reindex rebuild the .desktop app cache +# +# Sigils inside the query: +# =expr calc ?text web >cmd shell :name emoji +# /path ~path file ;text clipboard +# No sigil → fuzzy apps (plus an inline calc row if the text is an expression). +set -u + +CACHE="$HOME/.cache/eww"; mkdir -p "$CACHE" +RES="$CACHE/spot-results.json" +APPTSV="$CACHE/spot-apps.tsv" +EMOJI="$(cd "$(dirname "$0")/.." && pwd)/data/emoji.tsv" +MAX=12 + +lc() { printf '%s' "$1" | tr 'A-Z' 'a-z'; } + +# On Sway the launcher runs inside a one-key "launcher" mode (only Escape bound) so +# Escape handling is done inside eww (the spotlight window's onkey); nothing to +# reset at the compositor level on niri. +nav_reset() { :; } + +resolve_icon() { # icon name -> file path (Papirus svg preferred) + local name="$1" base sz ext f + [ -z "$name" ] && name="application-x-executable" + case "$name" in /*) [ -f "$name" ] && { printf '%s' "$name"; return; };; esac + for base in /usr/share/icons/Papirus-Dark /usr/share/icons/Papirus; do + for sz in 64x64 48x48 32x32 24x24; do + for ext in svg png; do + [ -f "$base/$sz/apps/$name.$ext" ] && { printf '%s' "$base/$sz/apps/$name.$ext"; return; } + done + done + done + f=$(find /usr/share/icons/hicolor -type f \( -name "$name.svg" -o -name "$name.png" \) 2>/dev/null \ + | sort -t/ -k6 -rn | head -1) + [ -n "$f" ] && { printf '%s' "$f"; return; } + for ext in svg png xpm; do + [ -f "/usr/share/pixmaps/$name.$ext" ] && { printf '%s' "/usr/share/pixmaps/$name.$ext"; return; } + done + printf '/usr/share/icons/Papirus-Dark/64x64/apps/application-x-executable.svg' +} + +# ---- app index (cached TSV: id \t name \t iconpath \t haystack) ------------- +reindex() { + local dirs=(/usr/share/applications "$HOME/.local/share/applications" \ + /var/lib/flatpak/exports/share/applications \ + "$HOME/.local/share/flatpak/exports/share/applications") + : > "$APPTSV.tmp" + local d f + for d in "${dirs[@]}"; do + [ -d "$d" ] || continue + for f in "$d"/*.desktop; do + [ -f "$f" ] || continue + awk -F= ' + /^\[/ { grp = ($0=="[Desktop Entry]"); next } + grp && /^Name=/ && n=="" { n=substr($0,6) } + grp && /^Icon=/ && ic=="" { ic=substr($0,6) } + grp && /^NoDisplay=/ { nd=substr($0,11) } + grp && /^Hidden=/ { hd=substr($0,8) } + grp && /^Type=/ { ty=substr($0,6) } + grp && /^Comment=/ && cm=="" { cm=substr($0,9) } + grp && /^GenericName=/ && gn=="" { gn=substr($0,13) } + grp && /^Keywords=/ && kw=="" { kw=substr($0,10) } + END { + if (n=="" || ty!="Application" || nd=="true" || hd=="true") exit + printf "%s\t%s\t%s\t%s\n", n, ic, gn" "cm" "kw, "" + }' "$f" | while IFS=$'\t' read -r name icon extra _; do + [ -n "$name" ] || continue + local id; id=$(basename "$f" .desktop) + printf '%s\t%s\t%s\t%s\n' "$id" "$name" "$(resolve_icon "$icon")" "$(lc "$name $extra")" >> "$APPTSV.tmp" + done + done + done + sort -u -t$'\t' -k2 "$APPTSV.tmp" > "$APPTSV"; rm -f "$APPTSV.tmp" +} +ensure_index() { + [ -s "$APPTSV" ] || reindex + # rebuild if any app dir is newer than the cache + local newer + newer=$(find /usr/share/applications "$HOME/.local/share/applications" \ + -name '*.desktop' -newer "$APPTSV" -print -quit 2>/dev/null) + [ -n "$newer" ] && reindex +} + +# ---- result assembly -------------------------------------------------------- +items=() +add() { # type iconOrPath title sub act + local img="" gly="$2" + case "$2" in /*) img="$2"; gly="";; esac + items+=("$(jq -nc --arg t "$1" --arg g "$gly" --arg im "$img" --arg ti "$3" --arg s "$4" --arg a "$5" \ + '{type:$t,icon:$g,img:$im,title:$ti,sub:$s,act:$a}')") +} +emit() { + if [ ${#items[@]} -eq 0 ]; then printf '[]' > "$RES" + else printf '%s\n' "${items[@]}" | jq -s 'to_entries|map(.value + {idx:.key})' > "$RES"; fi + eww update spot-results="$(cat "$RES")" 2>/dev/null +} + +# ---- modes ------------------------------------------------------------------ +m_calc() { # inline=1 marks the auto row added before apps + local expr="$1" out + out=$(qalc -t -- "$expr" 2>/dev/null) + [ -z "$out" ] && return + case "$out" in *error*|*Error*) return;; esac + add calc "󰪚" "$out" "= $expr · Enter kopiert" "$out" +} +m_web() { + local q="$1" url + [ -n "$q" ] || return + url="https://duckduckgo.com/?q=$(jq -rn --arg q "$q" '$q|@uri')" + add web "󰖟" "$q" "Im Web suchen · DuckDuckGo" "$url" +} +m_shell() { + local c="$1"; [ -n "$c" ] || return + add shell "" "$c" "Shell-Befehl ausführen" "$c" +} +m_emoji() { + local q; q=$(lc "$1") + [ -f "$EMOJI" ] || return + local line + if [ -z "$q" ]; then line=$(head -n $MAX "$EMOJI") + else line=$(grep -i -- "$q" "$EMOJI" 2>/dev/null | head -n $MAX); fi + while IFS=$'\t' read -r ch name; do + [ -n "$ch" ] && add emoji "$ch" "$name" "Enter kopiert" "$ch" + done <<< "$line" +} +m_files() { + local q="$1" base="$HOME" + command -v fd >/dev/null 2>&1 || { add note "" "fd nicht installiert" "sudo pacman -S fd" ""; return; } + case "$q" in /*) base=/; ;; "~"*) q="${q#\~}"; q="${q#/}";; esac + [ -n "$q" ] || return + while IFS= read -r p; do + [ -n "$p" ] || continue + add file "󰈔" "$(basename "$p")" "${p/#$HOME/~}" "$p" + done < <(fd -H -E .git --max-results $MAX -- "$q" "$base" 2>/dev/null) +} +m_clip() { + local q="$1" + command -v cliphist >/dev/null 2>&1 || { add note "" "cliphist nicht installiert" "sudo pacman -S cliphist" ""; return; } + local line + if [ -z "$q" ]; then line=$(cliphist list 2>/dev/null | head -n $MAX) + else line=$(cliphist list 2>/dev/null | grep -i -- "$q" | head -n $MAX); fi + local id text + while IFS= read -r row; do + [ -n "$row" ] || continue + id=${row%%$'\t'*}; text=${row#*$'\t'} + add clip "󰅍" "$text" "Clipboard · Enter kopiert" "$id" + done <<< "$line" +} +m_apps() { + [ -z "$1" ] && return # empty query → no app rows (clean start) + local q; q=$(lc "$1") + ensure_index + local rows + rows=$(awk -F'\t' -v q="$q" ' + function score(s, i,p) { p=index(s,q); return p } + { + hay=$4; name=tolower($2) + ok=1; n=split(q,toks," ") + for(i=1;i<=n;i++) if(index(hay,toks[i])==0){ok=0;break} + if(!ok) next + sc = (index(name,q)==1)?0 : (index(name,q)>0?1 : 2) + printf "%d\t%s\t%s\t%s\n", sc, $1, $2, $3 + }' "$APPTSV" | sort -n -k1 | head -n $MAX) + local id name icon _sc + while IFS=$'\t' read -r _sc id name icon; do + [ -n "$id" ] && add app "$icon" "$name" "Anwendung" "$id" + done <<< "$rows" +} + +# ---- dispatch --------------------------------------------------------------- +_build() { # sigil-aware build (apps mode / default); fills items[] + local raw="$*" + items=() + case "$raw" in + "="*) m_calc "${raw#=}" ;; + "?"*) m_web "${raw#\?}" ;; + ">"*) m_shell "${raw#>}" ;; + ":"*) m_emoji "${raw#:}" ;; + ";"*) m_clip "${raw#;}" ;; + "/"*|"~"*) m_files "$raw" ;; + "") m_apps "" ;; + *) + if printf '%s' "$raw" | grep -qE '^[0-9.(][0-9.+*/^%() -]*$' \ + && printf '%s' "$raw" | grep -qE '[-+*/^%]'; then m_calc "$raw"; fi + m_apps "$raw" + ;; + esac +} + +query() { _build "$*"; emit; } + +qmode() { # explicit category (from a pill); text is the raw search, no sigil + local mode="$1"; shift + items=() + case "$mode" in + clip) m_clip "$*" ;; + emoji) m_emoji "$*" ;; + calc) m_calc "$*" ;; + web) m_web "$*" ;; + files) m_files "$*" ;; + apps|*) _build "$*" ;; + esac + emit +} + +activate() { + local idx="$1" + [ -s "$RES" ] || exit 0 + local type act + type=$(jq -r --argjson i "$idx" '.[$i].type // empty' "$RES" 2>/dev/null) + act=$(jq -r --argjson i "$idx" '.[$i].act // empty' "$RES" 2>/dev/null) + [ -n "$type" ] || { spot_close; exit 0; } + case "$type" in + app) setsid -f gtk-launch "$act" >/dev/null 2>&1 ;; + web) setsid -f xdg-open "$act" >/dev/null 2>&1 ;; + shell) setsid -f sh -c "$act" >/dev/null 2>&1 ;; + file) setsid -f xdg-open "$act" >/dev/null 2>&1 ;; + calc|emoji) printf '%s' "$act" | wl-copy ;; + clip) cliphist decode "$act" 2>/dev/null | wl-copy ;; + esac + spot_close +} + +# slide out, then unmap (niri doesn't animate layer map/unmap itself) +# Close spotlight with an animated slide-out, robustly: the full-screen +# spot-backdrop is closed FIRST and instantly (so a killed handler can never leave +# a click-eater → no lockout), then the body slides out (spot-open=false) and the +# window is unmapped from a DETACHED process eww can't kill. +spot_close() { + eww close spot-backdrop 2>/dev/null # catcher gone immediately (no lockout) + eww update spot-open=false 2>/dev/null # slide the body out + setsid -f sh -c 'sleep 0.2; eww close spotlight' >/dev/null 2>&1 + nav_reset +} + +open() { + local mode="${1:-apps}" + eww update spot-q="" spot-mode="$mode" 2>/dev/null + if [ "$mode" = clip ]; then qmode clip ""; else items=(); emit; fi + eww update spot-open=false 2>/dev/null # start collapsed + eww open spot-backdrop 2>/dev/null # click-outside catcher (stacks below) + eww open spotlight 2>/dev/null + # reveal in a DETACHED process so an eww-killed handler can't leave spotlight + # stuck collapsed under an open backdrop (lockout). + setsid -f sh -c 'sleep 0.12; eww update spot-open=true' >/dev/null 2>&1 +} + +# called on every keystroke: render results for the active category. +# A leading sigil always wins, regardless of which pill is active. +type_query() { + local text="$*" + eww update spot-q="$text" 2>/dev/null + case "$text" in + "="*|"?"*|">"*|":"*|";"*|"/"*|"~"*) query "$text"; return ;; + esac + local mode; mode=$(eww get spot-mode 2>/dev/null); [ -z "$mode" ] && mode=apps + qmode "$mode" "$text" +} + +case "${1:-}" in + query) shift; query "$*" ;; + qmode) shift; mode="$1"; shift; qmode "$mode" "$*" ;; + type) shift; type_query "$*" ;; + activate) activate "${2:-0}" ;; + open) open "${2:-}" ;; + close) spot_close ;; + reindex) reindex ;; + *) echo "usage: spotlight.sh {query|qmode|type|cycle|activate|open|close|reindex}" >&2; exit 1 ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/sysinfo.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/sysinfo.sh new file mode 100755 index 0000000..67160bb --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/sysinfo.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# CPU%, RAM%, Disk% (root), Temp(°C) as JSON for eww. + +# --- CPU (delta over a short sample) --- +read -r _ a b c d _ < /proc/stat; t1=$((a+b+c+d)); idle1=$d +sleep 0.3 +read -r _ a b c d _ < /proc/stat; t2=$((a+b+c+d)); idle2=$d +dt=$((t2 - t1)); di=$((idle2 - idle1)) +cpu=0; [ "$dt" -gt 0 ] && cpu=$(( (100 * (dt - di)) / dt )) + +# --- RAM --- +mt=$(awk '/MemTotal/{print $2}' /proc/meminfo) +ma=$(awk '/MemAvailable/{print $2}' /proc/meminfo) +mem=0; [ "${mt:-0}" -gt 0 ] && mem=$(( (100 * (mt - ma)) / mt )) + +# --- Disk (root) --- +disk=$(df -P / | awk 'NR==2{gsub("%","",$5); print $5}') + +# --- Temp (sensors → fallback thermal zone) --- +temp=$(sensors -j 2>/dev/null | jq -r ' + [.. | objects | to_entries[] | select(.key|test("temp.*_input")) | .value] + | map(select(. > 0)) | if length > 0 then (add/length) else 0 end' 2>/dev/null) +if [ -z "$temp" ] || [ "$temp" = "null" ] || [ "$temp" = "0" ]; then + temp=$(awk '{printf "%d", $1/1000}' /sys/class/thermal/thermal_zone0/temp 2>/dev/null) +fi +temp=$(printf '%.0f' "${temp:-0}") + +jq -nc --argjson cpu "${cpu:-0}" --argjson mem "${mem:-0}" \ + --argjson disk "${disk:-0}" --argjson temp "${temp:-0}" \ + '{cpu:$cpu,mem:$mem,disk:$disk,temp:$temp}' diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/updates.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/updates.sh new file mode 100755 index 0000000..5d6f75a --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/updates.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# Pending updates: official repos (checkupdates) + AUR (paru -Qua). +# count number of pending updates (default) +# list JSON [{name, old, new, src}] src = repo|aur +set -u +repo(){ checkupdates 2>/dev/null; } # "name old -> new" +aur(){ paru -Qua 2>/dev/null; } # "name old -> new" +case "${1:-count}" in + count) echo $(( $(repo|wc -l) + $(aur|wc -l) )) ;; + list) + { repo | awk '{print $1"\t"$2"\t"$4"\trepo"}' + aur | awk '{print $1"\t"$2"\t"$4"\taur"}'; } \ + | jq -R -s -c 'split("\n")|map(select(length>0))|map(split("\t")) + |map({name:.[0],old:.[1],new:.[2],src:.[3]})' ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/volume.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/volume.sh new file mode 100755 index 0000000..ea33cec --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/volume.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# Volume via wireplumber (wpctl). +sink="@DEFAULT_AUDIO_SINK@" + +case "${1:-get}" in + get) + raw=$(wpctl get-volume "$sink" 2>/dev/null) # e.g. "Volume: 0.95 [MUTED]" + vol=$(printf '%s' "$raw" | awk '{print $2}') + perc=$(awk -v v="${vol:-0}" 'BEGIN{printf "%d", v*100 + 0.5}') + muted=false + printf '%s' "$raw" | grep -q MUTED && muted=true + if [ "$muted" = true ] || [ "$perc" -eq 0 ]; then icon="󰖁" + elif [ "$perc" -lt 50 ]; then icon="󰕿" + else icon="󰕾"; fi + jq -nc --argjson p "$perc" --argjson m "$muted" --arg i "$icon" \ + '{percent:$p,muted:$m,icon:$i}' + ;; + set) wpctl set-volume -l 1 "$sink" "${2:-0}%";; + mute) wpctl set-mute "$sink" toggle;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/wm.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/wm.sh new file mode 100755 index 0000000..9e71a0d --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/wm.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +# niri helpers for the eww scripts. niri-only — the Hyprland/Sway abstraction +# (and its compositor detector) was removed; the old dual-compat version is in +# ~/eww-backup-dual-*. Source this: . "$(dirname "$0")/wm.sh" +# +# Provides: +# $WM always "niri" (kept so callers' $WM checks resolve) +# wm_clients normalised JSON [{id,pid,class,title,ws}] +# wm_focus focus a window by id +# wm_goto_ws focus a workspace by index +# wm_cycle_ws focus prev/next workspace +# wm_cursor_y empty (niri has no cursor-position IPC) +# wm_outputs number of active outputs +# wm_lock / wm_exit lock screen / quit the compositor +# wm_blur_layer no-op (niri layer effects live in config.kdl) + +WM=niri +export WM + +wm_clients() { + niri msg --json windows 2>/dev/null | jq -c ' + [ .[] | { id: (.id|tostring), + pid: (.pid // 0), + class: (.app_id // ""), + title: (.title // ""), + ws: ((.workspace_id // "") | tostring) } ]' +} + +wm_focus() { [ -n "${1:-}" ] && niri msg action focus-window --id "$1" >/dev/null 2>&1; } +wm_goto_ws() { niri msg action focus-workspace "$1" >/dev/null 2>&1; } +wm_cycle_ws() { + if [ "$1" = up ]; then niri msg action focus-workspace-up >/dev/null 2>&1 + else niri msg action focus-workspace-down >/dev/null 2>&1; fi +} + +wm_cursor_y() { printf ''; } # niri exposes no pointer position over IPC + +wm_outputs() { niri msg --json outputs 2>/dev/null | jq '[.[]|select(.logical!=null)]|length'; } + +wm_lock() { swaylock -f; } +wm_exit() { niri msg action quit --skip-confirmation >/dev/null 2>&1; } + +# Blur/rounding/shadow for eww's layer surfaces is declarative in config.kdl +# (a layer-rule matched on the gtk-layer-shell namespace) — nothing to do live. +wm_blur_layer() { :; } diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/workspaces.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/workspaces.sh new file mode 100755 index 0000000..f0dfb78 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/workspaces.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# Emit niri workspaces as JSON for eww: +# [{"id":,"active":,"windows":}] sorted by idx ascending +# We display the per-monitor index (.idx) as the workspace number — that's also +# what `focus-workspace ` takes (see scripts/ws.sh). niri workspaces are +# dynamic & per-output, so eww.yuck renders the live list, not a fixed 1..10 set. +. "$(dirname "$0")/wm.sh" + +emit() { + local wins + wins=$(niri msg --json windows 2>/dev/null) + niri msg --json workspaces 2>/dev/null | jq -c --argjson wins "${wins:-[]}" ' + [ .[] | .id as $wid + | { id: .idx, + active: .is_focused, + windows: ([ $wins[] | select(.workspace_id == $wid) ] | length) } ] + | sort_by(.id)' +} + +last="" +print_if_new() { + local cur; cur=$(emit) + if [ -n "$cur" ] && [ "$cur" != "$last" ]; then + printf '%s\n' "$cur"; last="$cur" + fi +} + +print_if_new +# Newline-delimited JSON event stream; the first lines are a full snapshot, then +# deltas. We just re-emit on every event — cheap and always correct. +niri msg --json event-stream 2>/dev/null | while read -r _; do + print_if_new +done diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/ws.sh b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/ws.sh new file mode 100755 index 0000000..39bc7b5 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/eww/scripts/ws.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -u +. "$(dirname "$0")/wm.sh" +case "${1:-}" in + switch) wm_goto_ws "${2:-}" ;; + cycle) wm_cycle_ws "${2:-}" ;; +esac diff --git a/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/niri/config.kdl b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/niri/config.kdl new file mode 100644 index 0000000..7d90251 --- /dev/null +++ b/packaging/tanin-eww/pkg/tanin-eww/usr/share/tanin/skel/.config/niri/config.kdl @@ -0,0 +1,195 @@ +// niri config — ported from the Hyprland/eww setup. +// Docs: https://niri-wm.github.io/niri/ · validate with `niri validate`. + +input { + keyboard { + xkb { + layout "ch" + } + numlock + } + touchpad { + tap + } + mouse {} +} + +// Outputs — scale 1.25 like the Hyprland setup. Mode omitted on purpose so niri +// picks the highest refresh rate automatically (144 Hz on DP-3). Positions are +// left to niri's auto-placement. +output "DP-3" { + scale 1.25 +} +output "HDMI-A-1" { + scale 1.25 +} + +layout { + gaps 10 + center-focused-column "never" + + preset-column-widths { + proportion 0.33333 + proportion 0.5 + proportion 0.66667 + } + default-column-width { proportion 0.5; } + + // Fuji violet accent on the focus ring. + focus-ring { + width 3 + active-color "#a39ec4" + inactive-color "#505050" + } + border { + off + } + + // Subtle window shadow for depth. + shadow { + on + softness 20 + spread 3 + offset x=0 y=4 + color "#00000070" + } +} + +// ---- autostart ------------------------------------------------------------ +// Bring up the systemd user session so portals (dark mode via +// org.freedesktop.portal.Settings) and TANINUX user services start. +spawn-at-startup "dbus-update-activation-environment" "--systemd" "--all" +spawn-at-startup "systemctl" "--user" "start" "tanin-session.target" +spawn-at-startup "/bin/sh" "-c" "$HOME/.config/eww/launch.sh" +spawn-at-startup "waypaper" "--restore" +spawn-at-startup "wlsunset" "-l" "47" "-L" "8.3" "-d" "600" "-t" "4000" "-T" "6500" +spawn-at-startup "nm-applet" +spawn-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1" +spawn-at-startup "nextcloud" "--background" + +hotkey-overlay { + skip-at-startup +} + +screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" + +animations { + // On by default. Uncomment to disable everything: + // off +} + +// Ask apps to drop their client-side decorations (title/header bars); niri then +// draws only its own border/focus-ring. Apps that honour the protocol lose the +// top bar. (Some GTK apps ignore it and keep their headerbar — that's the app.) +prefer-no-csd + +// Rounded corners for all windows. +window-rule { + geometry-corner-radius 14 + clip-to-geometry true +} + +// ---- eww frosted-glass / effects (enable after first boot) ---------------- +// niri's layer-shell effects are version-sensitive; once niri runs we verify the +// real namespace with `niri msg --json layers` and enable blur/rounding/shadow. +// /-layer-rule { +// match namespace="^gtk-layer-shell$" +// geometry-corner-radius 14 +// shadow { on; softness 8; spread 0; offset x=0 y=2; color "#00000088"; } +// } + +binds { + Mod+Shift+Slash { show-hotkey-overlay; } + + // --- launchers / apps (Hyprland muscle memory) --- + Mod+Backspace hotkey-overlay-title="Terminal: kitty" { spawn "kitty"; } + Mod+T hotkey-overlay-title="Terminal: kitty" { spawn "kitty"; } + Mod+E hotkey-overlay-title="Files: nautilus" { spawn "nautilus"; } + Mod+Space hotkey-overlay-title="Apps: Spotlight" { spawn-sh "$HOME/.config/eww/scripts/spotlight.sh open"; } + Mod+C hotkey-overlay-title="Calc: rofi" { spawn-sh "rofi -show calc"; } + + // --- eww panels --- + Mod+A hotkey-overlay-title="Control Center" { spawn-sh "$HOME/.config/eww/scripts/panel.sh toggle control-center"; } + Mod+N hotkey-overlay-title="Calendar" { spawn-sh "$HOME/.config/eww/scripts/panel.sh toggle calendar"; } + Mod+Shift+R hotkey-overlay-title="Restart bar" { spawn-sh "$HOME/.config/eww/launch.sh"; } + // Panic-close: dismiss any open/stuck eww overlay (niri has no global Escape + // bind; a stuck :focusable spotlight would otherwise hold the keyboard). + Mod+Escape hotkey-overlay-title="Close overlays" { spawn-sh "$HOME/.config/eww/scripts/dismiss.sh"; } + + // --- window management --- + Mod+W { close-window; } + Mod+F { toggle-window-floating; } + Mod+Shift+F { fullscreen-window; } + Mod+M { maximize-column; } + Mod+V { switch-focus-between-floating-and-tiling; } + Mod+R { switch-preset-column-width; } + Mod+Minus { set-column-width "-10%"; } + Mod+Equal { set-column-width "+10%"; } + + // --- focus (arrows + hjkl) --- + Mod+Left { focus-column-left; } + Mod+Right { focus-column-right; } + Mod+Up { focus-window-up; } + Mod+Down { focus-window-down; } + Mod+H { focus-column-left; } + Mod+L { focus-column-right; } + Mod+K { focus-window-up; } + Mod+J { focus-window-down; } + + // --- move columns/windows --- + Mod+Ctrl+Left { move-column-left; } + Mod+Ctrl+Right { move-column-right; } + Mod+Ctrl+Up { move-window-up; } + Mod+Ctrl+Down { move-window-down; } + + // --- workspaces (focus + move, Hyprland-style Shift to move) --- + Mod+1 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + Mod+Shift+1 { move-column-to-workspace 1; } + Mod+Shift+2 { move-column-to-workspace 2; } + Mod+Shift+3 { move-column-to-workspace 3; } + Mod+Shift+4 { move-column-to-workspace 4; } + Mod+Shift+5 { move-column-to-workspace 5; } + Mod+Shift+6 { move-column-to-workspace 6; } + Mod+Shift+7 { move-column-to-workspace 7; } + Mod+Shift+8 { move-column-to-workspace 8; } + Mod+Shift+9 { move-column-to-workspace 9; } + + Mod+Page_Down { focus-workspace-down; } + Mod+Page_Up { focus-workspace-up; } + Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } + Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + + // --- multi-monitor --- + Mod+Shift+Left { focus-monitor-left; } + Mod+Shift+Right { focus-monitor-right; } + + // --- screenshots (Mod+Y = region, like hyprshot) --- + Mod+Y { screenshot; } + Print { screenshot; } + Ctrl+Print { screenshot-screen; } + + // --- media / volume / brightness (work when locked) --- + XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"; } + XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"; } + XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; } + XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; } + XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; } + XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; } + XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; } + XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "set" "5%+"; } + XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "set" "5%-"; } + + // --- session --- + Super+Alt+L { spawn "swaylock" "-f"; } + Mod+Shift+E { quit; } + Ctrl+Alt+Delete { quit; } + Mod+Shift+P { power-off-monitors; } +} diff --git a/packaging/tanin-eww/tanin-eww-0.1.0-1-any.pkg.tar.zst b/packaging/tanin-eww/tanin-eww-0.1.0-1-any.pkg.tar.zst new file mode 100644 index 0000000000000000000000000000000000000000..6c8360c6746fba6117e8049d1f1f59b56420a261 GIT binary patch literal 74335 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 button { + background: transparent; + background-image: none; + border: none; + box-shadow: none; + min-height: 0; + padding: 2px 6px; + color: @muted; + font-size: 12px; +} +.session-dd > button:hover { color: @fg; } + +/* power button — NO background at all, just the glyph */ +.topbar .power, +.topbar .power > button { + background: transparent; + background-image: none; + border: none; + box-shadow: none; + min-height: 0; + min-width: 0; + padding: 2px 6px; + color: @muted; +} +.topbar .power:hover, +.topbar .power > button:hover { color: @accent; background: transparent; } + +/* TANINUX wordmark — bottom center, understated */ +.brand { + color: @fg; + font-weight: 700; + font-size: 12px; + letter-spacing: 3px; + opacity: 0.8; +} + +/* ---- centered login card (flat, no heavy frame — minimal) --------------- * + * NB: class is .logincard, never .card — libadwaita's built-in .card recipe + * paints an elevated background + shadow (the "solid box, too big" bug). */ +.logincard { padding: 8px; background: transparent; box-shadow: none; } + +.avatar { + color: @fg; + background-color: alpha(@accent, 0.14); + border-radius: 999px; + padding: 16px; + margin-bottom: 6px; +} + +/* username row — plain name + chevron on the right, same width as the pill so + * the chevron sits where the password pill ends. No background (just the name). */ +.namerow { min-width: 300px; } +.username { + color: @yuki; + font-size: 17px; + font-weight: 600; +} +.userswitch { + background: transparent; + border: none; + box-shadow: none; + min-height: 0; + min-width: 0; + padding: 2px 4px; + color: @muted; +} +.userswitch:hover { color: @fg; } + +/* password pill — snow white (yuki), dark text, accent focus ring. + * border-radius 999px like the bar's workspaces/clock. */ +.pill { + min-width: 300px; + min-height: 0; + background-color: alpha(@bg_alt, 0.45); /* greyish, slightly transparent */ + color: @fg; + border: 1.5px solid alpha(@fg, 0.22); /* grey border (unfocused) */ + border-radius: 999px; + padding: 11px 18px; + box-shadow: none; +} +entry.pill { caret-color: @yuki; } +entry.pill text { color: @fg; } +entry.pill text > placeholder { color: alpha(@fg, 0.45); } +entry.pill image { color: alpha(@fg, 0.6); } /* peek-eye icon */ +/* clicked / focused → white border */ +.pill:focus-within { + border-color: @yuki; + background-color: alpha(@bg_alt, 0.55); + box-shadow: none; +} + +/* popup lists (session dropdown, user switcher). + * IMPORTANT: only style `popover > contents` — the outer `popover` node also + * covers the reserved shadow/margin area, so a solid bg there paints a huge + * solid box. Keep the outer node fully transparent. */ +popover { + background: transparent; + background-image: none; + border: none; + box-shadow: none; + padding: 0; +} +popover > contents { + background-color: @bg_alt; + color: @fg; + border: 1px solid alpha(@fg, 0.06); + border-radius: 12px; + box-shadow: 0 8px 24px alpha(black, 0.45); + padding: 6px; + min-width: 0; +} +/* kill the inner list's OWN themed background (the lighter nested box) so the + * whole popover reads as one uniform surface. */ +popover listview, +popover scrolledwindow, +popover scrolledwindow > viewport, +popover .view { + background: transparent; + background-color: transparent; + color: @fg; +} +popover listview > row, +popover .menuitem { border-radius: 8px; padding: 5px 10px; } +popover listview > row:selected, +popover listview > row:hover, +popover row:selected, +popover .menuitem:hover { background-color: alpha(@accent, 0.14); color: @accent; } + +.error { color: #e0a3a3; font-size: 12px; margin-top: 4px; } + +/* power popover buttons */ +.menuitem { + background: transparent; + border: none; + box-shadow: none; + border-radius: 8px; + padding: 6px 14px; + color: @fg; +} +.menuitem:hover { background-color: alpha(@accent, 0.14); color: @accent; } diff --git a/packaging/tanin-greet/pkg/tanin-greet/usr/bin/tanin-greet b/packaging/tanin-greet/pkg/tanin-greet/usr/bin/tanin-greet new file mode 100755 index 0000000..1eda1ca --- /dev/null +++ b/packaging/tanin-greet/pkg/tanin-greet/usr/bin/tanin-greet @@ -0,0 +1,328 @@ +#!/usr/bin/env python3 +"""tanin-greet — TANINUX login greeter (GTK4 / PyGObject). + +Custom layout: a black top bar like the eww topbar (brand · clock · power), a +wallpaper background, user + password centered as pills, and a small session +selector tucked in the bottom-right corner. Talks to greetd over GREETD_SOCK. + +Run by greetd via cage: cage -s -- tanin-greet +Preview without greetd: just run it — the UI renders; only login needs the +socket (set GREETD_SOCK via a mock for a full dry-run). + +Env overrides (handy for previewing from the repo): + TANIN_GREET_CSS path to the stylesheet (default /etc/greetd/tanin-greet.css) + TANIN_GREET_BG wallpaper image path (default /usr/share/backgrounds/tanin/login.jpg) + TANIN_GREET_SESSIONS wayland-sessions dir (default /usr/share/wayland-sessions) +""" +import gi, os, sys, json, socket, struct, shlex, glob, pwd + +gi.require_version("Gtk", "4.0") +from gi.repository import Gtk, GLib, Gdk, Gio # noqa: E402 + +CSS_PATH = os.environ.get("TANIN_GREET_CSS", "/etc/greetd/tanin-greet.css") +WALLPAPER = os.environ.get("TANIN_GREET_BG", "/usr/share/backgrounds/tanin/login.jpg") +SESSION_DIR = os.environ.get("TANIN_GREET_SESSIONS", "/usr/share/wayland-sessions") +BRAND = os.environ.get("TANIN_GREET_BRAND", "TANINUX") + + +# --------------------------------------------------------------------------- # +# greetd IPC client — native-endian u32 length prefix + JSON payload. +# --------------------------------------------------------------------------- # +class Greetd: + def __init__(self): + path = os.environ.get("GREETD_SOCK") + self.sock = None + if path: + try: + self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.sock.connect(path) + except OSError: + # No reachable greetd (e.g. preview without a daemon). Render the + # UI anyway; login() will report the missing socket on submit. + self.sock = None + + def _recvn(self, n): + buf = b"" + while len(buf) < n: + chunk = self.sock.recv(n - len(buf)) + if not chunk: + raise RuntimeError("greetd closed the connection") + buf += chunk + return buf + + def _send(self, obj): + data = json.dumps(obj).encode() + self.sock.sendall(struct.pack("=I", len(data)) + data) + + def _recv(self): + n = struct.unpack("=I", self._recvn(4))[0] + return json.loads(self._recvn(n)) + + def login(self, username, password, cmd_argv): + """Authenticate and start the session. Raises on failure.""" + if self.sock is None: + raise RuntimeError("GREETD_SOCK not set (preview mode — cannot log in)") + self._send({"type": "create_session", "username": username}) + while True: + r = self._recv() + t = r.get("type") + if t == "auth_message": + amt = r.get("auth_message_type") + if amt in ("secret", "visible"): + self._send({"type": "post_auth_message_response", "response": password}) + else: # info / error — acknowledge with no response + self._send({"type": "post_auth_message_response"}) + elif t == "success": + break + elif t == "error": + self._send({"type": "cancel_session"}) + raise RuntimeError(r.get("description", "authentication failed")) + else: + raise RuntimeError(f"unexpected greetd reply: {r}") + # authenticated → launch the chosen session + self._send({"type": "start_session", "cmd": cmd_argv, "env": []}) + r = self._recv() + if r.get("type") != "success": + self._send({"type": "cancel_session"}) + raise RuntimeError(r.get("description", "failed to start session")) + + +# --------------------------------------------------------------------------- # +# System enumeration +# --------------------------------------------------------------------------- # +def list_users(): + users = [] + for p in pwd.getpwall(): + if 1000 <= p.pw_uid < 65534 and p.pw_shell not in ("/usr/bin/nologin", "/sbin/nologin", "/bin/false"): + users.append(p.pw_name) + return users or [os.environ.get("USER", "user")] + + +def list_sessions(): + sessions = [] # (name, exec_argv) + for f in sorted(glob.glob(os.path.join(SESSION_DIR, "*.desktop"))): + name = exec_ = None + try: + for line in open(f, encoding="utf-8"): + if line.startswith("Name=") and name is None: + name = line[5:].strip() + elif line.startswith("Exec=") and exec_ is None: + exec_ = line[5:].strip() + except OSError: + continue + if name and exec_: + sessions.append((name, shlex.split(exec_))) + return sessions or [("Niri", ["niri-session"])] + + +# --------------------------------------------------------------------------- # +# UI +# --------------------------------------------------------------------------- # +class Greeter(Gtk.Application): + def __init__(self): + super().__init__(application_id="ch.gabrielevarano.TaninGreet") + self.greetd = Greetd() + self.users = list_users() + self.sessions = list_sessions() + + def do_activate(self): + self._load_css() + Gtk.Settings.get_default().set_property("gtk-application-prefer-dark-theme", True) + + win = Gtk.ApplicationWindow(application=self) + win.set_decorated(False) + win.fullscreen() + win.add_css_class("greeter") + + overlay = Gtk.Overlay() + win.set_child(overlay) + + # background image (falls back to the scrim colour if missing) + if os.path.exists(WALLPAPER): + bg = Gtk.Picture.new_for_filename(WALLPAPER) + bg.set_content_fit(Gtk.ContentFit.COVER) + overlay.set_child(bg) + else: + overlay.set_child(Gtk.Box()) + + # dark scrim so text stays readable over any wallpaper + scrim = Gtk.Box() + scrim.add_css_class("scrim") + scrim.set_hexpand(True) + scrim.set_vexpand(True) + overlay.add_overlay(scrim) + + # main column: top bar + centered login + col = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + col.append(self._topbar()) + center = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + center.set_vexpand(True) + center.set_valign(Gtk.Align.CENTER) + center.set_halign(Gtk.Align.CENTER) + center.append(self._login_card()) + col.append(center) + col.append(self._footer()) # TANINUX wordmark, bottom center + overlay.add_overlay(col) + + win.present() + self.password.grab_focus() + + # debug: auto-open the session dropdown so previews can screenshot the + # popover without a click (TANIN_GREET_POPUP=1). No effect in production. + if os.environ.get("TANIN_GREET_POPUP"): + def _open(): + btn = self.session_dd.get_first_child() + try: + btn.set_active(True) + except Exception: # noqa: BLE001 + pass + return False + GLib.timeout_add(900, _open) + + # ---- pieces ----------------------------------------------------------- # + def _topbar(self): + bar = Gtk.CenterBox() + bar.add_css_class("topbar") + + # top-left corner: session dropdown + bar.set_start_widget(self._session_dd()) + + # center: clock — time · weekday, date + self.clock = Gtk.Label() + self.clock.add_css_class("clock") + bar.set_center_widget(self.clock) + self._tick() + GLib.timeout_add_seconds(1, self._tick) + + # top-right corner: power + bar.set_end_widget(self._power_button()) + return bar + + def _session_dd(self): + self.session_dd = Gtk.DropDown.new_from_strings([s[0] for s in self.sessions]) + self.session_dd.add_css_class("session-dd") + for i, (name, _) in enumerate(self.sessions): + if name.lower().startswith("niri"): + self.session_dd.set_selected(i) + break + return self.session_dd + + def _footer(self): + box = Gtk.Box() + box.set_halign(Gtk.Align.CENTER) + box.set_valign(Gtk.Align.END) + box.set_margin_bottom(18) + lbl = Gtk.Label(label=BRAND) + lbl.add_css_class("brand") + box.append(lbl) + return box + + def _power_button(self): + btn = Gtk.MenuButton() + btn.add_css_class("power") + btn.set_icon_name("system-shutdown-symbolic") + pop = Gtk.Popover() + pop.add_css_class("menu") + box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=2) + for label, argv in (("Reboot", ["systemctl", "reboot"]), + ("Power Off", ["systemctl", "poweroff"])): + b = Gtk.Button(label=label) + b.add_css_class("menuitem") + b.connect("clicked", lambda _w, a=argv: self._run(a)) + box.append(b) + pop.set_child(box) + btn.set_popover(pop) + return btn + + def _login_card(self): + card = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=14) + card.add_css_class("logincard") # NOT "card" — libadwaita's .card adds a bg+shadow + card.set_halign(Gtk.Align.CENTER) + + avatar = Gtk.Image.new_from_icon_name("avatar-default-symbolic") + avatar.set_pixel_size(64) + avatar.add_css_class("avatar") + avatar.set_halign(Gtk.Align.CENTER) + card.append(avatar) + + # user row — just the NAME as text, with a small dropdown chevron on the + # right edge (aligned with where the password pill ends). Not a pill. + name_row = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) + name_row.add_css_class("namerow") + name_row.set_halign(Gtk.Align.CENTER) + + self.name_label = Gtk.Label(label=self.users[0]) + self.name_label.add_css_class("username") + self.name_label.set_xalign(0.5) # centered + self.name_label.set_hexpand(True) + name_row.append(self.name_label) + + self.user_btn = Gtk.MenuButton() + self.user_btn.add_css_class("userswitch") + self.user_btn.set_icon_name("pan-down-symbolic") + self.user_btn.set_visible(len(self.users) > 1) # no point if there's one user + upop = Gtk.Popover() + upop.add_css_class("menu") + ubox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=2) + for u in self.users: + b = Gtk.Button(label=u) + b.add_css_class("menuitem") + b.connect("clicked", lambda _w, name=u: (self.name_label.set_text(name), + self.user_btn.popdown())) + ubox.append(b) + upop.set_child(ubox) + self.user_btn.set_popover(upop) + name_row.append(self.user_btn) + card.append(name_row) + + # password pill + self.password = Gtk.PasswordEntry() + self.password.set_show_peek_icon(True) + self.password.set_property("placeholder-text", "Password") + self.password.add_css_class("pill") + self.password.connect("activate", self._on_submit) + card.append(self.password) + + self.error = Gtk.Label() + self.error.add_css_class("error") + self.error.set_visible(False) + card.append(self.error) + return card + + # ---- behaviour -------------------------------------------------------- # + def _tick(self): + now = GLib.DateTime.new_now_local() + self.clock.set_text(now.format("%H:%M · %A, %d %B %Y")) + return True + + def _on_submit(self, _entry): + user = self.name_label.get_text() + pw = self.password.get_text() + cmd = self.sessions[self.session_dd.get_selected()][1] + try: + self.greetd.login(user, pw, cmd) + self.quit() # greetd takes over from here + except Exception as e: # noqa: BLE001 + self.password.set_text("") + self.error.set_text(str(e)) + self.error.set_visible(True) + + def _run(self, argv): + try: + Gio.Subprocess.new(argv, Gio.SubprocessFlags.NONE) + except GLib.Error as e: + self.error.set_text(str(e)) + self.error.set_visible(True) + + def _load_css(self): + if not os.path.exists(CSS_PATH): + return + provider = Gtk.CssProvider() + provider.load_from_path(CSS_PATH) + Gtk.StyleContext.add_provider_for_display( + Gdk.Display.get_default(), provider, + Gtk.STYLE_PROVIDER_PRIORITY_USER) + + +if __name__ == "__main__": + sys.exit(Greeter().run(None)) diff --git a/packaging/tanin-greet/tanin-greet-0.1.0-1-any.pkg.tar.zst b/packaging/tanin-greet/tanin-greet-0.1.0-1-any.pkg.tar.zst new file mode 100644 index 0000000000000000000000000000000000000000..36d4612c187f536803f09f471260d0bc16f1951b GIT binary patch literal 18342 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 B%j5t6 literal 0 HcmV?d00001 diff --git a/packaging/tanin-libadwaita/pkg/tanin-libadwaita/.BUILDINFO b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/.BUILDINFO new file mode 100644 index 0000000..e261ef6 --- /dev/null +++ b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/.BUILDINFO @@ -0,0 +1,1159 @@ +format = 2 +pkgname = tanin-libadwaita +pkgbase = tanin-libadwaita +pkgver = 0.1.0-1 +pkgarch = any +pkgbuild_sha256sum = 3a5e39a3e3f0da1c660c8194bd9fb27cc1017c1d71ddacd6517c249525c795c3 +packager = Unknown Packager +builddate = 1781813716 +builddir = /home/karim/projects/taninux/packaging/tanin-libadwaita +startdir = /home/karim/projects/taninux/packaging/tanin-libadwaita +buildtool = makepkg +buildtoolver = 7.1.0 +buildenv = !distcc +buildenv = color +buildenv = !ccache +buildenv = check +buildenv = !sign +options = strip +options = docs +options = !libtool +options = !staticlibs +options = emptydirs +options = zipman +options = purge +options = debug +options = lto +installed = 7zip-26.01-1-x86_64 +installed = aalib-1.4rc5-19-x86_64 +installed = abseil-cpp-20260526.0-2-x86_64 +installed = accountsservice-26.13.3-1-x86_64 +installed = acl-2.3.2-2-x86_64 +installed = ada-3.4.4-1-x86_64 +installed = adw-gtk-theme-6.5-1-any +installed = adwaita-cursors-50.0-1-any +installed = adwaita-fonts-50.0-1-any +installed = adwaita-icon-theme-50.0-1-any +installed = adwaita-icon-theme-legacy-46.2-3-any +installed = alembic-1.8.11-2-x86_64 +installed = alsa-card-profiles-1:1.6.6-1-x86_64 +installed = alsa-lib-1.2.16.1-1-x86_64 +installed = alsa-plugins-1:1.2.12-5-x86_64 +installed = alsa-topology-conf-1.2.5.1-4-any +installed = alsa-ucm-conf-1.2.16.1-1-any +installed = alsa-utils-1.2.16-1-x86_64 +installed = amd-ucode-20260519-1-any +installed = ananicy-cpp-1.2.0-1-x86_64 +installed = antimicrox-3.6.1-1-x86_64 +installed = aom-3.14.1-1-x86_64 +installed = appstream-1.1.2-1-x86_64 +installed = aquamarine-0.12.1-1-x86_64 +installed = arch-update-3.20.1-1-any +installed = archlinux-contrib-20260611-1-any +installed = archlinux-keyring-20260612-1-any +installed = argon2-20190702-6-x86_64 +installed = at-spi2-core-2.60.4-1-x86_64 +installed = atkmm-2.28.5-2-x86_64 +installed = attr-2.5.2-2-x86_64 +installed = audit-4.1.4-2-x86_64 +installed = autoconf-2.73-1-any +installed = automake-1.18.1-1-any +installed = avahi-1:0.9rc4-1-x86_64 +installed = awesome-terminal-fonts-1.1.0-5-any +installed = ayatana-ido-0.10.4-1-x86_64 +installed = base-3-3-any +installed = base-devel-1-2-any +installed = bash-5.3.15-1-x86_64 +installed = bats-1.13.0-1-any +installed = binutils-2.46+r70+g155188ea10a7-1-x86_64 +installed = bison-3.8.2-8-x86_64 +installed = blas-3.12.1-2-x86_64 +installed = blender-17:5.1.2-1-x86_64 +installed = blosc-1.21.6-2-x86_64 +installed = bluez-5.86-6-x86_64 +installed = bluez-libs-5.86-6-x86_64 +installed = bluez-utils-5.86-6-x86_64 +installed = boost-libs-1.91.0-1-x86_64 +installed = botan-3.12.0-1-x86_64 +installed = brotli-1.2.0-1-x86_64 +installed = btrfs-progs-7.0-1-x86_64 +installed = bubblewrap-0.11.2-1-x86_64 +installed = bzip2-1.0.8-6-x86_64 +installed = c-ares-1.34.6-1-x86_64 +installed = ca-certificates-20240618-1-any +installed = ca-certificates-mozilla-3.125-1-x86_64 +installed = ca-certificates-utils-20240618-1-any +installed = cabextract-1.11-2-x86_64 +installed = cage-0.3.0-1-x86_64 +installed = cairo-1.18.4-1-x86_64 +installed = cairomm-1.14.6-1-x86_64 +installed = cairomm-1.16-1.18.1-1-x86_64 +installed = capstone-5.0.9-1-x86_64 +installed = cblas-3.12.1-2-x86_64 +installed = cdparanoia-10.2-9-x86_64 +installed = ceres-solver-2.2.0-5-x86_64 +installed = chatbox-bin-1.21.0-1-x86_64 +installed = cifs-utils-7.5-1-x86_64 +installed = clang-22.1.6-1-x86_64 +installed = claude-code-2.1.177-1-x86_64 +installed = cliphist-1:0.7.0-2-x86_64 +installed = clucene-2.3.3.4-17-x86_64 +installed = cmake-4.3.3-1-x86_64 +installed = code-1.124.2-1-x86_64 +installed = compiler-rt-22.1.6-1-x86_64 +installed = composefs-1.0.8-1-x86_64 +installed = coreutils-9.11-1-x86_64 +installed = cpio-2.15-3-x86_64 +installed = cppdap-1.58.0-3-x86_64 +installed = cracklib-2.10.3-1-x86_64 +installed = cronie-1.7.2-2-x86_64 +installed = cryptsetup-2.8.6-1-x86_64 +installed = cups-2:2.4.19-1-x86_64 +installed = cups-filters-2.0.1-2-x86_64 +installed = curl-8.20.0-7-x86_64 +installed = dav1d-1.5.3-1-x86_64 +installed = db5.3-5.3.28-7-x86_64 +installed = dbus-1.16.2-1-x86_64 +installed = dbus-broker-37-3-x86_64 +installed = dbus-broker-units-37-3-x86_64 +installed = dbus-glib-0.114-1-x86_64 +installed = dbus-units-37-3-x86_64 +installed = dconf-0.49.0-1-x86_64 +installed = debugedit-5.3-1-x86_64 +installed = default-cursors-3-1-any +installed = desktop-file-utils-0.28-1-x86_64 +installed = device-mapper-2.03.41-1-x86_64 +installed = dialog-1:1.3_20260107-1-x86_64 +installed = diffutils-3.12-2-x86_64 +installed = djvulibre-3.5.30-1-x86_64 +installed = dmidecode-3.7-1-x86_64 +installed = dnsmasq-2.93-1-x86_64 +installed = dos2unix-7.5.6-1-x86_64 +installed = dosfstools-4.2-5-x86_64 +installed = double-conversion-3.4.0-1-x86_64 +installed = draco-1.5.7-2-x86_64 +installed = dtc-1:1.7.2-1-x86_64 +installed = duktape-2.7.0-7-x86_64 +installed = e2fsprogs-1.47.4-1-x86_64 +installed = editorconfig-core-c-0.12.11-1-x86_64 +installed = edk2-ovmf-202605-1-any +installed = efibootmgr-18-4-x86_64 +installed = efivar-39-2-x86_64 +installed = electron39-39.8.10-1-x86_64 +installed = electron42-42.3.0-1-x86_64 +installed = elfutils-0.195-1-x86_64 +installed = embree-4.4.1-1-x86_64 +installed = enchant-2.8.15-2-x86_64 +installed = epson-inkjet-printer-escpr2-1.2.39-1-x86_64 +installed = eww-git-0.6.0.r89.g865cf63-1-x86_64 +installed = exempi-2.6.6-3-x86_64 +installed = exiv2-0.28.8-2-x86_64 +installed = expat-2.8.1-1-x86_64 +installed = extra-cmake-modules-6.27.0-1-any +installed = fakeroot-1:1.37.2-1-x86_64 +installed = fd-10.4.2-2-x86_64 +installed = ffmpeg-2:8.1.1-2-x86_64 +installed = fftw-3.3.11-1-x86_64 +installed = file-5.48-1-x86_64 +installed = filesystem-2025.10.12-1-any +installed = findutils-4.10.0-3-x86_64 +installed = flac-1.5.0-1-x86_64 +installed = flatpak-1:1.18.0-1-x86_64 +installed = flex-2.6.4-6-x86_64 +installed = fmt-12.1.0-2-x86_64 +installed = font-manager-0.9.4-3-x86_64 +installed = fontconfig-2:2.18.1-1-x86_64 +installed = freeglut-3.8.0-1-x86_64 +installed = freetype2-2.14.3-1-x86_64 +installed = fribidi-1.0.16-2-x86_64 +installed = fuse-common-3.18.2-1-x86_64 +installed = fuse2-2.9.9-5-x86_64 +installed = fuse3-3.18.2-1-x86_64 +installed = gamemode-1.8.2-2-x86_64 +installed = gawk-5.4.0-1-x86_64 +installed = gc-8.2.12-1-x86_64 +installed = gcc-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = gcc-libs-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = gcr-3.41.2-2-x86_64 +installed = gcr-4-4.4.0.1-1-x86_64 +installed = gdb-17.2-1-x86_64 +installed = gdb-common-17.2-1-x86_64 +installed = gdbm-1.26-2-x86_64 +installed = gdk-pixbuf2-2.44.6-2-x86_64 +installed = gedit-50.0-3-x86_64 +installed = geoclue-2.8.1-1-x86_64 +installed = geocode-glib-3.26.4-6-x86_64 +installed = gettext-1.0-2-x86_64 +installed = gexiv2-0.16.0-2-x86_64 +installed = gflags-2.2.2-6-x86_64 +installed = gfxstream-0.1.2-2-x86_64 +installed = ghostscript-10.07.1-1-x86_64 +installed = giflib-6.1.3-1-x86_64 +installed = git-2.54.0-1-x86_64 +installed = glew-2.3.1-1-x86_64 +installed = glfw-1:3.4-1-x86_64 +installed = glib-networking-1:2.80.1-1-x86_64 +installed = glib2-2.88.1-1-x86_64 +installed = glibc-2.43+r22+g8362e8ce10b2-2-x86_64 +installed = glibmm-2.66.8-2-x86_64 +installed = glibmm-2.68-2.88.0-2-x86_64 +installed = glm-1.0.3-1-x86_64 +installed = glslang-1:1.4.350.0-1-x86_64 +installed = glu-9.0.3-3-x86_64 +installed = glycin-2.1.1-1-x86_64 +installed = glycin-gtk4-2.1.1-1-x86_64 +installed = gmp-6.3.0-3-x86_64 +installed = gnome-autoar-0.4.5-1-x86_64 +installed = gnome-clocks-50.0-2-x86_64 +installed = gnome-desktop-4-1:44.5-1-x86_64 +installed = gnome-desktop-common-1:44.5-1-x86_64 +installed = gnome-disk-utility-46.1-2-x86_64 +installed = gnome-keyring-1:50.0-1-x86_64 +installed = gnome-text-editor-50.1-1-x86_64 +installed = gnu-free-fonts-20120503-9-any +installed = gnulib-l10n-20241231-1-any +installed = gnupg-2.4.9-1-x86_64 +installed = gnutls-3.8.13-2-x86_64 +installed = go-2:1.26.4-1-x86_64 +installed = gobject-introspection-runtime-1.86.0-2-x86_64 +installed = google-glog-0.7.1-2-x86_64 +installed = gperftools-2.18.1-1-x86_64 +installed = gpgme-2.1.0-1-x86_64 +installed = gpgmepp-2.1.0-1-x86_64 +installed = gpm-1.20.7.r38.ge82d1a6-6-x86_64 +installed = gpsd-3.27.5-1-x86_64 +installed = graphene-1.10.8-2-x86_64 +installed = graphite-1:1.3.15-1-x86_64 +installed = greetd-0.10.3-2-x86_64 +installed = greetd-agreety-0.10.3-2-x86_64 +installed = greetd-regreet-0.4.0-1-x86_64 +installed = greetd-tuigreet-0.9.1-2-x86_64 +installed = grep-3.12-2-x86_64 +installed = grim-1.5.0-2-x86_64 +installed = groff-1.24.1-1-x86_64 +installed = grub-2:2.14-1-x86_64 +installed = gsettings-desktop-schemas-50.1-1-any +installed = gsettings-system-schemas-50.1-1-any +installed = gsm-1.0.24-1-x86_64 +installed = gspell-1.14.3-1-x86_64 +installed = gssdp-1.6.5-1-x86_64 +installed = gst-plugins-bad-libs-1.28.4-1-x86_64 +installed = gst-plugins-base-1.28.4-1-x86_64 +installed = gst-plugins-base-libs-1.28.4-1-x86_64 +installed = gst-plugins-good-1.28.4-1-x86_64 +installed = gstreamer-1.28.4-1-x86_64 +installed = gtest-1.17.0-2-x86_64 +installed = gtk-layer-shell-0.10.1-1-x86_64 +installed = gtk-update-icon-cache-1:4.22.4-1-x86_64 +installed = gtk-vnc-1.5.0-1-x86_64 +installed = gtk3-1:3.24.52-1-x86_64 +installed = gtk4-1:4.22.4-1-x86_64 +installed = gtkmm-4.0-4.22.0-2-x86_64 +installed = gtkmm3-3.24.11-1-x86_64 +installed = gtksourceview4-4.8.4-2-x86_64 +installed = gtksourceview5-5.20.0-1-x86_64 +installed = guile-3.0.11-1-x86_64 +installed = gumbo-parser-0.13.2-1-x86_64 +installed = gupnp-1:1.6.10-1-x86_64 +installed = gupnp-dlna-0.12.0-5-x86_64 +installed = gupnp-igd-1.6.0-2-x86_64 +installed = gvfs-1.60.0-2-x86_64 +installed = gweather-locations-2026.2-1-x86_64 +installed = gzip-1.14-2-x86_64 +installed = harfbuzz-14.2.1-1-x86_64 +installed = harfbuzz-icu-14.2.1-1-x86_64 +installed = hdf5-2.1.1-1-x86_64 +installed = heroic-games-launcher-bin-2.22.0-1-x86_64 +installed = hicolor-icon-theme-0.18-1-any +installed = hidapi-0.15.0-1-x86_64 +installed = highway-1.4.0-1-x86_64 +installed = htmlq-0.4.0-3-x86_64 +installed = hugo-0.163.1-1-x86_64 +installed = hunspell-1.7.3-1-x86_64 +installed = hwdata-0.408-1-any +installed = hwloc-2.14.0-1-x86_64 +installed = hyphen-2.8.9-1-x86_64 +installed = hyprcursor-0.1.13-6-x86_64 +installed = hyprgraphics-0.5.1-2-x86_64 +installed = hyprland-0.55.4-1-x86_64 +installed = hyprland-guiutils-0.2.1-6-x86_64 +installed = hyprlang-0.6.8-4-x86_64 +installed = hyprshot-1.3.0-4-any +installed = hyprtoolkit-0.5.4-2-x86_64 +installed = hyprutils-0.13.1-1-x86_64 +installed = hyprwayland-scanner-0.4.6-1-x86_64 +installed = hyprwire-0.3.1-2-x86_64 +installed = iana-etc-20260530-1-any +installed = icu-78.3-1-x86_64 +installed = ijs-0.35-7-x86_64 +installed = imagemagick-7.1.2.25-1-x86_64 +installed = imath-3.2.2-6-x86_64 +installed = imlib2-1.12.6-1-x86_64 +installed = iniparser-4.2.6-2-x86_64 +installed = intel-oneapi-common-2026.0.0_235-1-any +installed = intel-oneapi-compiler-dpcpp-cpp-runtime-libs-2026.0.0_947-2-x86_64 +installed = intel-oneapi-compiler-shared-runtime-libs-2026.0.0_947-1-x86_64 +installed = intel-oneapi-openmp-2026.0.0_947-1-x86_64 +installed = intel-oneapi-tbb-2023.0.0_724-1-x86_64 +installed = intel-oneapi-tcm-1.5.0_489-1-x86_64 +installed = intel-oneapi-umf-1.1.0_340-2-x86_64 +installed = inter-font-4.1-1-any +installed = iproute2-7.0.0-1-x86_64 +installed = iptables-1:1.8.13-1-x86_64 +installed = iputils-20250605-1-x86_64 +installed = iso-codes-4.20.1-1-any +installed = jansson-2.15.0-1-x86_64 +installed = jbig2dec-0.20-2-x86_64 +installed = jbigkit-2.1-8-x86_64 +installed = jemalloc-1:5.3.1-2-x86_64 +installed = jq-1.8.1-3-x86_64 +installed = json-c-0.18-2-x86_64 +installed = json-glib-1.10.8-1-x86_64 +installed = jsoncpp-1.9.6-3-x86_64 +installed = karchive-6.27.0-1-x86_64 +installed = kbd-2.10.0-1-x86_64 +installed = kddockwidgets-2.4.0-3-x86_64 +installed = kdsingleapplication-1.2.1-1-x86_64 +installed = keyutils-1.6.3-4-x86_64 +installed = kguiaddons-6.27.0-1-x86_64 +installed = kitty-0.47.1-1-x86_64 +installed = kitty-shell-integration-0.47.1-1-x86_64 +installed = kitty-terminfo-0.47.1-1-x86_64 +installed = kmod-34.2-1-x86_64 +installed = krb5-1.22.2-1-x86_64 +installed = l-smash-2.14.5-4-x86_64 +installed = lact-0.9.0-1-x86_64 +installed = lame-3.101.r6531-1-x86_64 +installed = lapack-3.12.1-2-x86_64 +installed = lcms2-2.19.1-1-x86_64 +installed = ldb-2:4.24.3-1-x86_64 +installed = leancrypto-1.7.2-1-x86_64 +installed = level-zero-loader-1.28.2-1-x86_64 +installed = lib32-alsa-lib-1.2.16.1-1-x86_64 +installed = lib32-alsa-plugins-1.2.12-1-x86_64 +installed = lib32-brotli-1.1.0-1-x86_64 +installed = lib32-bzip2-1.0.8-4-x86_64 +installed = lib32-curl-8.20.0-7-x86_64 +installed = lib32-dbus-1.16.2-1-x86_64 +installed = lib32-e2fsprogs-1.47.4-1-x86_64 +installed = lib32-expat-2.8.1-1-x86_64 +installed = lib32-fontconfig-2:2.18.1-1-x86_64 +installed = lib32-freetype2-2.14.3-1-x86_64 +installed = lib32-gcc-libs-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = lib32-glib2-2.88.1-1-x86_64 +installed = lib32-glibc-2.43+r22+g8362e8ce10b2-2-x86_64 +installed = lib32-gmp-6.3.0-2-x86_64 +installed = lib32-gnutls-3.8.13-3-x86_64 +installed = lib32-icu-78.3-1-x86_64 +installed = lib32-json-c-0.18-2-x86_64 +installed = lib32-keyutils-1.6.3-4-x86_64 +installed = lib32-krb5-1.22.2-1-x86_64 +installed = lib32-libdisplay-info-0.3.0-1-x86_64 +installed = lib32-libdrm-2.4.134-1-x86_64 +installed = lib32-libelf-0.195-1-x86_64 +installed = lib32-libffi-3.5.2-1-x86_64 +installed = lib32-libgcrypt-1.12.2-1-x86_64 +installed = lib32-libglvnd-1.7.0-1-x86_64 +installed = lib32-libgpg-error-1.61-1-x86_64 +installed = lib32-libidn2-2.3.8-1-x86_64 +installed = lib32-libldap-2.6.13-1-x86_64 +installed = lib32-libnghttp2-1.69.0-1-x86_64 +installed = lib32-libnghttp3-1.16.0-1-x86_64 +installed = lib32-libngtcp2-1.23.0-1-x86_64 +installed = lib32-libnm-1.56.1-1-x86_64 +installed = lib32-libpciaccess-0.19-1-x86_64 +installed = lib32-libpipewire-1:1.6.6-1-x86_64 +installed = lib32-libpng-1.6.58-1-x86_64 +installed = lib32-libpsl-0.21.5-1-x86_64 +installed = lib32-libssh2-1.11.1-1-x86_64 +installed = lib32-libtasn1-4.21.0-1-x86_64 +installed = lib32-libunistring-1.4.2-1-x86_64 +installed = lib32-libva-2.22.0-1-x86_64 +installed = lib32-libx11-1.8.13-1-x86_64 +installed = lib32-libxau-1.0.12-1-x86_64 +installed = lib32-libxcb-1.17.0-1-x86_64 +installed = lib32-libxcrypt-4.5.2-1-x86_64 +installed = lib32-libxcrypt-compat-4.5.2-1-x86_64 +installed = lib32-libxdmcp-1.1.5-1-x86_64 +installed = lib32-libxext-1.3.7-1-x86_64 +installed = lib32-libxfixes-6.0.1-2-x86_64 +installed = lib32-libxinerama-1.1.6-1-x86_64 +installed = lib32-libxml2-2.15.3-1-x86_64 +installed = lib32-libxshmfence-1.3.3-1-x86_64 +installed = lib32-libxss-1.2.5-1-x86_64 +installed = lib32-libxxf86vm-1.1.5-2-x86_64 +installed = lib32-llvm-libs-1:22.1.6-1-x86_64 +installed = lib32-lm_sensors-1:3.6.2-2-x86_64 +installed = lib32-mesa-1:26.1.2-2-x86_64 +installed = lib32-ncurses-6.6-2-x86_64 +installed = lib32-nettle-4.0-2-x86_64 +installed = lib32-nspr-4.39-1-x86_64 +installed = lib32-nss-3.125-1-x86_64 +installed = lib32-openssl-1:3.6.3-1-x86_64 +installed = lib32-p11-kit-0.26.2-1-x86_64 +installed = lib32-pcre2-10.47-1-x86_64 +installed = lib32-pipewire-1:1.6.6-1-x86_64 +installed = lib32-spirv-tools-1:1.4.350.0-1-x86_64 +installed = lib32-sqlite-3.53.2-1-x86_64 +installed = lib32-systemd-260.2-1-x86_64 +installed = lib32-util-linux-2.42.1-1-x86_64 +installed = lib32-vulkan-icd-loader-1.4.350.0-1-x86_64 +installed = lib32-vulkan-mesa-implicit-layers-1:26.1.2-2-x86_64 +installed = lib32-vulkan-radeon-1:26.1.2-2-x86_64 +installed = lib32-wayland-1.25.0-1-x86_64 +installed = lib32-xcb-util-keysyms-0.4.1-2-x86_64 +installed = lib32-xz-5.8.3-1-x86_64 +installed = lib32-zlib-1.3.2-1-x86_64 +installed = lib32-zstd-1.5.7-2-x86_64 +installed = libabw-0.1.4-1-x86_64 +installed = libadwaita-1:1.9.1-1-x86_64 +installed = libaec-1.1.7-1-x86_64 +installed = libaemu-0.1.2-5-x86_64 +installed = libaio-0.3.113-4-x86_64 +installed = libappindicator-12.10.1-1-x86_64 +installed = libarchive-3.8.7-1-x86_64 +installed = libasan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libass-0.17.4-2-x86_64 +installed = libassuan-3.0.0-1-x86_64 +installed = libasyncns-1:0.8+r3+g68cd5af-3-x86_64 +installed = libatasmart-0.19-8-x86_64 +installed = libatomic-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libatomic_ops-7.8.2-2-x86_64 +installed = libavc1394-0.5.4-7-x86_64 +installed = libavif-1.4.2-1-x86_64 +installed = libayatana-appindicator-0.5.94-1-x86_64 +installed = libayatana-indicator-0.9.5-1-x86_64 +installed = libb2-0.98.1-3-x86_64 +installed = libb64-1.2.1-5-x86_64 +installed = libbacktrace-1.0.git1-1-x86_64 +installed = libblockdev-3.5.0-2-x86_64 +installed = libblockdev-crypto-3.5.0-2-x86_64 +installed = libblockdev-fs-3.5.0-2-x86_64 +installed = libblockdev-loop-3.5.0-2-x86_64 +installed = libblockdev-mdraid-3.5.0-2-x86_64 +installed = libblockdev-nvme-3.5.0-2-x86_64 +installed = libblockdev-part-3.5.0-2-x86_64 +installed = libblockdev-smart-3.5.0-2-x86_64 +installed = libblockdev-swap-3.5.0-2-x86_64 +installed = libbluray-1.4.1-1-x86_64 +installed = libbpf-1.7.0-1-x86_64 +installed = libbs2b-3.1.0-10-x86_64 +installed = libbsd-0.12.2-2-x86_64 +installed = libburn-1.5.8-1-x86_64 +installed = libbytesize-2.12-3-x86_64 +installed = libcaca-0.99.beta20-7-x86_64 +installed = libcacard-2.8.1-1-x86_64 +installed = libcanberra-1:0.30+r2+gc0620e4-6-x86_64 +installed = libcap-2.78-1-x86_64 +installed = libcap-ng-0.9.3-1-x86_64 +installed = libcbor-0.14.0-1-x86_64 +installed = libcdio-2.3.0-1-x86_64 +installed = libcdio-paranoia-10.2+2.0.2-2-x86_64 +installed = libcdr-0.1.9-1-x86_64 +installed = libcloudproviders-0.4.0-1-x86_64 +installed = libcmis-0.6.3-1-x86_64 +installed = libcolord-1.4.8-1-x86_64 +installed = libcue-2.3.0-2-x86_64 +installed = libcups-2:2.4.19-1-x86_64 +installed = libcupsfilters-2.1.1-4-x86_64 +installed = libdaemon-0.14-6-x86_64 +installed = libdatrie-0.2.14-1-x86_64 +installed = libdbusmenu-glib-18.10.20180917-1-x86_64 +installed = libdbusmenu-gtk3-18.10.20180917-1-x86_64 +installed = libde265-1.1.1-1-x86_64 +installed = libdecor-0.2.5-1-x86_64 +installed = libdeflate-1.25-1-x86_64 +installed = libdisplay-info-0.3.0-1-x86_64 +installed = libdovi-3.3.2-1-x86_64 +installed = libdrm-2.4.134-1-x86_64 +installed = libdv-1.0.0-12-x86_64 +installed = libdvdnav-7.0.0-1-x86_64 +installed = libdvdread-7.0.1-1-x86_64 +installed = libe-book-0.1.3-20-x86_64 +installed = libebur128-1.2.6-2-x86_64 +installed = libedit-20260512_3.1-1-x86_64 +installed = libei-1.6.0-1-x86_64 +installed = libelf-0.195-1-x86_64 +installed = libepoxy-1.5.10-3-x86_64 +installed = libepubgen-0.1.1-6-x86_64 +installed = libetonyek-0.1.13-2-x86_64 +installed = libevdev-1.13.6-1-x86_64 +installed = libevent-2.1.12-5-x86_64 +installed = libexif-0.6.26-1-x86_64 +installed = libexttextcat-3.4.8-1-x86_64 +installed = libfdk-aac-2.0.3-2-x86_64 +installed = libffi-3.5.2-1-x86_64 +installed = libfontenc-1.1.9-1-x86_64 +installed = libfreeaptx-0.2.2-1-x86_64 +installed = libfreehand-0.1.3-1-x86_64 +installed = libfyaml-0.9.6-2-x86_64 +installed = libgcc-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libgcrypt-1.12.2-1-x86_64 +installed = libgedit-amtk-5.10.0-1-x86_64 +installed = libgedit-gfls-1:0.4.1-1-x86_64 +installed = libgedit-gtksourceview-299.7.0-1-x86_64 +installed = libgedit-tepl-6.14.0-2-x86_64 +installed = libgee-0.20.8-1-x86_64 +installed = libgfortran-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libgirepository-1.86.0-2-x86_64 +installed = libglvnd-1.7.0-3-x86_64 +installed = libgnomekbd-1:3.28.1-2-x86_64 +installed = libgomp-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libgpg-error-1.61-1-x86_64 +installed = libgsf-1.14.58-1-x86_64 +installed = libgudev-238-3-x86_64 +installed = libgweather-4-4.6.0-1-x86_64 +installed = libgxps-0.3.2-5-x86_64 +installed = libhandy-1.8.3-2-x86_64 +installed = libharu-2.4.6-1-x86_64 +installed = libheif-1.23.0-1-x86_64 +installed = libice-1.1.2-1-x86_64 +installed = libidn-1.43-1-x86_64 +installed = libidn2-2.3.8-1-x86_64 +installed = libiec61883-1.2.0-9-x86_64 +installed = libimagequant-4.4.1-2-x86_64 +installed = libimobiledevice-1.4.0-2-x86_64 +installed = libimobiledevice-glue-1.3.2-1-x86_64 +installed = libinih-62-2-x86_64 +installed = libinput-1.31.3-1-x86_64 +installed = libiptcdata-1.0.5-5-x86_64 +installed = libisl-0.27-1-x86_64 +installed = libisoburn-1.5.8.2-1-x86_64 +installed = libisofs-1.5.8.2-1-x86_64 +installed = libixion-0.20.0-7-x86_64 +installed = libjpeg-turbo-3.1.4.1-1-x86_64 +installed = libjxl-0.11.2-2-x86_64 +installed = libksba-1.8.0-1-x86_64 +installed = liblangtag-0.6.8-1-x86_64 +installed = liblc3-1.1.3-2-x86_64 +installed = libldac-2.0.2.3-3-x86_64 +installed = libldap-2.6.13-1-x86_64 +installed = libliftoff-0.5.0-1-x86_64 +installed = liblqr-0.4.3-1-x86_64 +installed = liblsan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libmakepkg-dropins-20-1-any +installed = libmalcontent-0.14.0-4-x86_64 +installed = libmanette-0.2.13-2-x86_64 +installed = libmd-1.2.0-1-x86_64 +installed = libmm-glib-1.24.2-1-x86_64 +installed = libmnl-1.0.5-2-x86_64 +installed = libmodplug-0.8.9.0-7-x86_64 +installed = libmpc-1.4.1-1-x86_64 +installed = libmpdclient-2.23-1-x86_64 +installed = libmspub-0.1.5-1-x86_64 +installed = libmwaw-0.3.22-4-x86_64 +installed = libmysofa-1.3.4-1-x86_64 +installed = libnatpmp-20230423-3-x86_64 +installed = libnautilus-extension-50.2.2-1-x86_64 +installed = libnbd-1.24.2-2-x86_64 +installed = libndp-1.9-1-x86_64 +installed = libnetfilter_conntrack-1.1.1-1-x86_64 +installed = libnewt-0.52.25-2-x86_64 +installed = libnfnetlink-1.0.2-2-x86_64 +installed = libnfs-6.0.2-5-x86_64 +installed = libnftnl-1.3.1-1-x86_64 +installed = libnghttp2-1.69.0-1-x86_64 +installed = libnghttp3-1.16.0-1-x86_64 +installed = libngtcp2-1.23.0-1-x86_64 +installed = libnice-0.1.23-1-x86_64 +installed = libnl-3.12.0-1-x86_64 +installed = libnm-1.56.1-1-x86_64 +installed = libnma-1.10.6-3-x86_64 +installed = libnma-common-1.10.6-3-x86_64 +installed = libnotify-0.8.8-1-x86_64 +installed = libnsl-2.0.1-2-x86_64 +installed = libnumbertext-1.0.11-3-x86_64 +installed = libnvme-1.16.1-3-x86_64 +installed = libobjc-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libodfgen-0.1.8-5-x86_64 +installed = libogg-1.3.6-1-x86_64 +installed = libopenmpt-0.8.7-1-x86_64 +installed = liborcus-0.21.0-6-x86_64 +installed = libosinfo-1.12.0-3-x86_64 +installed = libp11-0.4.18-1-x86_64 +installed = libp11-kit-0.26.2-1-x86_64 +installed = libpagemaker-0.0.4-5-x86_64 +installed = libpaper-2.2.8-1-x86_64 +installed = libpcap-1.10.6-1-x86_64 +installed = libpciaccess-0.19-1-x86_64 +installed = libpeas-1.38.1-1-x86_64 +installed = libpgm-5.3.128-4-x86_64 +installed = libpipewire-1:1.6.6-1-x86_64 +installed = libplacebo-7.360.1-2-x86_64 +installed = libplist-2.7.0-3-x86_64 +installed = libpng-1.6.58-1-x86_64 +installed = libportal-0.9.1-3-x86_64 +installed = libportal-gtk4-0.9.1-3-x86_64 +installed = libppd-2.1.1-2-x86_64 +installed = libproxy-0.5.12-1-x86_64 +installed = libpsl-0.21.5-2-x86_64 +installed = libpulse-17.0+r98+gb096704c0-1-x86_64 +installed = libpwquality-1.4.5-7-x86_64 +installed = libqalculate-5.11.0-1-x86_64 +installed = libquadmath-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libqxp-0.0.3-1-x86_64 +installed = libraqm-0.10.5-1-x86_64 +installed = libraw-0.22.1-1-x86_64 +installed = libraw1394-2.1.2-4-x86_64 +installed = libre-trainsim-bin-0.8-1-x86_64 +installed = libreoffice-fresh-26.2.4-2-x86_64 +installed = librevenge-0.0.5-4-x86_64 +installed = librewolf-bin-1:151.0.4_1-1-x86_64 +installed = librsvg-2:2.62.3-1-x86_64 +installed = librsync-1:2.3.4-2-x86_64 +installed = libsamplerate-0.2.2-3-x86_64 +installed = libsasl-2.1.28-5-x86_64 +installed = libseccomp-2.6.0-1-x86_64 +installed = libsecret-0.21.7-1-x86_64 +installed = libshout-1:2.4.6-5-x86_64 +installed = libsigc++-2.12.2-1-x86_64 +installed = libsigc++-3.0-3.8.1-1-x86_64 +installed = libslirp-4.9.3-1-x86_64 +installed = libsm-1.2.6-1-x86_64 +installed = libsndfile-1.2.2-4-x86_64 +installed = libsodium-1.0.22-1-x86_64 +installed = libsoup3-3.6.6-2-x86_64 +installed = libsoxr-0.1.3-4-x86_64 +installed = libspelling-0.4.10-1-x86_64 +installed = libspnav-1.2-1-x86_64 +installed = libssh-0.12.0-1-x86_64 +installed = libssh2-1.11.1-1-x86_64 +installed = libstaroffice-0.0.7-5-x86_64 +installed = libstdc++-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libstemmer-3.1.1-1-x86_64 +installed = libsysprof-capture-50.0-2-x86_64 +installed = libtasn1-4.21.0-1-x86_64 +installed = libtatsu-1.0.5-1-x86_64 +installed = libteam-1.32-3-x86_64 +installed = libthai-0.1.30-1-x86_64 +installed = libtheora-1.2.0-1-x86_64 +installed = libtiff-4.7.1-2-x86_64 +installed = libtirpc-1.3.7-1-x86_64 +installed = libtommath-1.3.0-2-x86_64 +installed = libtool-2.6.1-1-x86_64 +installed = libtpms-0.10.2-1-x86_64 +installed = libtraceevent-1:1.9.0-1-x86_64 +installed = libtracefs-1.8.3-1-x86_64 +installed = libtsan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libubsan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libunibreak-7.0-1-x86_64 +installed = libunistring-1.4.2-1-x86_64 +installed = libunwind-1.8.2-1-x86_64 +installed = liburing-2.14-1-x86_64 +installed = libusb-1.0.30-1-x86_64 +installed = libusbmuxd-2.1.1-2-x86_64 +installed = libuv-1.52.1-1-x86_64 +installed = libva-2.23.0-1-x86_64 +installed = libvdpau-1.5-4-x86_64 +installed = libverto-0.3.2-6-x86_64 +installed = libvirt-1:12.4.0-1-x86_64 +installed = libvirt-glib-5.0.0-3-x86_64 +installed = libvirt-python-1:12.4.0-1-x86_64 +installed = libvisio-0.1.11-1-x86_64 +installed = libvorbis-1.3.7-4-x86_64 +installed = libvpl-2.16.0-2-x86_64 +installed = libvpx-1.16.0-3-x86_64 +installed = libwacom-2.19.0-1-x86_64 +installed = libwbclient-2:4.24.3-1-x86_64 +installed = libwebp-1.6.0-2-x86_64 +installed = libwireplumber-0.5.14-1-x86_64 +installed = libwpd-0.10.3-6-x86_64 +installed = libwps-0.4.14-4-x86_64 +installed = libx11-1.8.13-1-x86_64 +installed = libxau-1.0.12-1-x86_64 +installed = libxcb-1.17.0-1-x86_64 +installed = libxcomposite-0.4.7-1-x86_64 +installed = libxcrypt-4.5.2-1-x86_64 +installed = libxcrypt-compat-4.5.2-1-x86_64 +installed = libxcursor-1.2.3-1-x86_64 +installed = libxcvt-0.1.3-1-x86_64 +installed = libxdamage-1.1.7-1-x86_64 +installed = libxdmcp-1.1.5-2-x86_64 +installed = libxdp-1.6.3-1-x86_64 +installed = libxext-1.3.7-1-x86_64 +installed = libxfixes-6.0.2-1-x86_64 +installed = libxfont2-2.0.7-1-x86_64 +installed = libxft-2.3.9-1-x86_64 +installed = libxi-1.8.3-1-x86_64 +installed = libxinerama-1.1.6-1-x86_64 +installed = libxkbcommon-1.13.2-1-x86_64 +installed = libxkbcommon-x11-1.13.2-1-x86_64 +installed = libxkbfile-1.2.0-1-x86_64 +installed = libxklavier-5.4-7-x86_64 +installed = libxml2-2.15.3-1-x86_64 +installed = libxmlb-0.3.27-1-x86_64 +installed = libxrandr-1.5.5-1-x86_64 +installed = libxrender-0.9.12-1-x86_64 +installed = libxshmfence-1.3.3-1-x86_64 +installed = libxslt-1.1.45-2-x86_64 +installed = libxss-1.2.5-1-x86_64 +installed = libxt-1.3.1-1-x86_64 +installed = libxtst-1.2.5-1-x86_64 +installed = libxv-1.0.13-1-x86_64 +installed = libxxf86vm-1.1.7-1-x86_64 +installed = libyaml-0.2.5-3-x86_64 +installed = libyuv-r2426+464c51a03-1-x86_64 +installed = libzip-1.11.4-1-x86_64 +installed = libzmf-0.0.2-20-x86_64 +installed = licenses-20240728-1-any +installed = lilv-0.28.0-1-x86_64 +installed = linux-api-headers-7.1-1-x86_64 +installed = linux-firmware-20260519-1-any +installed = linux-firmware-amdgpu-20260519-1-any +installed = linux-firmware-atheros-20260519-1-any +installed = linux-firmware-broadcom-20260519-1-any +installed = linux-firmware-cirrus-20260519-1-any +installed = linux-firmware-intel-20260519-1-any +installed = linux-firmware-mediatek-20260519-1-any +installed = linux-firmware-nvidia-20260519-1-any +installed = linux-firmware-other-20260519-1-any +installed = linux-firmware-radeon-20260519-1-any +installed = linux-firmware-realtek-20260519-1-any +installed = linux-firmware-whence-20260519-1-any +installed = linux-zen-7.0.12.zen1-1-x86_64 +installed = linux-zen-headers-7.0.12.zen1-1-x86_64 +installed = litehtml0.9-0.9-2-x86_64 +installed = littlenavmap-bin-3.0.18-1-x86_64 +installed = lld-22.1.6-1-x86_64 +installed = llvm-22.1.6-1-x86_64 +installed = llvm-libs-22.1.6-1-x86_64 +installed = lm_sensors-1:3.6.2-1-x86_64 +installed = lmdb-0.9.35-1-x86_64 +installed = localsearch-3.11.1-1-x86_64 +installed = log4cplus-2.1.2-1-x86_64 +installed = loupe-50.0-1-x86_64 +installed = lpsolve-5.5.2.14-1-x86_64 +installed = lsb-release-2.0.r55.a25a4fc-1-any +installed = lsof-4.99.6-1-x86_64 +installed = lua-5.5.0-2-x86_64 +installed = lua54-5.4.8-6-x86_64 +installed = lv2-1.18.10-2-x86_64 +installed = lz4-1:1.10.0-2-x86_64 +installed = lzo-2.10-5-x86_64 +installed = m4-1.4.21-2-x86_64 +installed = mailcap-2.1.54-2-any +installed = make-4.4.1-3-x86_64 +installed = manifold-3.4.1-1-x86_64 +installed = materialx-1.39.4-5-x86_64 +installed = md4c-0.5.3-1-x86_64 +installed = mdadm-4.6-2-x86_64 +installed = mesa-1:26.1.2-2-x86_64 +installed = meson-1.11.1-3-any +installed = mingw-w64-binutils-2.46.0-1-x86_64 +installed = mingw-w64-crt-14.0.0-1-any +installed = mingw-w64-gcc-16.1.0-1-x86_64 +installed = mingw-w64-headers-14.0.0-1-any +installed = mingw-w64-winpthreads-14.0.0-1-any +installed = miniupnpc-2.3.3-3-x86_64 +installed = minizip-1:1.3.2-3-x86_64 +installed = minizip-ng-4.2.1-1-x86_64 +installed = mkinitcpio-41-4-any +installed = mkinitcpio-busybox-1.36.1-1-x86_64 +installed = mobile-broadband-provider-info-20251101-1-any +installed = mpdecimal-4.0.1-3-x86_64 +installed = mpfr-4.2.2-1-x86_64 +installed = mpg123-1.33.5-1-x86_64 +installed = mtdev-1.1.7-1-x86_64 +installed = mtools-1:4.0.49-1-x86_64 +installed = muparser-2.3.5-2-x86_64 +installed = nano-9.0-1-x86_64 +installed = nanobind-2.12.0-3-any +installed = nautilus-50.2.2-1-x86_64 +installed = ncurses-6.6-2-x86_64 +installed = ndctl-84-1-x86_64 +installed = neon-0.37.1-1-x86_64 +installed = nettle-4.0-1-x86_64 +installed = network-manager-applet-1.36.0-2-x86_64 +installed = networkmanager-1.56.1-1-x86_64 +installed = nextcloud-client-2:33.0.5-1-x86_64 +installed = nftables-1:1.1.6-3-x86_64 +installed = ninja-1.13.2-3-x86_64 +installed = niri-26.04-1-x86_64 +installed = nm-connection-editor-1.36.0-2-x86_64 +installed = node-gyp-13.0.0-1-any +installed = nodejs-26.2.0-1-x86_64 +installed = nodejs-nopt-10.0.1-1-any +installed = noto-fonts-emoji-1:2.051-1-any +installed = npm-11.16.0-1-any +installed = npth-1.8-1-x86_64 +installed = nspr-4.39-1-x86_64 +installed = nss-3.125-1-x86_64 +installed = numactl-2.0.19-1-x86_64 +installed = nwg-look-1.1.1-3-x86_64 +installed = obsidian-1.12.7-2-x86_64 +installed = ocl-icd-2.3.4-1-x86_64 +installed = onetbb-2023.0.0-1-x86_64 +installed = oniguruma-6.9.10-1-x86_64 +installed = openal-1.25.2-1-x86_64 +installed = opencolorio-2.5.1-1-x86_64 +installed = opencore-amr-0.1.6-2-x86_64 +installed = openexr-3.4.12-2-x86_64 +installed = openh264-2.6.0-2-x86_64 +installed = openimagedenoise-2.4.1-2-x86_64 +installed = openimageio-3.1.12.1-2-x86_64 +installed = openjpeg2-2.5.4-1-x86_64 +installed = openjph-0.28.1-1-x86_64 +installed = openpgl-0.7.1-1-x86_64 +installed = openpomodoro-0.3.0-2-x86_64 +installed = openshadinglanguage-1.15.3.0-1-x86_64 +installed = openssh-10.3p1-1-x86_64 +installed = openssl-3.6.3-1-x86_64 +installed = opensubdiv-3.7.0-1-x86_64 +installed = openvdb-13.0.0-1-x86_64 +installed = openxr-1.1.60-1-x86_64 +installed = opus-1.6.1-1-x86_64 +installed = orc-0.4.42-1-x86_64 +installed = osinfo-db-20251212-1-any +installed = ostree-2025.7-3-x86_64 +installed = otf-font-awesome-7.2.0-1-any +installed = p11-kit-0.26.2-1-x86_64 +installed = pacman-7.1.0.r9.g54d9411-2-x86_64 +installed = pacman-contrib-1.13.1-1-x86_64 +installed = pacman-mirrorlist-20260610-1-any +installed = pahole-1:1.31-2-x86_64 +installed = pam-1.7.2-2-x86_64 +installed = pambase-20260614-1-any +installed = pango-1:1.57.1-1-x86_64 +installed = pangomm-2.46.4-3-x86_64 +installed = pangomm-2.48-2.56.1-2-x86_64 +installed = papers-50.2-1-x86_64 +installed = papirus-folders-1.14.0-1-any +installed = papirus-icon-theme-20250501-1-any +installed = parallel-20260522-1-any +installed = parted-3.7-1-x86_64 +installed = paru-2.1.0-2-x86_64 +installed = patch-2.8-1-x86_64 +installed = pavucontrol-1:6.2-1-x86_64 +installed = pciutils-3.15.0-1-x86_64 +installed = pcre-8.45-4-x86_64 +installed = pcre2-10.47-1-x86_64 +installed = pcsclite-2.5.1-1-x86_64 +installed = pcsx2-git-2.7.419.r0.ge0566546c6-1-x86_64 +installed = perl-5.42.2-1-x86_64 +installed = perl-error-0.17030-3-any +installed = perl-mailtools-2.22-3-any +installed = perl-timedate-2.35-1-any +installed = pfetch-1.11.0-1-any +installed = phodav-3.0-4-x86_64 +installed = pinentry-1.3.2-2-x86_64 +installed = pipewire-1:1.6.6-1-x86_64 +installed = pipewire-audio-1:1.6.6-1-x86_64 +installed = pipewire-jack-1:1.6.6-1-x86_64 +installed = pipewire-pulse-1:1.6.6-1-x86_64 +installed = pipewire-session-manager-1:1.6.6-1-x86_64 +installed = pixman-0.46.4-1-x86_64 +installed = pkgconf-2.5.1-1-x86_64 +installed = playerctl-2.4.1-5-x86_64 +installed = plutosvg-0.0.8-1-x86_64 +installed = plutovg-git-1.3.3+12.r311.20260606.dd73459-1-x86_64 +installed = polkit-127-3-x86_64 +installed = polkit-gnome-0.105-12-x86_64 +installed = poppler-26.06.0-1-x86_64 +installed = poppler-data-0.4.12-2-any +installed = poppler-glib-26.06.0-1-x86_64 +installed = popt-1.19-2-x86_64 +installed = portaudio-1:19.7.0-4-x86_64 +installed = potrace-1.16-5-x86_64 +installed = pps-tools-1.0.3-2-x86_64 +installed = procps-ng-4.0.6-2-x86_64 +installed = psmisc-23.7-2-x86_64 +installed = ptex-2.5.2-1-x86_64 +installed = pugixml-1.15-3-x86_64 +installed = pyalpm-0.11.1-1-x86_64 +installed = pybind11-3.0.4-1-any +installed = pyside6-6.11.1-1-x86_64 +installed = pystring-1.2.0-1-x86_64 +installed = python-3.14.5-1-x86_64 +installed = python-autocommand-2.2.2-9-any +installed = python-cairo-1.29.0-2-x86_64 +installed = python-certifi-2026.05.20-1-any +installed = python-charset-normalizer-3.4.7-1-x86_64 +installed = python-gobject-3.56.3-1-x86_64 +installed = python-idna-3.18-1-any +installed = python-imageio-2.37.3-1-any +installed = python-imageio-ffmpeg-0.6.0-2-any +installed = python-jaraco.collections-5.1.0-3-any +installed = python-jaraco.context-6.1.2-1-any +installed = python-jaraco.functools-4.1.0-3-any +installed = python-jaraco.text-4.0.0-4-any +installed = python-jinja-1:3.1.6-3-any +installed = python-markupsafe-3.0.3-1-x86_64 +installed = python-more-itertools-11.1.0-1-any +installed = python-numpy-2.4.6-1-x86_64 +installed = python-opengl-3.1.10-3-any +installed = python-packaging-26.2-1-any +installed = python-pillow-12.2.0-1-x86_64 +installed = python-pkg_resources-81.0.0-1-any +installed = python-platformdirs-4.10.0-1-any +installed = python-pyqt6-6.11.0-2-x86_64 +installed = python-pyqt6-sip-13.11.1-1-x86_64 +installed = python-requests-2.34.2-1-any +installed = python-screeninfo-0.8.1-2-any +installed = python-setproctitle-1.3.7-2-x86_64 +installed = python-setuptools-1:82.0.1-1-any +installed = python-tqdm-4.68.2-1-any +installed = python-typing_extensions-4.15.0-3-any +installed = python-urllib3-2.7.0-1-any +installed = python-wheel-0.47.0-1-any +installed = qemu-audio-alsa-11.0.1-1-x86_64 +installed = qemu-audio-dbus-11.0.1-1-x86_64 +installed = qemu-audio-jack-11.0.1-1-x86_64 +installed = qemu-audio-oss-11.0.1-1-x86_64 +installed = qemu-audio-pa-11.0.1-1-x86_64 +installed = qemu-audio-pipewire-11.0.1-1-x86_64 +installed = qemu-audio-sdl-11.0.1-1-x86_64 +installed = qemu-audio-spice-11.0.1-1-x86_64 +installed = qemu-base-11.0.1-1-x86_64 +installed = qemu-block-curl-11.0.1-1-x86_64 +installed = qemu-block-dmg-11.0.1-1-x86_64 +installed = qemu-block-nfs-11.0.1-1-x86_64 +installed = qemu-block-ssh-11.0.1-1-x86_64 +installed = qemu-chardev-spice-11.0.1-1-x86_64 +installed = qemu-common-11.0.1-1-x86_64 +installed = qemu-desktop-11.0.1-1-x86_64 +installed = qemu-hw-display-qxl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-gl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-pci-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-pci-gl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-pci-rutabaga-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-rutabaga-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-vga-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-vga-gl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-vga-rutabaga-11.0.1-1-x86_64 +installed = qemu-hw-uefi-vars-11.0.1-1-x86_64 +installed = qemu-hw-usb-host-11.0.1-1-x86_64 +installed = qemu-hw-usb-redirect-11.0.1-1-x86_64 +installed = qemu-hw-usb-smartcard-11.0.1-1-x86_64 +installed = qemu-img-11.0.1-1-x86_64 +installed = qemu-system-x86-11.0.1-1-x86_64 +installed = qemu-system-x86-firmware-11.0.1-1-x86_64 +installed = qemu-ui-curses-11.0.1-1-x86_64 +installed = qemu-ui-dbus-11.0.1-1-x86_64 +installed = qemu-ui-egl-headless-11.0.1-1-x86_64 +installed = qemu-ui-gtk-11.0.1-1-x86_64 +installed = qemu-ui-opengl-11.0.1-1-x86_64 +installed = qemu-ui-sdl-11.0.1-1-x86_64 +installed = qemu-ui-spice-app-11.0.1-1-x86_64 +installed = qemu-ui-spice-core-11.0.1-1-x86_64 +installed = qemu-vhost-user-gpu-11.0.1-1-x86_64 +installed = qpdf-12.3.2-2-x86_64 +installed = qt5-base-5.15.19+kde+r96-1-x86_64 +installed = qt5-declarative-5.15.19+kde+r23-1-x86_64 +installed = qt5-svg-5.15.19+kde+r5-1-x86_64 +installed = qt5-translations-5.15.19-1-any +installed = qt6-5compat-6.11.1-1-x86_64 +installed = qt6-base-6.11.1-1-x86_64 +installed = qt6-declarative-6.11.1-3-x86_64 +installed = qt6-positioning-6.11.1-1-x86_64 +installed = qt6-shadertools-6.11.1-1-x86_64 +installed = qt6-svg-6.11.1-1-x86_64 +installed = qt6-tools-6.11.1-3-x86_64 +installed = qt6-translations-6.11.1-1-any +installed = qt6-wayland-6.11.1-1-x86_64 +installed = qt6-webchannel-6.11.1-1-x86_64 +installed = qt6-webengine-6.11.1-3-x86_64 +installed = qt6-websockets-6.11.1-1-x86_64 +installed = qtkeychain-qt6-0.16.0-1-x86_64 +installed = rapidyaml-0.11.1-2-x86_64 +installed = raptor-2.0.16-9-x86_64 +installed = rasqal-1:0.9.33-9-x86_64 +installed = rav1e-0.8.1-2-x86_64 +installed = rdma-core-63.0-2-x86_64 +installed = re2-2:2025.11.05-5-x86_64 +installed = readline-8.3.003-1-x86_64 +installed = redland-1:1.0.17-10-x86_64 +installed = reflector-2023-5-any +installed = retroarch-1.22.2-1-x86_64 +installed = rhash-1.4.6-1-x86_64 +installed = ripgrep-15.1.0-4-x86_64 +installed = robin-map-1.4.1-1-x86_64 +installed = rofi-2.0.0-1-x86_64 +installed = rofi-calc-2.5.1-1-x86_64 +installed = rofi-themes-collection-git-1:r28.43ec2f5-1-any +installed = rpcs3-bin-0.0.41.19433-1-x86_64 +installed = rsync-3.4.4-1-x86_64 +installed = rtkit-0.14-1-x86_64 +installed = rubberband-4.0.0-2-x86_64 +installed = run-parts-5.23.2-1-x86_64 +installed = rutabaga-ffi-0.1.75-1-x86_64 +installed = sbc-2.2-1-x86_64 +installed = scdoc-1.11.4-1-x86_64 +installed = scenefx0.4-0.4.1-2-x86_64 +installed = sdbus-cpp-2.3.1-1-x86_64 +installed = sdl2-compat-2.32.70-1-x86_64 +installed = sdl2_image-2.8.12-1-x86_64 +installed = sdl3-3.4.10-1-x86_64 +installed = seabios-1.17.0-2-any +installed = seatd-0.9.3-1-x86_64 +installed = sed-4.10-1-x86_64 +installed = semver-7.8.2-1-any +installed = serd-0.32.10-1-x86_64 +installed = shaderc-2026.2-1-x86_64 +installed = shadow-4.19.4.arch1-1-x86_64 +installed = shared-mime-info-2.4-3-x86_64 +installed = shiboken6-6.11.1-1-x86_64 +installed = signal-desktop-8.14.0-1-x86_64 +installed = simdjson-1:4.6.4-1-x86_64 +installed = slang-2.3.3-4-x86_64 +installed = slurp-1.5.0-2-x86_64 +installed = smbclient-2:4.24.3-1-x86_64 +installed = snappy-1.2.2-3-x86_64 +installed = sndio-1.10.0-1-x86_64 +installed = sord-0.16.22-1-x86_64 +installed = sound-theme-freedesktop-0.8-6-any +installed = source-highlight-3.1.9-18-x86_64 +installed = spandsp-0.0.6-7-x86_64 +installed = spdlog-1.17.0-2-x86_64 +installed = speex-1.2.1-2-x86_64 +installed = speexdsp-1.2.1-2-x86_64 +installed = spice-0.16.0-2-x86_64 +installed = spice-gtk-0.42-5-x86_64 +installed = spice-protocol-0.14.5-1-any +installed = spirv-tools-1:1.4.350.0-1-x86_64 +installed = sqlite-3.53.2-1-x86_64 +installed = sratom-0.6.22-1-x86_64 +installed = srt-1.5.5-1-x86_64 +installed = startup-notification-0.12-9-x86_64 +installed = steam-1.0.0.85-7-x86_64 +installed = steam-devices-1.0.0.85-7-x86_64 +installed = sudo-1.9.17.p2-2-x86_64 +installed = suitesparse-7.12.2-2-x86_64 +installed = svt-av1-4.1.0-1-x86_64 +installed = swaybg-1.2.2-1-x86_64 +installed = swayfx-0.5.3-4-x86_64 +installed = swig-4.4.1-1-x86_64 +installed = swtpm-0.10.1-2-x86_64 +installed = systemd-260.2-2-x86_64 +installed = systemd-libs-260.2-2-x86_64 +installed = systemd-sysvcompat-260.2-2-x86_64 +installed = taglib-2.3-1-x86_64 +installed = talloc-2.4.4-1-x86_64 +installed = tar-1.35-2-x86_64 +installed = tdb-1.4.15-1-x86_64 +installed = tevent-1:0.17.1-2-x86_64 +installed = texinfo-7.3-1-x86_64 +installed = thunderbird-151.0.1-1-x86_64 +installed = thunderbird-gnome-theme-git-r95.c61b897-1-any +installed = thunderbird-i18n-de-151.0.1-1-x86_64 +installed = thunderbird-ublock-origin-1.70.0-1-any +installed = timeshift-25.12.4-1-x86_64 +installed = timeshift-autosnap-0.10.0-1-any +installed = tinysparql-3.11.1-1-x86_64 +installed = tomlplusplus-3.4.0-2-x86_64 +installed = totem-pl-parser-3.26.7-1-x86_64 +installed = tpm2-tss-4.1.3-1-x86_64 +installed = transmission-gtk-4.1.1-1-x86_64 +installed = tslib-1.24-1-x86_64 +installed = ttc-iosevka-34.6.1-1-any +installed = ttc-iosevka-aile-34.6.1-1-any +installed = ttc-iosevka-curly-34.6.1-1-any +installed = ttc-iosevka-curly-slab-34.6.1-1-any +installed = ttc-iosevka-etoile-34.6.1-1-any +installed = ttf-iosevka-nerd-3.4.0-2-any +installed = ttf-iosevkaterm-nerd-3.4.0-2-any +installed = ttf-liberation-2.1.5-2-any +installed = ttf-nerd-fonts-symbols-3.4.0-1-any +installed = ttf-nerd-fonts-symbols-common-3.4.0-1-any +installed = twolame-0.4.0-4-x86_64 +installed = tzdata-2026b-1-x86_64 +installed = uchardet-0.0.8-4-x86_64 +installed = udisks2-2.11.1-2-x86_64 +installed = unzip-6.0-23-x86_64 +installed = upower-1.91.2-1-x86_64 +installed = usbredir-0.15.0-1-x86_64 +installed = usbutils-019-1-x86_64 +installed = usd-26.05-3-x86_64 +installed = util-linux-2.42.1-1-x86_64 +installed = util-linux-libs-2.42.1-1-x86_64 +installed = uv-0.11.21-1-x86_64 +installed = v4l-utils-1.32.0-2-x86_64 +installed = vapoursynth-76-1-x86_64 +installed = vde2-2.3.3-8-x86_64 +installed = vid.stab-1.1.1-2-x86_64 +installed = vim-9.2.0653-1-x86_64 +installed = vim-runtime-9.2.0653-1-x86_64 +installed = virglrenderer-1.3.0-2-x86_64 +installed = virt-install-5.1.0-3-any +installed = virt-manager-5.1.0-3-any +installed = virtiofsd-1.13.3-1-x86_64 +installed = vmaf-3.1.0-1-x86_64 +installed = volume_key-0.3.12-12-x86_64 +installed = vte-common-0.84.0-1-x86_64 +installed = vte3-0.84.0-1-x86_64 +installed = vulkan-headers-1:1.4.350.0-1-any +installed = vulkan-icd-loader-1.4.350.0-1-x86_64 +installed = vulkan-mesa-implicit-layers-1:26.1.2-2-x86_64 +installed = vulkan-radeon-1:26.1.2-2-x86_64 +installed = vulkan-tools-1.4.350.0-1-x86_64 +installed = wavpack-5.9.0-1-x86_64 +installed = waybar-0.15.0-2-x86_64 +installed = wayland-1.25.0-1-x86_64 +installed = wayland-protocols-1.49-1-any +installed = waypaper-2.8-1-any +installed = webkit2gtk-4.1-2.52.4-1-x86_64 +installed = webkitgtk-6.0-2.52.4-1-x86_64 +installed = webrtc-audio-processing-1-1.3-5-x86_64 +installed = wget-1.25.0-5-x86_64 +installed = which-2.25-1-x86_64 +installed = wine-11.11-1-x86_64 +installed = winetricks-20260125-2-any +installed = wireplumber-0.5.14-1-x86_64 +installed = wl-clipboard-1:2.3.0-1-x86_64 +installed = wlroots0.19-0.19.3-1-x86_64 +installed = wlroots0.20-0.20.1-1-x86_64 +installed = wlsunset-0.4.0-1-x86_64 +installed = woff2-1.0.2-6-x86_64 +installed = wolfssl-5.9.1-1-x86_64 +installed = wpa_supplicant-2:2.11-5-x86_64 +installed = x264-3:0.165.r3222.b35605a-2-x86_64 +installed = x265-4.1-1-x86_64 +installed = xapp-3.2.2-1-x86_64 +installed = xapp-symbolic-icons-1.1.0-1-any +installed = xcb-imdkit-1.0.9-1-x86_64 +installed = xcb-proto-1.17.0-4-any +installed = xcb-util-0.4.1-2-x86_64 +installed = xcb-util-cursor-0.1.6-1-x86_64 +installed = xcb-util-errors-1.0.1-2-x86_64 +installed = xcb-util-image-0.4.1-3-x86_64 +installed = xcb-util-keysyms-0.4.1-5-x86_64 +installed = xcb-util-renderutil-0.3.10-2-x86_64 +installed = xcb-util-wm-0.4.2-2-x86_64 +installed = xcur2png-0.7.1-9-x86_64 +installed = xdg-dbus-proxy-0.1.7-1-x86_64 +installed = xdg-desktop-portal-1.22.0-1-x86_64 +installed = xdg-desktop-portal-gtk-1.15.3-1-x86_64 +installed = xdg-desktop-portal-hyprland-1.3.12-2-x86_64 +installed = xdg-terminal-exec-0.14.0-1-any +installed = xdg-user-dirs-0.20-1-x86_64 +installed = xdg-user-dirs-gtk-0.16-1-x86_64 +installed = xdg-utils-1.2.1-2-any +installed = xdotool-4.20260303.1-1-x86_64 +installed = xenia-canary-bin-02d2cb5-2-x86_64 +installed = xenia-edge-bin-20260614125312.ce9fb29-1-x86_64 +installed = xkeyboard-config-2.47-1-any +installed = xmlsec-1.3.11-1-x86_64 +installed = xorg-fonts-encodings-1.1.0-2-any +installed = xorg-server-common-21.1.23-1-x86_64 +installed = xorg-setxkbmap-1.3.5-1-x86_64 +installed = xorg-xkbcomp-1.5.0-1-x86_64 +installed = xorg-xprop-1.2.8-1-x86_64 +installed = xorg-xrandr-1.5.4-1-x86_64 +installed = xorg-xwayland-24.1.12-1-x86_64 +installed = xorgproto-2025.1-1-any +installed = xvidcore-1.3.7-3-x86_64 +installed = xxhash-0.8.3-1-x86_64 +installed = xz-5.8.3-1-x86_64 +installed = yaml-cpp-0.9.0-1-x86_64 +installed = yazi-26.5.6-4-x86_64 +installed = zenity-4.2.2-1-x86_64 +installed = zeromq-4.3.5-3-x86_64 +installed = zimg-3.0.6-1-x86_64 +installed = zint-2.16.0-2-x86_64 +installed = zix-0.8.2-1-x86_64 +installed = zlib-1:1.3.2-3-x86_64 +installed = zlib-ng-2.3.3-1-x86_64 +installed = zram-generator-1.2.1-1-x86_64 +installed = zsh-5.9.1-1-x86_64 +installed = zstd-1.5.7-3-x86_64 +installed = zxing-cpp-3.0.2-1-x86_64 diff --git a/packaging/tanin-libadwaita/pkg/tanin-libadwaita/.MTREE b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/.MTREE new file mode 100644 index 0000000000000000000000000000000000000000..c4034c454c4efe2fda372d465e3ebdc83cac23fd GIT binary patch literal 629 zcmV-*0*d_~iwFP!000001Fev^H z!}9I7lTYtXKEMC6n8%H*JQiPkM4y*#F^#`v1<55`Os6fR%;Q?7c?B*6EkKaOYbpf` zQO*Lu5;&Fkzb}jI*CwESbYRs(Y9dV7)vKMIN zdg-dpJ7^e#6c-3>omjKORJ2piT5fsVoE%d!1((xyPxBjKJZ^6ThCW^#6g153V!Sv$ zAA93pZJgUv=L){=z~q=y_uL@F=CL+Z5^e-h6JfVSMx+o5btqaTdP!81WrZGnRevYK zTEDE+f`;j8nq|YU3bwTzKx;SS5tXHF{v1j6l)Cri9j00zQX)|xFTpC6(8&=|#84HS z!<;EN3OjL{NgxLA~8?SDl1hs$z}~mF;dr z0`Cgjo^PpFr@diTK1|p7xIUeq6_#^+D6DF0u2%F_QuAs9q37&dwoFkMeR3TmX+z+~ zLar96SyE2wZAS3{/dev/null || true + gsettings set org.gnome.desktop.interface accent-color "purple" 2>/dev/null || true + echo "tanin-libadwaita: $mode" +} + +current_mode() { + case "$(gsettings get org.gnome.desktop.interface color-scheme 2>/dev/null)" in + *prefer-light*) echo light ;; + *) echo dark ;; + esac +} + +case "${1:-auto}" in + dark|light) + link_variant "$1" + gsettings set org.gnome.desktop.interface color-scheme \ + "$([ "$1" = light ] && echo prefer-light || echo prefer-dark)" 2>/dev/null || true + ;; + auto) + link_variant "$(current_mode)" + ;; + watch) + link_variant "$(current_mode)" + gsettings monitor org.gnome.desktop.interface color-scheme | while read -r _; do + link_variant "$(current_mode)" + done + ;; + *) + echo "usage: tanin-libadwaita {dark|light|auto|watch}" >&2; exit 2 ;; +esac diff --git a/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/lib/systemd/user/tanin-libadwaita.service b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/lib/systemd/user/tanin-libadwaita.service new file mode 100644 index 0000000..1b37bc0 --- /dev/null +++ b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/lib/systemd/user/tanin-libadwaita.service @@ -0,0 +1,13 @@ +[Unit] +Description=TANINUX libadwaita theme follower (Fuji light/dark on color-scheme change) +PartOf=graphical-session.target +After=graphical-session.target + +[Service] +Type=simple +ExecStart=/usr/bin/tanin-libadwaita watch +Restart=on-failure +RestartSec=2 + +[Install] +WantedBy=graphical-session.target diff --git a/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-3.0/dark.css b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-3.0/dark.css new file mode 100644 index 0000000..8724301 --- /dev/null +++ b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-3.0/dark.css @@ -0,0 +1,66 @@ +/* ========================================================================= + * tanin-libadwaita — Fuji DARK recolour for GTK3 (rides on adw-gtk3-dark). + * Covers the gaps the libadwaita/GTK4 recolour can't reach: GTK3 apps + * (pavucontrol, nm-connection-editor, …). Same palette as the GTK4 dark. + * ========================================================================= */ + +/* libadwaita-style names (adw-gtk3 honours these) */ +@define-color accent_color #a39ec4; +@define-color accent_bg_color #a39ec4; +@define-color accent_fg_color #0f0f0f; +@define-color window_bg_color #0f0f0f; +@define-color window_fg_color #f0f0f0; +@define-color view_bg_color #141414; +@define-color view_fg_color #f0f0f0; +@define-color headerbar_bg_color #0f0f0f; +@define-color headerbar_fg_color #f0f0f0; +@define-color card_bg_color #191919; +@define-color card_fg_color #f0f0f0; +@define-color popover_bg_color #191919; +@define-color popover_fg_color #f0f0f0; +@define-color dialog_bg_color #141414; +@define-color dialog_fg_color #f0f0f0; +@define-color sidebar_bg_color #131313; + +/* legacy GTK3 / Adwaita names */ +@define-color theme_bg_color #0f0f0f; +@define-color theme_fg_color #f0f0f0; +@define-color theme_base_color #141414; +@define-color theme_text_color #f0f0f0; +@define-color theme_selected_bg_color #a39ec4; +@define-color theme_selected_fg_color #0f0f0f; +@define-color insensitive_bg_color #161616; +@define-color insensitive_fg_color #6a6a6a; +@define-color insensitive_base_color #121212; +@define-color borders rgba(240, 240, 240, 0.10); + +@define-color destructive_color #e0a3a3; +@define-color success_color #9ec4a3; +@define-color warning_color #c4bd9e; +@define-color error_color #e0a3a3; + +/* pill-shaped controls */ +button, +entry, +combobox button, +spinbutton, +notebook > header > tabs > tab { border-radius: 999px; } + +/* Force the Fuji accent. adw-gtk3 otherwise follows the GNOME accent-color + * gsetting (would stay blue), so we override the accented widgets explicitly. */ +scale highlight, +scale trough progress, +progressbar progress, +levelbar block.filled { background-color: @accent_color; } +checkbutton check:checked, +radiobutton radio:checked, +check:checked, radio:checked { background-color: @accent_color; border-color: @accent_color; } +switch:checked { background-color: @accent_color; } +notebook > header tab:checked { box-shadow: inset 0 -3px @accent_color; } +notebook > header tab:checked label { color: @accent_color; } +row:selected, list row:selected, +treeview.view:selected, .view:selected, +menuitem:hover, menu menuitem:hover, +*:selected { background-color: @accent_color; color: @accent_fg_color; } +button.suggested-action { background-color: @accent_color; color: @accent_fg_color; } +entry:focus, entry:focus-within { border-color: @accent_color; } diff --git a/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-3.0/light.css b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-3.0/light.css new file mode 100644 index 0000000..fd900fa --- /dev/null +++ b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-3.0/light.css @@ -0,0 +1,65 @@ +/* ========================================================================= + * tanin-libadwaita — Fuji LIGHT recolour for GTK3 (rides on adw-gtk3). + * Same warm Fuji light palette as the GTK4 light variant. + * ========================================================================= */ + +/* libadwaita-style names (adw-gtk3 honours these) */ +@define-color accent_color #6f67a8; +@define-color accent_bg_color #6f67a8; +@define-color accent_fg_color #ffffff; +@define-color window_bg_color #f3f1ec; +@define-color window_fg_color #2a2926; +@define-color view_bg_color #faf8f4; +@define-color view_fg_color #2a2926; +@define-color headerbar_bg_color #ece8e1; +@define-color headerbar_fg_color #2a2926; +@define-color card_bg_color #ffffff; +@define-color card_fg_color #2a2926; +@define-color popover_bg_color #ffffff; +@define-color popover_fg_color #2a2926; +@define-color dialog_bg_color #faf8f4; +@define-color dialog_fg_color #2a2926; +@define-color sidebar_bg_color #ece8e1; + +/* legacy GTK3 / Adwaita names */ +@define-color theme_bg_color #f3f1ec; +@define-color theme_fg_color #2a2926; +@define-color theme_base_color #faf8f4; +@define-color theme_text_color #2a2926; +@define-color theme_selected_bg_color #6f67a8; +@define-color theme_selected_fg_color #ffffff; +@define-color insensitive_bg_color #ebe7e0; +@define-color insensitive_fg_color #9b968c; +@define-color insensitive_base_color #f1eee8; +@define-color borders rgba(0, 0, 0, 0.12); + +@define-color destructive_color #b04848; +@define-color success_color #4f7a57; +@define-color warning_color #8a7f3a; +@define-color error_color #b04848; + +/* pill-shaped controls */ +button, +entry, +combobox button, +spinbutton, +notebook > header > tabs > tab { border-radius: 999px; } + +/* Force the Fuji accent. adw-gtk3 otherwise follows the GNOME accent-color + * gsetting, so we override the accented widgets explicitly. */ +scale highlight, +scale trough progress, +progressbar progress, +levelbar block.filled { background-color: @accent_color; } +checkbutton check:checked, +radiobutton radio:checked, +check:checked, radio:checked { background-color: @accent_color; border-color: @accent_color; } +switch:checked { background-color: @accent_color; } +notebook > header tab:checked { box-shadow: inset 0 -3px @accent_color; } +notebook > header tab:checked label { color: @accent_color; } +row:selected, list row:selected, +treeview.view:selected, .view:selected, +menuitem:hover, menu menuitem:hover, +*:selected { background-color: @accent_color; color: @accent_fg_color; } +button.suggested-action { background-color: @accent_color; color: @accent_fg_color; } +entry:focus, entry:focus-within { border-color: @accent_color; } diff --git a/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-4.0/dark.css b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-4.0/dark.css new file mode 100644 index 0000000..ec51aa3 --- /dev/null +++ b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-4.0/dark.css @@ -0,0 +1,74 @@ +/* ========================================================================= + * tanin-theme — Fuji recolour for libadwaita / GTK4. + * Drop-in at ~/.config/gtk-4.0/gtk.css. Overrides libadwaita's NAMED colors, + * which recolours every libadwaita app (tsettings/thub, Nautilus, …) without a + * full custom theme. Palette is 1:1 with eww.scss / the greeter. + * ========================================================================= */ + +/* ---- Fuji palette -------------------------------------------------------- */ +@define-color fuji_bg #0f0f0f; +@define-color fuji_bg_alt #191919; +@define-color fuji_bg_hi #242424; +@define-color fuji_fg #f0f0f0; +@define-color fuji_muted #8a8a8a; +@define-color fuji_accent #a39ec4; + +/* ---- accent -------------------------------------------------------------- */ +@define-color accent_color #a39ec4; +@define-color accent_bg_color #a39ec4; +@define-color accent_fg_color #0f0f0f; /* dark text on the light violet */ + +/* ---- window / base surfaces --------------------------------------------- */ +@define-color window_bg_color #0f0f0f; +@define-color window_fg_color #f0f0f0; +@define-color view_bg_color #141414; +@define-color view_fg_color #f0f0f0; + +/* ---- headerbar ----------------------------------------------------------- */ +@define-color headerbar_bg_color #0f0f0f; +@define-color headerbar_fg_color #f0f0f0; +@define-color headerbar_border_color #f0f0f0; +@define-color headerbar_backdrop_color #0f0f0f; +@define-color headerbar_shade_color rgba(0, 0, 0, 0.5); + +/* ---- cards / dialogs / popovers / sidebar ------------------------------- */ +@define-color card_bg_color #191919; +@define-color card_fg_color #f0f0f0; +@define-color card_shade_color rgba(0, 0, 0, 0.45); +@define-color dialog_bg_color #141414; +@define-color dialog_fg_color #f0f0f0; +@define-color popover_bg_color #191919; +@define-color popover_fg_color #f0f0f0; +@define-color sidebar_bg_color #131313; +@define-color sidebar_fg_color #f0f0f0; +@define-color sidebar_backdrop_color #0f0f0f; +@define-color sidebar_shade_color rgba(0, 0, 0, 0.45); + +/* ---- semantic ------------------------------------------------------------ */ +@define-color destructive_color #e0a3a3; +@define-color destructive_bg_color #b45c5c; +@define-color destructive_fg_color #0f0f0f; +@define-color success_color #9ec4a3; +@define-color warning_color #c4bd9e; +@define-color error_color #e0a3a3; + +@define-color shade_color rgba(0, 0, 0, 0.4); +@define-color scrollbar_outline_color rgba(255, 255, 255, 0.06); + +/* ---- pill-shaped controls (Fuji house style) --------------------------- * + * Buttons, entries and toggles become stadium pills like the bar/greeter. */ +button, +button.toggle, +menubutton > button, +dropdown > button, +splitbutton > button, +entry, +spinbutton, +.pill { + border-radius: 999px; + min-height: 0; +} +/* containers stay softly rounded, not stadium-shaped */ +.card, +popover > contents, +.osd { border-radius: 14px; } diff --git a/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-4.0/light.css b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-4.0/light.css new file mode 100644 index 0000000..354acf4 --- /dev/null +++ b/packaging/tanin-libadwaita/pkg/tanin-libadwaita/usr/share/tanin/libadwaita/gtk-4.0/light.css @@ -0,0 +1,71 @@ +/* ========================================================================= + * tanin-libadwaita — Fuji LIGHT recolour for libadwaita / GTK4. + * Warm "Yuki/Fuji" light palette (1:1 with eww.scss light tokens), deeper + * violet accent so it reads on white. Pair with color-scheme=prefer-light. + * ========================================================================= */ + +/* ---- Fuji light palette -------------------------------------------------- */ +@define-color fuji_bg #f3f1ec; /* soft warm white */ +@define-color fuji_bg_alt #e8e4dc; /* cards / tiles */ +@define-color fuji_bg_hi #ddd8ce; /* hover */ +@define-color fuji_fg #2a2926; /* near-black ink */ +@define-color fuji_muted #6f6b62; +@define-color fuji_accent #6f67a8; /* deeper violet — readable on light */ + +/* ---- accent -------------------------------------------------------------- */ +@define-color accent_color #6f67a8; +@define-color accent_bg_color #6f67a8; +@define-color accent_fg_color #ffffff; + +/* ---- window / base surfaces --------------------------------------------- */ +@define-color window_bg_color #f3f1ec; +@define-color window_fg_color #2a2926; +@define-color view_bg_color #faf8f4; +@define-color view_fg_color #2a2926; + +/* ---- headerbar ----------------------------------------------------------- */ +@define-color headerbar_bg_color #ece8e1; +@define-color headerbar_fg_color #2a2926; +@define-color headerbar_border_color #2a2926; +@define-color headerbar_backdrop_color #f3f1ec; +@define-color headerbar_shade_color rgba(0, 0, 0, 0.08); + +/* ---- cards / dialogs / popovers / sidebar ------------------------------- */ +@define-color card_bg_color #ffffff; +@define-color card_fg_color #2a2926; +@define-color card_shade_color rgba(0, 0, 0, 0.07); +@define-color dialog_bg_color #faf8f4; +@define-color dialog_fg_color #2a2926; +@define-color popover_bg_color #ffffff; +@define-color popover_fg_color #2a2926; +@define-color sidebar_bg_color #ece8e1; +@define-color sidebar_fg_color #2a2926; +@define-color sidebar_backdrop_color #f3f1ec; +@define-color sidebar_shade_color rgba(0, 0, 0, 0.07); + +/* ---- semantic ------------------------------------------------------------ */ +@define-color destructive_color #b04848; +@define-color destructive_bg_color #b04848; +@define-color destructive_fg_color #ffffff; +@define-color success_color #4f7a57; +@define-color warning_color #8a7f3a; +@define-color error_color #b04848; + +@define-color shade_color rgba(0, 0, 0, 0.07); +@define-color scrollbar_outline_color rgba(0, 0, 0, 0.08); + +/* ---- pill-shaped controls (Fuji house style) --------------------------- */ +button, +button.toggle, +menubutton > button, +dropdown > button, +splitbutton > button, +entry, +spinbutton, +.pill { + border-radius: 999px; + min-height: 0; +} +.card, +popover > contents, +.osd { border-radius: 14px; } diff --git a/packaging/tanin-libadwaita/tanin-libadwaita-0.1.0-1-any.pkg.tar.zst b/packaging/tanin-libadwaita/tanin-libadwaita-0.1.0-1-any.pkg.tar.zst new file mode 100644 index 0000000000000000000000000000000000000000..fc09423c1d244c8c68bf4de616d9720807b980b9 GIT binary patch literal 15637 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ÞAk6j0IrM*aQwU#vs5MQBW*6h=2wnNWhCUkiY?Lm;)LhW(Z*< z`1oQ2DQH3l4uOd;^xzU%V89a=6VPygAu1UVU||QgGvcz=25y6d{E-l;D7i4HQ<0MAOKD0c&UkCII1r z2xI|)C%6t2;F(MzfiRrFj4osW5`|#Fy z#>fY5EMO5x@PG*F;8ZAs1}G2!0o-T+3=pva=Ytk~s4P3MK_`tf8t@`u+knOt25^8I zY(RRICr$4?j}=yY!D9r@L6v>Z33QU(dey9$Pafp_$)8M>^(Q9Q&3|i_} z4hN#I;Z*r@UIe3?@skOS4NKtpA?WODHftTkVz3UIj z>-%kPyj$NtfJcewm%x3$r=CpL@2X8*;DZxZ#dlqdR(nd!wu0=!ipg;--?FxOtk` zwnkT)_WhT}uJSIuEbeiSzBGL89Jk)tx;tha-Ff%TIC4+R>MN#tO!JwqOYL>_^sctLgK@Ol(l}pLM=uh2)Ou~H(N?dmXRdsVcIz$7%+W>e@?6w5 zmqv`95OPnW*>!e})u`*}THlw^HB>1HtW;MVgdBvGY8|-FP*wgsig`eFr0H4XeClSa*_Ssz{28MoCf~e0L-3hiDbE#= zM?F6da+c=yD~+BX_nruB(DT$hQ-2x=a+exSbj;JscjK5JeH`=Crft&fN6hSaW_xB{ zEq!CZvMzm7-P(wm(x+_#X=ub$_U-*PZIfx*CQ_TWiIZa0Hs;-=ZBl8p=6B4oPNz-U zCYPMUX(q?zIq5k`+9t126ld3$2FJht@>(lzfBofuO%_i3>G`SWtuLlYeYFiHM@@Um zuUKhfrO{MT#(m|VxVmuF?(h5>j!D~KG){BGOv<**ytT3@)|G0k^?mQM+@!i=Hjw;U z^Cgi~_Hk!hOg6Oa-}7d?T|d@6Pp$nj@%(z5bn;UxUuwttEKPeRsWKS8wz;)FuB_wR z!PaG8_WjNCwVa9?Uzr>&NFB+Sc;$u zrEYpA_a2lTd^sQoxmRiKzG|h>cV87pRR%|kqg|KWr&rw8?Q0^v7|h&GVF%s%4eLh> zdMeL7k&{}@j^`9f($3PY3ro+JT+5rj``T-DiPQTU?o`d`wKn?vw#2@Dl!c(SIc~jT93SM?((0bn zLi_UCXxp{XLJnS5*7Y=Q&D^@vCDYn}3I@U`APfg{eO=7-xQFSGBxt|x z>yqRsYrT1DN}5t6Ys}v^TCOQd;*g>crbCzxVVdSRaY*=PnwgP=qV%O%2-{xo+sih` zHv$5-l|tqrNYTieLmISc9?0>>5cbN%AEZ)mm#UdkE8dYPZ=qdm@kN z_kua=ZhcKw>qRjTMu}`+7qfrExL`Wuh1ntd2E#bAPIiqm4ZK$15(KdT#OQ zl!c1a1TQec>5qaa$`UIRH8Cs44UZ6Dk;N8L<*7tZ>cMu{$L!xUrbA!zQX;WY-`cC{ z(yj;F0YYI+M|RD{h*-Y=vTjkBzs7mq6t?wOrbA?NGb4jlm$7m%)Y!weNaI`?cMr_m zztQYIjhUi@x(KBQ+W`V5k}EP8^;(~DEJs;g<26S~(V?~H>SoL^)phgM!Mw()DIp-t zbt=ahqfS3(*Iecsb~V$1qZ7Agv|e{}gMl!L*1uuSXTDeTU^_VYa=9=OeLao2k-@Z# zn?=E*V3~WR?`!R2%{W(HY28WDLD6CF-j}3=fG}Nerj8>`HZ+g?y{C;g++oxP_j&Ijd zQcMaKvIBb1gPzmZ6y=(WFTT9XySy5V(Htk0qoiK+qE~}4f6cSG)c%HgsE2x}O74iJ zU!YinF-GF{DW@Qygn%#{uCHq^hTUM=t!SCo&ejbighB}cVT=-)@9i~W=2irQIUG$e zqYzAojvEYwQ8dO;1T&*&wxO_bMq2Q|0>_GF*IX(X2%|WAnRfd527|QtLW(MSU`8Q8 z7-fWkggli8LJ%Z9PmWZIVC7A3dZI_Fz|IuZw~Z#CjFE*H6bc-f4ut#bUPD7%A?8C+f^BJk^+rD#dU0b;- zU$$K{Msa&7W0Viwn5|FM=$S=^FP526vKp~5JQ>?D2K#89vGXk&;{X$bdB6i~4EC`# zwei8cF)yht|`D zXl#Vo_!ya4U&?ko4tiW6jNle1qm58K1QtgLW&T8 zL7~)-)V;j1?V8f5HO}AB%H&8xHm1^irp!8KGiIN8t*X0y+L)tb9GPP_jvLH1Uzy&| zys{B9*@nVidV~42mj@SCeDOsXRBUdomtu_FeMKBBhZQ5}f(tBcyuqAai|vTnY`bQR zF{kx(nO%kScpRkTaS<6Uv#Ssn(gJq3ee3#SCUeZL>}Tv(tD{**QX50Sql+oD@2L4b zrC^NJp!6u??kkp2MkYr}2CG5A=qQ=SdI$$yJjLAUkU`RW2cntJJy!(7G7Y%Mi>Qx7U<+P zX1b`UGA=|!j!ce}R7NEPxN3ERURy~ z@WL5j2^JWG3t@mFJOKkU0x<_PY@j*A3{8+hNsS$haKNxJ#SG%Gg%AK7OtFWW0U^u* z4|zC4hY3Xhzz5RkKnM>)#&{ONhCqNEXygDx4=#ZQE`Z<#2}lG5oFuRX{s0FpB2gj0 zmOu;>z*DG!06;>TfQ25|Km`qU-~vJ%A^?)O!eRs$U!dR#6QIHrY8V6+Un2v#2L(v5 z1sB9{L?V(ffD%f45k@6SK!r?+6mFEEeIS7&6d?*PXhIKLL{Wk$1}6lJW2hv~2gEeO zV9}BgGE`I}4G0R85kLSSXc`R&Ws(V<*Z~v(0d{OSIwTen5DJEZ!C){n5|K=WBPq>M z6mo_shSZP@O$`bP#?6lhHd*5m;Ew4$CXQ4)0tlQdWKP+QjbPZfT;)UCD6x9L-es^FhtyDtX${Cce4I=IP;vhycPW#@GqKZLC~vjve;`Yzd@QaNsY7&uv9ns(6QM z89MV(<9fP-2SnKiWL|VW;6`TvzT7n6zoj6*6!-jdC#q7_BOqNCodnw%qHr1MfKtH} z`A&#kIzgJL2yDy!I(F*3Wv70K)I8k1EJ!B{+~gi0HkA7H0gVJNflH{_FYFLEcpeTA zvqxGDHGi5_F6fZ@LA=1Pk580C#==obJvg#=yygD=V`wiLqwIX$5Kn5d-czz&6tb!lr z<@lm!lFG?T;Em9dHW#BJf}qaLJ1MC^T-Jezr)OKc>Y=z=UOr8x9J)|u$U)h{-4jvO z+7?W9k^OUmQaDp|%T6mx3j8$Zsn)`@aoa7Dg!nxNuT@plmZmeh+0jMSb+9?N2 z?ipYu4(R_x*~jZMAVt=+7T^E_>L)C_p>4m4Mm>JzEY7?!OwDCxU6@TX?)KMDWmv{uaErKvfP)c9W#8<9rJ;NSAuc`L$QK#80ryo4=;GAUMH z^!`fg|1I9Yl9p;q5jZSf0OkMRJCRP{feQ@ z%)a#`^dXL1DyH%SjW6|Q0sACD1#dh(AI)GYPS9U&Kqj^2k&xa8HR`s6-lK$XbDD;U zF+zk5shb4oc?W6VP=rd3|MKV2!gZ;D3|^TvC%`VL(%u|qxO9HuiXDH+vZ267$?9g} z8vx(wJo8M;+i>+f;FSJ?WJq?<#Yh`a^?pD#x&-yZuiZO$dJm9>I8b!iqog^@jR)k7 zw<;<-dT#E7vGq?aI5OtwMd>PR%}Jhfniy;0w(u**lrn1L3#95})rb#TKh*$P#h$fxFpQRNXDGV> z?AJJ}qh3Vkgz{x12awq=A!>FDnmW_xu`gL!;t{(zAbmDvlS_Grg=^4pyf#+bkHt6u z$th6be9ummpv`tUH(_^n|BqElh;^{Z5MW1&d{eQfiBs1v`}s-g{-6|ZpzR_J@53sf zS#+iJ5vE!GKW60ED2PTaN>4}bC9g&?j!urxl7`)YZuEr|s|i#U)Cyh72Lc1^qF!&M z*ZCCDVMB3kk}6}Mg8Sf<=m4n*ULwxT?3D_i*yDllo0&x)^Ve^Mvr?teQhRGB6fo|S zoq*phTu+q8E-8I|sj4@sjy8`b1hPiBm_SIQ21JLA4G2pIUWBj<-gjrSy`Bd^$>@PC zMX=X9;By&BvEb{O+V6FN&FE+5BO|HtV~Y?k=GbFMf3*prF3K22l!0^UiHpejXH5_f zcPyFM?sce+rbA7e4(V1$hms8QIq<&{f7<6%-CF%8>6S6p=++=oT2~yXg%n3=O+?(f zzr^h+P(<&T>CKA)?JsVCZn1U&W|Hnda8 zqJ!WPwHEgyWmdP&foht~y~}3`b_$|MCbquDgc?2|dbW$o*I;!#TpTOD5wGV1eXY2B zrty4;8Jt}U6HF%xH%HJy?>mJDI=n_$BgHc_E4ZpFI6xM|#@Ak92!wHfL*GfCZ z!NkODcFO|k-y~U3W=*(gYMZkV2K4hYlOw%rv$~NW*Ev2g(dz ziwm(Hv>GV$0CRU+!lZus($3iLwTHs8eCeP3YAAT<=1g05(o@@4a?yxmliAsG*lsze zF@6c+>j%N4^My^ClS;HasVYkVt;A`eI$HOT4uAv@wAtqMGG^^aJR8*y#iB&xVXH19 z$N|fqf}%z?AYN1uy*sE^4q))1O`ODT> zgpXVzp_IH?<#8lx02!NN)xdIlfJGFWrTRQrPkRPO4WyA+4DF{wDFoI3;?xsx9Jg{$ z7-SO(@F@WRZHfdz(|6|Dp~eAe%2YN9CbDe9{9qC{2RU9?LY2~oB1hx-IBNwP$zWt=dPGpm5*F{84-mx>NJlivHUMf@0$k z6#^}vsTmh0D{DGeUP5qTqv4w)C%$}u!J=+hWq&|FmBC~ZSXHr~t{^i{n<#7X1}8X} zVhc$4AWbisgT9|mhn6%ienvQg+U>^0mfxnX@_V2kf5Q@NtCaHqONE{y2dv}5D`bsJ>HdKWyEY}x>)msu~qAL+nFH06sH z5?*C{{Dq`r#<3gt0G?rzRsFAkBy4~*71L2;QH%KCedE#Ns+;mjFvys=n2~`Mv#2ew znu{UqeKTkU@&hcRI;oG7fnMm^pfBPOCqDIE(!!!0qNwIT;Nbv1C?T3RgL>+FWT+tq zDWgK&?8y)pB8JO4hm)w|yw97Fz5@D|mPyu-kUtT*jSOOCutfig{xWE69J+`*r5LM;2kARUP6Cwkxyi{PU2XZX;Dbhz;;sS`OlrD&9($WB)Lj3`5 zZ>(evnC1s2o+do~T9JXWm`*%Ab=mRCyzxF$rfaRMGd&%^Xp)*~m5nQHKeThT=){pl zv7jsho`B-S0lNA+0J-eZ>n}+YQXfm!$HoGud+VriPpqby*x3oeWG~%JzViZGv2&L4 zUq5RD_KeHA9ffInIv-~0hp$s95Gq7~Rn{{~QZ7cnZV@D$ccAEzDB8WF5Du*K(|%3o z4rLS+0qBrH(aa?mCaizhiiY&(qQb6ot!)|rBqHz!=_QJ&H4j3pYjr$Io@ET+0O$jM zNDll<2@gF{PN={&Vhyk`-6#eui>G`Q2sfj8x-RZK}kB<1ROwH9i+n5G)<2QrBfIXn*v+XbpEnO{mo>l210%q zViT=OE{oQ}J<`(APPGqQwASva=vblA@-ZG6fS2W0BgzF$DG4zogj|@%n*s92C2DC`@;NUn=x-D@v4*5YS;J@~yiRr4z zEE9Qu!!lg)ZN@2of?R1Yz*;y^fMr&aZLYxr>!D>9nGP~Fgs-$X_155{T=2v}GIQFD zK7LaU|1`*GAog0asJDFmOv4A;^#sGf_<0k&A?g>JBHTpa2}cQSk9EOMR01XS!x(n~ zu4@MyudLUiFbO!-+>tYIn1X^I#eQsP3CHtN$|;Sk(ab9GjQSILKh>H|x#l)cFIn>g zqXIoNBNdU+S?ZEIJx)DtN#3(jJ!+{~4Ng!1wqqXnTJ!SziJ~d9SW2@JMk1Jl8?kI3 z7>?Of1j+~QA!VQ?rx?0i#|WKz3r{=(C7ETA!nFP2R4`)O_+S@Hqe|16@VQ=fe2_^a z-Q%*Lu~_Y_mD8r4sV~A<`uk%a$*iC^S(p?Bg^6WX zPAEM759udcMi64LY2>&n%$9w6gW%(wJ@TJjR2(GRb$uxtNC^tY0n?IdAq_OnLn6|G z)->qcrl_OZ4nNcL*U#HAJ6Tl>tCADDLnl2X?(r!ZbQAXJJ}RS41=*0TwPpZ_-k}&amr>A=Q(?8g*Iw`MJ7K2{f(V2T2U61XC}jXGR4+=7cp&Jnk=K&V$-3x-Hqu`{;09eVlt5zAWRB70|W?0Vnd>GYJuWo56<7QMouP zl9Y`|zMlJX<%qYngU{1^nVHK|>pu4|Xz`%P>zp7|S zd8pdT=)<~7)M}j4`lB!whPeO`0Zw`dnF$3z=2yvgFf;Q>YMQLb=FfX zI&4r#l$iB-X4*Yryi)^1y->2tfJ$GD=Ac<2Qpa+=5kl7$*-!vL`a^?~Fy(CA39uV7 z@eHod1>9n&>nW~E&sj;cgD`2o&SOPs`i~28BM51EA`ArfaGkb$zWPMjW_9p7Pd{w^ zJv?#;$Sl_N!mC;NYfp764J4Da>(jpz#1ee^@^Dzg%jN{w07Gd{SM|Fn7Sn) zC+)nkLRZIVu4;X1tC{Ks8gk;KIe%Kh=kg?MKv$5;&raxuPTj28160{@EX$Y{ZBHcC z@v1L!S)=_jP%38O&*I?bsIfVTh8>AJYt1_r7Y6<)K{H}bfd+zdCfdAaZmQ+<{%8lZ z*yif9V1@fzEJ-_-uYyTi9XEvx+VG!F!m=SPW9*+gc90-SPkgGTwrzT;M(TAtXM-`7 zlr=9|F}ibR)T8@R;l>J#dRh{wE2en5p;@iRd|JUHa&D(iKY{vm=GqtE4+$}hE&Dm& zRIH6E9@$&@aVWxA_^5xq;Mmns&p=ec2nZK~4u<X#qHnUb7Mj`~NgRR}~CbnJ0Xe-t&-ABW9EVYt_nw0sN@)*L}2I62E6m3CbO* z3w^q%?9dYKlRhZAC$QE3DRl3~1v-K%bX4(aasz3aF{vgG4>ys-T9QrYKhRN0YMC`s zU^&e{5^M!Z>NIStz&I+qz~U#AL=w7?RX^Fw&$WIAW)fP>;F_jxJ}bXQ?GqPUv0;!w z$Uz2|?rg6J!y1~dgD8?f3sC_9m7UdUMIue$qwxsHYe7)7Fyn`V+J<~$ZhrW8O_*K% z(n$PxWTx+iVQ@hlHW2uF5X4L%4G#8J{Ht>l|^f#*rc*l6ht*TN45+f z9lKkjq1I;aJ>czKN(^?!1(rT@2^FFf^3PI_^rNFr~W;wG)>7+ zsiGHXnvd*c{ucnunR(yv)zjFg=BOIJcea=D| zdi=vGs$SPd!+1)1-{EP*VbalKE)tD9vawF?A|I(qMxbc}bsnXGD|GC#WK$2Gft1-RF!&|L1tvPRQ%BkeTeGaI;2{B4F`gie zA^lZ5&t;?_dcDKA`F=ryZ2+DpQjx!mMmI_L^!oIGll!UTEPKucVLW5Fh3N~l~D zEmLS@EX0WTv{7U5m2+YUu)(P28iWFoC(ml~!H}8IV6;0IG$2`UW-V;Oj98V_Q9>~s z0pebntr6hPay19lzDb13xla7CFPKg{GEmEKXm$k}6O6Y%OTxb1nejm|Tl|44ju{Hg z!BeO0J&I7jk1@Da*z5TkEA48L6(Py`!W-qBkvH(9TqjuSxuf=EYA(2(-i%~N_?N>{ z96CXFc$?7&x>&2H9B6644~Ah9(!Z;_55}Yf1QMeAM21Jd4~P{qwTWRxN377*N~<4d z1cLUSBfJ#fI)00my!7yaaSCMaX^3#+2pa9yoW(Vn^z}}vN&X=MqPJB^ z?ip_x{~`YXB&i0pLZWsIP~+y0ib%}}8aX4;)ww-#P^WE_6=N~v>!zlB{3cA4d@OGx z$>1Z)x0oBfe59|g#%UCKybt-b0rS{JL1=mryBPAK01O^1w_UT@CRFe)%(>k3GUSPN z&#tsV?!{Sr54Y53()tV~!5ycA&c1vgesK6QLdlI@oXZ_k2sUvmrvyKx4uV^#ntcaH z{ganlqEBjIv$zJYULb=YY_e2^GHbS!fLABWQaT>>2>TvV5)8^^s$QX?>Nw<})hEs3 zzxX%*v3f)Iby-7AW7OF4$l7YS=LeQtU#8HHwXBvludzQ<3^C2!%z+@)lpsmh`5}0# zw|VsNsg^@o6r=g4lGBG*JsY$;6QaVeySS4ExQ ztC%AaEvyLmj8dWbW-N)$`icP5Gf7`mD;4-}r{kU^+yDX8j&u~WNs?0tMkwIIj|F%{ z3<>8gcGze^63tgd^bRo$iorS&s}}&g$|Ob_9~N;jI8L}Hj=}YA(Z0fBo6#?k<(B`Z z+Pez&T1YbmTPJ={`-&~Z8@kDGv(`PAn48zQN7J zpSX@u6=p&nN*dK@Znu~W7%pDD8@p7`hHB+r$44ky*mL|UXp1kz-0F!&|1!S_hzvr^ z09morRO&@p_2Kt{9Mad!mc3e7mXI|P*IK~E+uqT&=5xvI)rbdBMx#vdR)tL6<&6kx zamC&z2KBU-$SVt;5x@177MYXb_4Q}vk?xDaT>xoYF`MC{Z;zq}d8 z$?dorX$MXKFpyfH<@3`+l6v8;)z3cIU$@F7hf+aZ;NkvhM+?~sl^Y&6`Q>Ocv=ip| z6(LPoDsxgG$bTCK>xN?Fzgl*Rxi5pWyymk3XD{GNObmjubc>H9Ck+8xMRtc!F(FY7 zg&#KnH0W|lZM=%@(n8`yQCm6^Finv)nm;KpzqEfS>+&)#wPE{Qd_=s5@wW?g#0SG1 zW=TV5`?9nF#buC>Iu)|@(oW8hmfnb>#2;eE{3{nDcs;4Qx~I-)C9Nk%?y{Q^x~MMS z-Ugy%(Ga-G9)5)w54hZwh$#WU>fFcAfpkKv4hV5!t zCRe&5b9O$$37%xj0!QV94;}VNGs6wJ6BHJISzC6fA-W80{jKsbow7Wl(roaGCDt%L z>K`2Ax&SWDLa$^wj-fu85utE2h0XK7Re=u9()7SPc;MgC(T7Wv|DDB|_aH`cDMT20 zHC(mSC14%_;5o_Dq@AhSvl*_nvC>D@>dJr}ULH&hfM-&vd|T{w;n;<5D6256w;)J? zb~fd`lHUqof$ZDS#p<~oB{h>1kf0aNa-{**UOY>@oC~NxwvyXJ-Ii73T58kTaF3ra zN(S+eq(HyQ0QgZyT0CW#CDkhg{`q)c(qzuJuVm(ksuaHnsKxl=TeEs`c(Buy4Bz>E zV$G81g$o8C%TOX)D%S{0_b{jZ8N3x;oV5nS3z{$WTh%|&2c}C^Jm-q0DFR=&kBTLtOk-D_EP=C{zXqk`_fDh%|lL_zI5irKu^kn*44m_EW z`BiwY(#VzWjmxDWroM9LltgGC6OSFG3d_=mLI45qcGDRRvl2z|Vd-%KVMCfT)xqtW z=L;jbpBRnO3J8FMr_+M6T-mmDqao>ThO~WtV{M&enfEEjhbZeiL#ElckzdP=L~k}^ zoHo2}svO%6nV9VL{G*8J7-O@D^Upa1X`vvtJJH*YP1`-KxwH7baGaTUw@zpNFls7p zxyxHWR^u-oNJj!{Tgs|m07XS+T#7~>qkigWapBq|u# z3V$5VmRj&Kj{u5%z@cmGcq)@}P_|p$XUmPOAw@`sk1k=1IS}abTyU+fS1Ci3R}?^` z-s>@mNcAG1Old&*&0xoi21U?U9`zp62>?Dfa1TFQoA{sJ;B?D>d9xkV@Y3Q$tW=_ v_>Ji}|DDi!>5dJngfS9+1lDIpTGGp6LvCBI6vaUNUcv~xl_DJ%Ubx0i(G5V3 literal 0 HcmV?d00001 diff --git a/packaging/tanin-setup/pkg/tanin-setup/.BUILDINFO b/packaging/tanin-setup/pkg/tanin-setup/.BUILDINFO new file mode 100644 index 0000000..3deac09 --- /dev/null +++ b/packaging/tanin-setup/pkg/tanin-setup/.BUILDINFO @@ -0,0 +1,1159 @@ +format = 2 +pkgname = tanin-setup +pkgbase = tanin-setup +pkgver = 0.1.0-1 +pkgarch = any +pkgbuild_sha256sum = cbc613bd712ae5d843ec496c644cfb7e403b704bce3832c75eb53c1e87d954b7 +packager = Unknown Packager +builddate = 1781813718 +builddir = /home/karim/projects/taninux/packaging/tanin-setup +startdir = /home/karim/projects/taninux/packaging/tanin-setup +buildtool = makepkg +buildtoolver = 7.1.0 +buildenv = !distcc +buildenv = color +buildenv = !ccache +buildenv = check +buildenv = !sign +options = strip +options = docs +options = !libtool +options = !staticlibs +options = emptydirs +options = zipman +options = purge +options = debug +options = lto +installed = 7zip-26.01-1-x86_64 +installed = aalib-1.4rc5-19-x86_64 +installed = abseil-cpp-20260526.0-2-x86_64 +installed = accountsservice-26.13.3-1-x86_64 +installed = acl-2.3.2-2-x86_64 +installed = ada-3.4.4-1-x86_64 +installed = adw-gtk-theme-6.5-1-any +installed = adwaita-cursors-50.0-1-any +installed = adwaita-fonts-50.0-1-any +installed = adwaita-icon-theme-50.0-1-any +installed = adwaita-icon-theme-legacy-46.2-3-any +installed = alembic-1.8.11-2-x86_64 +installed = alsa-card-profiles-1:1.6.6-1-x86_64 +installed = alsa-lib-1.2.16.1-1-x86_64 +installed = alsa-plugins-1:1.2.12-5-x86_64 +installed = alsa-topology-conf-1.2.5.1-4-any +installed = alsa-ucm-conf-1.2.16.1-1-any +installed = alsa-utils-1.2.16-1-x86_64 +installed = amd-ucode-20260519-1-any +installed = ananicy-cpp-1.2.0-1-x86_64 +installed = antimicrox-3.6.1-1-x86_64 +installed = aom-3.14.1-1-x86_64 +installed = appstream-1.1.2-1-x86_64 +installed = aquamarine-0.12.1-1-x86_64 +installed = arch-update-3.20.1-1-any +installed = archlinux-contrib-20260611-1-any +installed = archlinux-keyring-20260612-1-any +installed = argon2-20190702-6-x86_64 +installed = at-spi2-core-2.60.4-1-x86_64 +installed = atkmm-2.28.5-2-x86_64 +installed = attr-2.5.2-2-x86_64 +installed = audit-4.1.4-2-x86_64 +installed = autoconf-2.73-1-any +installed = automake-1.18.1-1-any +installed = avahi-1:0.9rc4-1-x86_64 +installed = awesome-terminal-fonts-1.1.0-5-any +installed = ayatana-ido-0.10.4-1-x86_64 +installed = base-3-3-any +installed = base-devel-1-2-any +installed = bash-5.3.15-1-x86_64 +installed = bats-1.13.0-1-any +installed = binutils-2.46+r70+g155188ea10a7-1-x86_64 +installed = bison-3.8.2-8-x86_64 +installed = blas-3.12.1-2-x86_64 +installed = blender-17:5.1.2-1-x86_64 +installed = blosc-1.21.6-2-x86_64 +installed = bluez-5.86-6-x86_64 +installed = bluez-libs-5.86-6-x86_64 +installed = bluez-utils-5.86-6-x86_64 +installed = boost-libs-1.91.0-1-x86_64 +installed = botan-3.12.0-1-x86_64 +installed = brotli-1.2.0-1-x86_64 +installed = btrfs-progs-7.0-1-x86_64 +installed = bubblewrap-0.11.2-1-x86_64 +installed = bzip2-1.0.8-6-x86_64 +installed = c-ares-1.34.6-1-x86_64 +installed = ca-certificates-20240618-1-any +installed = ca-certificates-mozilla-3.125-1-x86_64 +installed = ca-certificates-utils-20240618-1-any +installed = cabextract-1.11-2-x86_64 +installed = cage-0.3.0-1-x86_64 +installed = cairo-1.18.4-1-x86_64 +installed = cairomm-1.14.6-1-x86_64 +installed = cairomm-1.16-1.18.1-1-x86_64 +installed = capstone-5.0.9-1-x86_64 +installed = cblas-3.12.1-2-x86_64 +installed = cdparanoia-10.2-9-x86_64 +installed = ceres-solver-2.2.0-5-x86_64 +installed = chatbox-bin-1.21.0-1-x86_64 +installed = cifs-utils-7.5-1-x86_64 +installed = clang-22.1.6-1-x86_64 +installed = claude-code-2.1.177-1-x86_64 +installed = cliphist-1:0.7.0-2-x86_64 +installed = clucene-2.3.3.4-17-x86_64 +installed = cmake-4.3.3-1-x86_64 +installed = code-1.124.2-1-x86_64 +installed = compiler-rt-22.1.6-1-x86_64 +installed = composefs-1.0.8-1-x86_64 +installed = coreutils-9.11-1-x86_64 +installed = cpio-2.15-3-x86_64 +installed = cppdap-1.58.0-3-x86_64 +installed = cracklib-2.10.3-1-x86_64 +installed = cronie-1.7.2-2-x86_64 +installed = cryptsetup-2.8.6-1-x86_64 +installed = cups-2:2.4.19-1-x86_64 +installed = cups-filters-2.0.1-2-x86_64 +installed = curl-8.20.0-7-x86_64 +installed = dav1d-1.5.3-1-x86_64 +installed = db5.3-5.3.28-7-x86_64 +installed = dbus-1.16.2-1-x86_64 +installed = dbus-broker-37-3-x86_64 +installed = dbus-broker-units-37-3-x86_64 +installed = dbus-glib-0.114-1-x86_64 +installed = dbus-units-37-3-x86_64 +installed = dconf-0.49.0-1-x86_64 +installed = debugedit-5.3-1-x86_64 +installed = default-cursors-3-1-any +installed = desktop-file-utils-0.28-1-x86_64 +installed = device-mapper-2.03.41-1-x86_64 +installed = dialog-1:1.3_20260107-1-x86_64 +installed = diffutils-3.12-2-x86_64 +installed = djvulibre-3.5.30-1-x86_64 +installed = dmidecode-3.7-1-x86_64 +installed = dnsmasq-2.93-1-x86_64 +installed = dos2unix-7.5.6-1-x86_64 +installed = dosfstools-4.2-5-x86_64 +installed = double-conversion-3.4.0-1-x86_64 +installed = draco-1.5.7-2-x86_64 +installed = dtc-1:1.7.2-1-x86_64 +installed = duktape-2.7.0-7-x86_64 +installed = e2fsprogs-1.47.4-1-x86_64 +installed = editorconfig-core-c-0.12.11-1-x86_64 +installed = edk2-ovmf-202605-1-any +installed = efibootmgr-18-4-x86_64 +installed = efivar-39-2-x86_64 +installed = electron39-39.8.10-1-x86_64 +installed = electron42-42.3.0-1-x86_64 +installed = elfutils-0.195-1-x86_64 +installed = embree-4.4.1-1-x86_64 +installed = enchant-2.8.15-2-x86_64 +installed = epson-inkjet-printer-escpr2-1.2.39-1-x86_64 +installed = eww-git-0.6.0.r89.g865cf63-1-x86_64 +installed = exempi-2.6.6-3-x86_64 +installed = exiv2-0.28.8-2-x86_64 +installed = expat-2.8.1-1-x86_64 +installed = extra-cmake-modules-6.27.0-1-any +installed = fakeroot-1:1.37.2-1-x86_64 +installed = fd-10.4.2-2-x86_64 +installed = ffmpeg-2:8.1.1-2-x86_64 +installed = fftw-3.3.11-1-x86_64 +installed = file-5.48-1-x86_64 +installed = filesystem-2025.10.12-1-any +installed = findutils-4.10.0-3-x86_64 +installed = flac-1.5.0-1-x86_64 +installed = flatpak-1:1.18.0-1-x86_64 +installed = flex-2.6.4-6-x86_64 +installed = fmt-12.1.0-2-x86_64 +installed = font-manager-0.9.4-3-x86_64 +installed = fontconfig-2:2.18.1-1-x86_64 +installed = freeglut-3.8.0-1-x86_64 +installed = freetype2-2.14.3-1-x86_64 +installed = fribidi-1.0.16-2-x86_64 +installed = fuse-common-3.18.2-1-x86_64 +installed = fuse2-2.9.9-5-x86_64 +installed = fuse3-3.18.2-1-x86_64 +installed = gamemode-1.8.2-2-x86_64 +installed = gawk-5.4.0-1-x86_64 +installed = gc-8.2.12-1-x86_64 +installed = gcc-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = gcc-libs-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = gcr-3.41.2-2-x86_64 +installed = gcr-4-4.4.0.1-1-x86_64 +installed = gdb-17.2-1-x86_64 +installed = gdb-common-17.2-1-x86_64 +installed = gdbm-1.26-2-x86_64 +installed = gdk-pixbuf2-2.44.6-2-x86_64 +installed = gedit-50.0-3-x86_64 +installed = geoclue-2.8.1-1-x86_64 +installed = geocode-glib-3.26.4-6-x86_64 +installed = gettext-1.0-2-x86_64 +installed = gexiv2-0.16.0-2-x86_64 +installed = gflags-2.2.2-6-x86_64 +installed = gfxstream-0.1.2-2-x86_64 +installed = ghostscript-10.07.1-1-x86_64 +installed = giflib-6.1.3-1-x86_64 +installed = git-2.54.0-1-x86_64 +installed = glew-2.3.1-1-x86_64 +installed = glfw-1:3.4-1-x86_64 +installed = glib-networking-1:2.80.1-1-x86_64 +installed = glib2-2.88.1-1-x86_64 +installed = glibc-2.43+r22+g8362e8ce10b2-2-x86_64 +installed = glibmm-2.66.8-2-x86_64 +installed = glibmm-2.68-2.88.0-2-x86_64 +installed = glm-1.0.3-1-x86_64 +installed = glslang-1:1.4.350.0-1-x86_64 +installed = glu-9.0.3-3-x86_64 +installed = glycin-2.1.1-1-x86_64 +installed = glycin-gtk4-2.1.1-1-x86_64 +installed = gmp-6.3.0-3-x86_64 +installed = gnome-autoar-0.4.5-1-x86_64 +installed = gnome-clocks-50.0-2-x86_64 +installed = gnome-desktop-4-1:44.5-1-x86_64 +installed = gnome-desktop-common-1:44.5-1-x86_64 +installed = gnome-disk-utility-46.1-2-x86_64 +installed = gnome-keyring-1:50.0-1-x86_64 +installed = gnome-text-editor-50.1-1-x86_64 +installed = gnu-free-fonts-20120503-9-any +installed = gnulib-l10n-20241231-1-any +installed = gnupg-2.4.9-1-x86_64 +installed = gnutls-3.8.13-2-x86_64 +installed = go-2:1.26.4-1-x86_64 +installed = gobject-introspection-runtime-1.86.0-2-x86_64 +installed = google-glog-0.7.1-2-x86_64 +installed = gperftools-2.18.1-1-x86_64 +installed = gpgme-2.1.0-1-x86_64 +installed = gpgmepp-2.1.0-1-x86_64 +installed = gpm-1.20.7.r38.ge82d1a6-6-x86_64 +installed = gpsd-3.27.5-1-x86_64 +installed = graphene-1.10.8-2-x86_64 +installed = graphite-1:1.3.15-1-x86_64 +installed = greetd-0.10.3-2-x86_64 +installed = greetd-agreety-0.10.3-2-x86_64 +installed = greetd-regreet-0.4.0-1-x86_64 +installed = greetd-tuigreet-0.9.1-2-x86_64 +installed = grep-3.12-2-x86_64 +installed = grim-1.5.0-2-x86_64 +installed = groff-1.24.1-1-x86_64 +installed = grub-2:2.14-1-x86_64 +installed = gsettings-desktop-schemas-50.1-1-any +installed = gsettings-system-schemas-50.1-1-any +installed = gsm-1.0.24-1-x86_64 +installed = gspell-1.14.3-1-x86_64 +installed = gssdp-1.6.5-1-x86_64 +installed = gst-plugins-bad-libs-1.28.4-1-x86_64 +installed = gst-plugins-base-1.28.4-1-x86_64 +installed = gst-plugins-base-libs-1.28.4-1-x86_64 +installed = gst-plugins-good-1.28.4-1-x86_64 +installed = gstreamer-1.28.4-1-x86_64 +installed = gtest-1.17.0-2-x86_64 +installed = gtk-layer-shell-0.10.1-1-x86_64 +installed = gtk-update-icon-cache-1:4.22.4-1-x86_64 +installed = gtk-vnc-1.5.0-1-x86_64 +installed = gtk3-1:3.24.52-1-x86_64 +installed = gtk4-1:4.22.4-1-x86_64 +installed = gtkmm-4.0-4.22.0-2-x86_64 +installed = gtkmm3-3.24.11-1-x86_64 +installed = gtksourceview4-4.8.4-2-x86_64 +installed = gtksourceview5-5.20.0-1-x86_64 +installed = guile-3.0.11-1-x86_64 +installed = gumbo-parser-0.13.2-1-x86_64 +installed = gupnp-1:1.6.10-1-x86_64 +installed = gupnp-dlna-0.12.0-5-x86_64 +installed = gupnp-igd-1.6.0-2-x86_64 +installed = gvfs-1.60.0-2-x86_64 +installed = gweather-locations-2026.2-1-x86_64 +installed = gzip-1.14-2-x86_64 +installed = harfbuzz-14.2.1-1-x86_64 +installed = harfbuzz-icu-14.2.1-1-x86_64 +installed = hdf5-2.1.1-1-x86_64 +installed = heroic-games-launcher-bin-2.22.0-1-x86_64 +installed = hicolor-icon-theme-0.18-1-any +installed = hidapi-0.15.0-1-x86_64 +installed = highway-1.4.0-1-x86_64 +installed = htmlq-0.4.0-3-x86_64 +installed = hugo-0.163.1-1-x86_64 +installed = hunspell-1.7.3-1-x86_64 +installed = hwdata-0.408-1-any +installed = hwloc-2.14.0-1-x86_64 +installed = hyphen-2.8.9-1-x86_64 +installed = hyprcursor-0.1.13-6-x86_64 +installed = hyprgraphics-0.5.1-2-x86_64 +installed = hyprland-0.55.4-1-x86_64 +installed = hyprland-guiutils-0.2.1-6-x86_64 +installed = hyprlang-0.6.8-4-x86_64 +installed = hyprshot-1.3.0-4-any +installed = hyprtoolkit-0.5.4-2-x86_64 +installed = hyprutils-0.13.1-1-x86_64 +installed = hyprwayland-scanner-0.4.6-1-x86_64 +installed = hyprwire-0.3.1-2-x86_64 +installed = iana-etc-20260530-1-any +installed = icu-78.3-1-x86_64 +installed = ijs-0.35-7-x86_64 +installed = imagemagick-7.1.2.25-1-x86_64 +installed = imath-3.2.2-6-x86_64 +installed = imlib2-1.12.6-1-x86_64 +installed = iniparser-4.2.6-2-x86_64 +installed = intel-oneapi-common-2026.0.0_235-1-any +installed = intel-oneapi-compiler-dpcpp-cpp-runtime-libs-2026.0.0_947-2-x86_64 +installed = intel-oneapi-compiler-shared-runtime-libs-2026.0.0_947-1-x86_64 +installed = intel-oneapi-openmp-2026.0.0_947-1-x86_64 +installed = intel-oneapi-tbb-2023.0.0_724-1-x86_64 +installed = intel-oneapi-tcm-1.5.0_489-1-x86_64 +installed = intel-oneapi-umf-1.1.0_340-2-x86_64 +installed = inter-font-4.1-1-any +installed = iproute2-7.0.0-1-x86_64 +installed = iptables-1:1.8.13-1-x86_64 +installed = iputils-20250605-1-x86_64 +installed = iso-codes-4.20.1-1-any +installed = jansson-2.15.0-1-x86_64 +installed = jbig2dec-0.20-2-x86_64 +installed = jbigkit-2.1-8-x86_64 +installed = jemalloc-1:5.3.1-2-x86_64 +installed = jq-1.8.1-3-x86_64 +installed = json-c-0.18-2-x86_64 +installed = json-glib-1.10.8-1-x86_64 +installed = jsoncpp-1.9.6-3-x86_64 +installed = karchive-6.27.0-1-x86_64 +installed = kbd-2.10.0-1-x86_64 +installed = kddockwidgets-2.4.0-3-x86_64 +installed = kdsingleapplication-1.2.1-1-x86_64 +installed = keyutils-1.6.3-4-x86_64 +installed = kguiaddons-6.27.0-1-x86_64 +installed = kitty-0.47.1-1-x86_64 +installed = kitty-shell-integration-0.47.1-1-x86_64 +installed = kitty-terminfo-0.47.1-1-x86_64 +installed = kmod-34.2-1-x86_64 +installed = krb5-1.22.2-1-x86_64 +installed = l-smash-2.14.5-4-x86_64 +installed = lact-0.9.0-1-x86_64 +installed = lame-3.101.r6531-1-x86_64 +installed = lapack-3.12.1-2-x86_64 +installed = lcms2-2.19.1-1-x86_64 +installed = ldb-2:4.24.3-1-x86_64 +installed = leancrypto-1.7.2-1-x86_64 +installed = level-zero-loader-1.28.2-1-x86_64 +installed = lib32-alsa-lib-1.2.16.1-1-x86_64 +installed = lib32-alsa-plugins-1.2.12-1-x86_64 +installed = lib32-brotli-1.1.0-1-x86_64 +installed = lib32-bzip2-1.0.8-4-x86_64 +installed = lib32-curl-8.20.0-7-x86_64 +installed = lib32-dbus-1.16.2-1-x86_64 +installed = lib32-e2fsprogs-1.47.4-1-x86_64 +installed = lib32-expat-2.8.1-1-x86_64 +installed = lib32-fontconfig-2:2.18.1-1-x86_64 +installed = lib32-freetype2-2.14.3-1-x86_64 +installed = lib32-gcc-libs-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = lib32-glib2-2.88.1-1-x86_64 +installed = lib32-glibc-2.43+r22+g8362e8ce10b2-2-x86_64 +installed = lib32-gmp-6.3.0-2-x86_64 +installed = lib32-gnutls-3.8.13-3-x86_64 +installed = lib32-icu-78.3-1-x86_64 +installed = lib32-json-c-0.18-2-x86_64 +installed = lib32-keyutils-1.6.3-4-x86_64 +installed = lib32-krb5-1.22.2-1-x86_64 +installed = lib32-libdisplay-info-0.3.0-1-x86_64 +installed = lib32-libdrm-2.4.134-1-x86_64 +installed = lib32-libelf-0.195-1-x86_64 +installed = lib32-libffi-3.5.2-1-x86_64 +installed = lib32-libgcrypt-1.12.2-1-x86_64 +installed = lib32-libglvnd-1.7.0-1-x86_64 +installed = lib32-libgpg-error-1.61-1-x86_64 +installed = lib32-libidn2-2.3.8-1-x86_64 +installed = lib32-libldap-2.6.13-1-x86_64 +installed = lib32-libnghttp2-1.69.0-1-x86_64 +installed = lib32-libnghttp3-1.16.0-1-x86_64 +installed = lib32-libngtcp2-1.23.0-1-x86_64 +installed = lib32-libnm-1.56.1-1-x86_64 +installed = lib32-libpciaccess-0.19-1-x86_64 +installed = lib32-libpipewire-1:1.6.6-1-x86_64 +installed = lib32-libpng-1.6.58-1-x86_64 +installed = lib32-libpsl-0.21.5-1-x86_64 +installed = lib32-libssh2-1.11.1-1-x86_64 +installed = lib32-libtasn1-4.21.0-1-x86_64 +installed = lib32-libunistring-1.4.2-1-x86_64 +installed = lib32-libva-2.22.0-1-x86_64 +installed = lib32-libx11-1.8.13-1-x86_64 +installed = lib32-libxau-1.0.12-1-x86_64 +installed = lib32-libxcb-1.17.0-1-x86_64 +installed = lib32-libxcrypt-4.5.2-1-x86_64 +installed = lib32-libxcrypt-compat-4.5.2-1-x86_64 +installed = lib32-libxdmcp-1.1.5-1-x86_64 +installed = lib32-libxext-1.3.7-1-x86_64 +installed = lib32-libxfixes-6.0.1-2-x86_64 +installed = lib32-libxinerama-1.1.6-1-x86_64 +installed = lib32-libxml2-2.15.3-1-x86_64 +installed = lib32-libxshmfence-1.3.3-1-x86_64 +installed = lib32-libxss-1.2.5-1-x86_64 +installed = lib32-libxxf86vm-1.1.5-2-x86_64 +installed = lib32-llvm-libs-1:22.1.6-1-x86_64 +installed = lib32-lm_sensors-1:3.6.2-2-x86_64 +installed = lib32-mesa-1:26.1.2-2-x86_64 +installed = lib32-ncurses-6.6-2-x86_64 +installed = lib32-nettle-4.0-2-x86_64 +installed = lib32-nspr-4.39-1-x86_64 +installed = lib32-nss-3.125-1-x86_64 +installed = lib32-openssl-1:3.6.3-1-x86_64 +installed = lib32-p11-kit-0.26.2-1-x86_64 +installed = lib32-pcre2-10.47-1-x86_64 +installed = lib32-pipewire-1:1.6.6-1-x86_64 +installed = lib32-spirv-tools-1:1.4.350.0-1-x86_64 +installed = lib32-sqlite-3.53.2-1-x86_64 +installed = lib32-systemd-260.2-1-x86_64 +installed = lib32-util-linux-2.42.1-1-x86_64 +installed = lib32-vulkan-icd-loader-1.4.350.0-1-x86_64 +installed = lib32-vulkan-mesa-implicit-layers-1:26.1.2-2-x86_64 +installed = lib32-vulkan-radeon-1:26.1.2-2-x86_64 +installed = lib32-wayland-1.25.0-1-x86_64 +installed = lib32-xcb-util-keysyms-0.4.1-2-x86_64 +installed = lib32-xz-5.8.3-1-x86_64 +installed = lib32-zlib-1.3.2-1-x86_64 +installed = lib32-zstd-1.5.7-2-x86_64 +installed = libabw-0.1.4-1-x86_64 +installed = libadwaita-1:1.9.1-1-x86_64 +installed = libaec-1.1.7-1-x86_64 +installed = libaemu-0.1.2-5-x86_64 +installed = libaio-0.3.113-4-x86_64 +installed = libappindicator-12.10.1-1-x86_64 +installed = libarchive-3.8.7-1-x86_64 +installed = libasan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libass-0.17.4-2-x86_64 +installed = libassuan-3.0.0-1-x86_64 +installed = libasyncns-1:0.8+r3+g68cd5af-3-x86_64 +installed = libatasmart-0.19-8-x86_64 +installed = libatomic-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libatomic_ops-7.8.2-2-x86_64 +installed = libavc1394-0.5.4-7-x86_64 +installed = libavif-1.4.2-1-x86_64 +installed = libayatana-appindicator-0.5.94-1-x86_64 +installed = libayatana-indicator-0.9.5-1-x86_64 +installed = libb2-0.98.1-3-x86_64 +installed = libb64-1.2.1-5-x86_64 +installed = libbacktrace-1.0.git1-1-x86_64 +installed = libblockdev-3.5.0-2-x86_64 +installed = libblockdev-crypto-3.5.0-2-x86_64 +installed = libblockdev-fs-3.5.0-2-x86_64 +installed = libblockdev-loop-3.5.0-2-x86_64 +installed = libblockdev-mdraid-3.5.0-2-x86_64 +installed = libblockdev-nvme-3.5.0-2-x86_64 +installed = libblockdev-part-3.5.0-2-x86_64 +installed = libblockdev-smart-3.5.0-2-x86_64 +installed = libblockdev-swap-3.5.0-2-x86_64 +installed = libbluray-1.4.1-1-x86_64 +installed = libbpf-1.7.0-1-x86_64 +installed = libbs2b-3.1.0-10-x86_64 +installed = libbsd-0.12.2-2-x86_64 +installed = libburn-1.5.8-1-x86_64 +installed = libbytesize-2.12-3-x86_64 +installed = libcaca-0.99.beta20-7-x86_64 +installed = libcacard-2.8.1-1-x86_64 +installed = libcanberra-1:0.30+r2+gc0620e4-6-x86_64 +installed = libcap-2.78-1-x86_64 +installed = libcap-ng-0.9.3-1-x86_64 +installed = libcbor-0.14.0-1-x86_64 +installed = libcdio-2.3.0-1-x86_64 +installed = libcdio-paranoia-10.2+2.0.2-2-x86_64 +installed = libcdr-0.1.9-1-x86_64 +installed = libcloudproviders-0.4.0-1-x86_64 +installed = libcmis-0.6.3-1-x86_64 +installed = libcolord-1.4.8-1-x86_64 +installed = libcue-2.3.0-2-x86_64 +installed = libcups-2:2.4.19-1-x86_64 +installed = libcupsfilters-2.1.1-4-x86_64 +installed = libdaemon-0.14-6-x86_64 +installed = libdatrie-0.2.14-1-x86_64 +installed = libdbusmenu-glib-18.10.20180917-1-x86_64 +installed = libdbusmenu-gtk3-18.10.20180917-1-x86_64 +installed = libde265-1.1.1-1-x86_64 +installed = libdecor-0.2.5-1-x86_64 +installed = libdeflate-1.25-1-x86_64 +installed = libdisplay-info-0.3.0-1-x86_64 +installed = libdovi-3.3.2-1-x86_64 +installed = libdrm-2.4.134-1-x86_64 +installed = libdv-1.0.0-12-x86_64 +installed = libdvdnav-7.0.0-1-x86_64 +installed = libdvdread-7.0.1-1-x86_64 +installed = libe-book-0.1.3-20-x86_64 +installed = libebur128-1.2.6-2-x86_64 +installed = libedit-20260512_3.1-1-x86_64 +installed = libei-1.6.0-1-x86_64 +installed = libelf-0.195-1-x86_64 +installed = libepoxy-1.5.10-3-x86_64 +installed = libepubgen-0.1.1-6-x86_64 +installed = libetonyek-0.1.13-2-x86_64 +installed = libevdev-1.13.6-1-x86_64 +installed = libevent-2.1.12-5-x86_64 +installed = libexif-0.6.26-1-x86_64 +installed = libexttextcat-3.4.8-1-x86_64 +installed = libfdk-aac-2.0.3-2-x86_64 +installed = libffi-3.5.2-1-x86_64 +installed = libfontenc-1.1.9-1-x86_64 +installed = libfreeaptx-0.2.2-1-x86_64 +installed = libfreehand-0.1.3-1-x86_64 +installed = libfyaml-0.9.6-2-x86_64 +installed = libgcc-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libgcrypt-1.12.2-1-x86_64 +installed = libgedit-amtk-5.10.0-1-x86_64 +installed = libgedit-gfls-1:0.4.1-1-x86_64 +installed = libgedit-gtksourceview-299.7.0-1-x86_64 +installed = libgedit-tepl-6.14.0-2-x86_64 +installed = libgee-0.20.8-1-x86_64 +installed = libgfortran-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libgirepository-1.86.0-2-x86_64 +installed = libglvnd-1.7.0-3-x86_64 +installed = libgnomekbd-1:3.28.1-2-x86_64 +installed = libgomp-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libgpg-error-1.61-1-x86_64 +installed = libgsf-1.14.58-1-x86_64 +installed = libgudev-238-3-x86_64 +installed = libgweather-4-4.6.0-1-x86_64 +installed = libgxps-0.3.2-5-x86_64 +installed = libhandy-1.8.3-2-x86_64 +installed = libharu-2.4.6-1-x86_64 +installed = libheif-1.23.0-1-x86_64 +installed = libice-1.1.2-1-x86_64 +installed = libidn-1.43-1-x86_64 +installed = libidn2-2.3.8-1-x86_64 +installed = libiec61883-1.2.0-9-x86_64 +installed = libimagequant-4.4.1-2-x86_64 +installed = libimobiledevice-1.4.0-2-x86_64 +installed = libimobiledevice-glue-1.3.2-1-x86_64 +installed = libinih-62-2-x86_64 +installed = libinput-1.31.3-1-x86_64 +installed = libiptcdata-1.0.5-5-x86_64 +installed = libisl-0.27-1-x86_64 +installed = libisoburn-1.5.8.2-1-x86_64 +installed = libisofs-1.5.8.2-1-x86_64 +installed = libixion-0.20.0-7-x86_64 +installed = libjpeg-turbo-3.1.4.1-1-x86_64 +installed = libjxl-0.11.2-2-x86_64 +installed = libksba-1.8.0-1-x86_64 +installed = liblangtag-0.6.8-1-x86_64 +installed = liblc3-1.1.3-2-x86_64 +installed = libldac-2.0.2.3-3-x86_64 +installed = libldap-2.6.13-1-x86_64 +installed = libliftoff-0.5.0-1-x86_64 +installed = liblqr-0.4.3-1-x86_64 +installed = liblsan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libmakepkg-dropins-20-1-any +installed = libmalcontent-0.14.0-4-x86_64 +installed = libmanette-0.2.13-2-x86_64 +installed = libmd-1.2.0-1-x86_64 +installed = libmm-glib-1.24.2-1-x86_64 +installed = libmnl-1.0.5-2-x86_64 +installed = libmodplug-0.8.9.0-7-x86_64 +installed = libmpc-1.4.1-1-x86_64 +installed = libmpdclient-2.23-1-x86_64 +installed = libmspub-0.1.5-1-x86_64 +installed = libmwaw-0.3.22-4-x86_64 +installed = libmysofa-1.3.4-1-x86_64 +installed = libnatpmp-20230423-3-x86_64 +installed = libnautilus-extension-50.2.2-1-x86_64 +installed = libnbd-1.24.2-2-x86_64 +installed = libndp-1.9-1-x86_64 +installed = libnetfilter_conntrack-1.1.1-1-x86_64 +installed = libnewt-0.52.25-2-x86_64 +installed = libnfnetlink-1.0.2-2-x86_64 +installed = libnfs-6.0.2-5-x86_64 +installed = libnftnl-1.3.1-1-x86_64 +installed = libnghttp2-1.69.0-1-x86_64 +installed = libnghttp3-1.16.0-1-x86_64 +installed = libngtcp2-1.23.0-1-x86_64 +installed = libnice-0.1.23-1-x86_64 +installed = libnl-3.12.0-1-x86_64 +installed = libnm-1.56.1-1-x86_64 +installed = libnma-1.10.6-3-x86_64 +installed = libnma-common-1.10.6-3-x86_64 +installed = libnotify-0.8.8-1-x86_64 +installed = libnsl-2.0.1-2-x86_64 +installed = libnumbertext-1.0.11-3-x86_64 +installed = libnvme-1.16.1-3-x86_64 +installed = libobjc-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libodfgen-0.1.8-5-x86_64 +installed = libogg-1.3.6-1-x86_64 +installed = libopenmpt-0.8.7-1-x86_64 +installed = liborcus-0.21.0-6-x86_64 +installed = libosinfo-1.12.0-3-x86_64 +installed = libp11-0.4.18-1-x86_64 +installed = libp11-kit-0.26.2-1-x86_64 +installed = libpagemaker-0.0.4-5-x86_64 +installed = libpaper-2.2.8-1-x86_64 +installed = libpcap-1.10.6-1-x86_64 +installed = libpciaccess-0.19-1-x86_64 +installed = libpeas-1.38.1-1-x86_64 +installed = libpgm-5.3.128-4-x86_64 +installed = libpipewire-1:1.6.6-1-x86_64 +installed = libplacebo-7.360.1-2-x86_64 +installed = libplist-2.7.0-3-x86_64 +installed = libpng-1.6.58-1-x86_64 +installed = libportal-0.9.1-3-x86_64 +installed = libportal-gtk4-0.9.1-3-x86_64 +installed = libppd-2.1.1-2-x86_64 +installed = libproxy-0.5.12-1-x86_64 +installed = libpsl-0.21.5-2-x86_64 +installed = libpulse-17.0+r98+gb096704c0-1-x86_64 +installed = libpwquality-1.4.5-7-x86_64 +installed = libqalculate-5.11.0-1-x86_64 +installed = libquadmath-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libqxp-0.0.3-1-x86_64 +installed = libraqm-0.10.5-1-x86_64 +installed = libraw-0.22.1-1-x86_64 +installed = libraw1394-2.1.2-4-x86_64 +installed = libre-trainsim-bin-0.8-1-x86_64 +installed = libreoffice-fresh-26.2.4-2-x86_64 +installed = librevenge-0.0.5-4-x86_64 +installed = librewolf-bin-1:151.0.4_1-1-x86_64 +installed = librsvg-2:2.62.3-1-x86_64 +installed = librsync-1:2.3.4-2-x86_64 +installed = libsamplerate-0.2.2-3-x86_64 +installed = libsasl-2.1.28-5-x86_64 +installed = libseccomp-2.6.0-1-x86_64 +installed = libsecret-0.21.7-1-x86_64 +installed = libshout-1:2.4.6-5-x86_64 +installed = libsigc++-2.12.2-1-x86_64 +installed = libsigc++-3.0-3.8.1-1-x86_64 +installed = libslirp-4.9.3-1-x86_64 +installed = libsm-1.2.6-1-x86_64 +installed = libsndfile-1.2.2-4-x86_64 +installed = libsodium-1.0.22-1-x86_64 +installed = libsoup3-3.6.6-2-x86_64 +installed = libsoxr-0.1.3-4-x86_64 +installed = libspelling-0.4.10-1-x86_64 +installed = libspnav-1.2-1-x86_64 +installed = libssh-0.12.0-1-x86_64 +installed = libssh2-1.11.1-1-x86_64 +installed = libstaroffice-0.0.7-5-x86_64 +installed = libstdc++-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libstemmer-3.1.1-1-x86_64 +installed = libsysprof-capture-50.0-2-x86_64 +installed = libtasn1-4.21.0-1-x86_64 +installed = libtatsu-1.0.5-1-x86_64 +installed = libteam-1.32-3-x86_64 +installed = libthai-0.1.30-1-x86_64 +installed = libtheora-1.2.0-1-x86_64 +installed = libtiff-4.7.1-2-x86_64 +installed = libtirpc-1.3.7-1-x86_64 +installed = libtommath-1.3.0-2-x86_64 +installed = libtool-2.6.1-1-x86_64 +installed = libtpms-0.10.2-1-x86_64 +installed = libtraceevent-1:1.9.0-1-x86_64 +installed = libtracefs-1.8.3-1-x86_64 +installed = libtsan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libubsan-16.1.1+r12+g301eb08fa2c5-1-x86_64 +installed = libunibreak-7.0-1-x86_64 +installed = libunistring-1.4.2-1-x86_64 +installed = libunwind-1.8.2-1-x86_64 +installed = liburing-2.14-1-x86_64 +installed = libusb-1.0.30-1-x86_64 +installed = libusbmuxd-2.1.1-2-x86_64 +installed = libuv-1.52.1-1-x86_64 +installed = libva-2.23.0-1-x86_64 +installed = libvdpau-1.5-4-x86_64 +installed = libverto-0.3.2-6-x86_64 +installed = libvirt-1:12.4.0-1-x86_64 +installed = libvirt-glib-5.0.0-3-x86_64 +installed = libvirt-python-1:12.4.0-1-x86_64 +installed = libvisio-0.1.11-1-x86_64 +installed = libvorbis-1.3.7-4-x86_64 +installed = libvpl-2.16.0-2-x86_64 +installed = libvpx-1.16.0-3-x86_64 +installed = libwacom-2.19.0-1-x86_64 +installed = libwbclient-2:4.24.3-1-x86_64 +installed = libwebp-1.6.0-2-x86_64 +installed = libwireplumber-0.5.14-1-x86_64 +installed = libwpd-0.10.3-6-x86_64 +installed = libwps-0.4.14-4-x86_64 +installed = libx11-1.8.13-1-x86_64 +installed = libxau-1.0.12-1-x86_64 +installed = libxcb-1.17.0-1-x86_64 +installed = libxcomposite-0.4.7-1-x86_64 +installed = libxcrypt-4.5.2-1-x86_64 +installed = libxcrypt-compat-4.5.2-1-x86_64 +installed = libxcursor-1.2.3-1-x86_64 +installed = libxcvt-0.1.3-1-x86_64 +installed = libxdamage-1.1.7-1-x86_64 +installed = libxdmcp-1.1.5-2-x86_64 +installed = libxdp-1.6.3-1-x86_64 +installed = libxext-1.3.7-1-x86_64 +installed = libxfixes-6.0.2-1-x86_64 +installed = libxfont2-2.0.7-1-x86_64 +installed = libxft-2.3.9-1-x86_64 +installed = libxi-1.8.3-1-x86_64 +installed = libxinerama-1.1.6-1-x86_64 +installed = libxkbcommon-1.13.2-1-x86_64 +installed = libxkbcommon-x11-1.13.2-1-x86_64 +installed = libxkbfile-1.2.0-1-x86_64 +installed = libxklavier-5.4-7-x86_64 +installed = libxml2-2.15.3-1-x86_64 +installed = libxmlb-0.3.27-1-x86_64 +installed = libxrandr-1.5.5-1-x86_64 +installed = libxrender-0.9.12-1-x86_64 +installed = libxshmfence-1.3.3-1-x86_64 +installed = libxslt-1.1.45-2-x86_64 +installed = libxss-1.2.5-1-x86_64 +installed = libxt-1.3.1-1-x86_64 +installed = libxtst-1.2.5-1-x86_64 +installed = libxv-1.0.13-1-x86_64 +installed = libxxf86vm-1.1.7-1-x86_64 +installed = libyaml-0.2.5-3-x86_64 +installed = libyuv-r2426+464c51a03-1-x86_64 +installed = libzip-1.11.4-1-x86_64 +installed = libzmf-0.0.2-20-x86_64 +installed = licenses-20240728-1-any +installed = lilv-0.28.0-1-x86_64 +installed = linux-api-headers-7.1-1-x86_64 +installed = linux-firmware-20260519-1-any +installed = linux-firmware-amdgpu-20260519-1-any +installed = linux-firmware-atheros-20260519-1-any +installed = linux-firmware-broadcom-20260519-1-any +installed = linux-firmware-cirrus-20260519-1-any +installed = linux-firmware-intel-20260519-1-any +installed = linux-firmware-mediatek-20260519-1-any +installed = linux-firmware-nvidia-20260519-1-any +installed = linux-firmware-other-20260519-1-any +installed = linux-firmware-radeon-20260519-1-any +installed = linux-firmware-realtek-20260519-1-any +installed = linux-firmware-whence-20260519-1-any +installed = linux-zen-7.0.12.zen1-1-x86_64 +installed = linux-zen-headers-7.0.12.zen1-1-x86_64 +installed = litehtml0.9-0.9-2-x86_64 +installed = littlenavmap-bin-3.0.18-1-x86_64 +installed = lld-22.1.6-1-x86_64 +installed = llvm-22.1.6-1-x86_64 +installed = llvm-libs-22.1.6-1-x86_64 +installed = lm_sensors-1:3.6.2-1-x86_64 +installed = lmdb-0.9.35-1-x86_64 +installed = localsearch-3.11.1-1-x86_64 +installed = log4cplus-2.1.2-1-x86_64 +installed = loupe-50.0-1-x86_64 +installed = lpsolve-5.5.2.14-1-x86_64 +installed = lsb-release-2.0.r55.a25a4fc-1-any +installed = lsof-4.99.6-1-x86_64 +installed = lua-5.5.0-2-x86_64 +installed = lua54-5.4.8-6-x86_64 +installed = lv2-1.18.10-2-x86_64 +installed = lz4-1:1.10.0-2-x86_64 +installed = lzo-2.10-5-x86_64 +installed = m4-1.4.21-2-x86_64 +installed = mailcap-2.1.54-2-any +installed = make-4.4.1-3-x86_64 +installed = manifold-3.4.1-1-x86_64 +installed = materialx-1.39.4-5-x86_64 +installed = md4c-0.5.3-1-x86_64 +installed = mdadm-4.6-2-x86_64 +installed = mesa-1:26.1.2-2-x86_64 +installed = meson-1.11.1-3-any +installed = mingw-w64-binutils-2.46.0-1-x86_64 +installed = mingw-w64-crt-14.0.0-1-any +installed = mingw-w64-gcc-16.1.0-1-x86_64 +installed = mingw-w64-headers-14.0.0-1-any +installed = mingw-w64-winpthreads-14.0.0-1-any +installed = miniupnpc-2.3.3-3-x86_64 +installed = minizip-1:1.3.2-3-x86_64 +installed = minizip-ng-4.2.1-1-x86_64 +installed = mkinitcpio-41-4-any +installed = mkinitcpio-busybox-1.36.1-1-x86_64 +installed = mobile-broadband-provider-info-20251101-1-any +installed = mpdecimal-4.0.1-3-x86_64 +installed = mpfr-4.2.2-1-x86_64 +installed = mpg123-1.33.5-1-x86_64 +installed = mtdev-1.1.7-1-x86_64 +installed = mtools-1:4.0.49-1-x86_64 +installed = muparser-2.3.5-2-x86_64 +installed = nano-9.0-1-x86_64 +installed = nanobind-2.12.0-3-any +installed = nautilus-50.2.2-1-x86_64 +installed = ncurses-6.6-2-x86_64 +installed = ndctl-84-1-x86_64 +installed = neon-0.37.1-1-x86_64 +installed = nettle-4.0-1-x86_64 +installed = network-manager-applet-1.36.0-2-x86_64 +installed = networkmanager-1.56.1-1-x86_64 +installed = nextcloud-client-2:33.0.5-1-x86_64 +installed = nftables-1:1.1.6-3-x86_64 +installed = ninja-1.13.2-3-x86_64 +installed = niri-26.04-1-x86_64 +installed = nm-connection-editor-1.36.0-2-x86_64 +installed = node-gyp-13.0.0-1-any +installed = nodejs-26.2.0-1-x86_64 +installed = nodejs-nopt-10.0.1-1-any +installed = noto-fonts-emoji-1:2.051-1-any +installed = npm-11.16.0-1-any +installed = npth-1.8-1-x86_64 +installed = nspr-4.39-1-x86_64 +installed = nss-3.125-1-x86_64 +installed = numactl-2.0.19-1-x86_64 +installed = nwg-look-1.1.1-3-x86_64 +installed = obsidian-1.12.7-2-x86_64 +installed = ocl-icd-2.3.4-1-x86_64 +installed = onetbb-2023.0.0-1-x86_64 +installed = oniguruma-6.9.10-1-x86_64 +installed = openal-1.25.2-1-x86_64 +installed = opencolorio-2.5.1-1-x86_64 +installed = opencore-amr-0.1.6-2-x86_64 +installed = openexr-3.4.12-2-x86_64 +installed = openh264-2.6.0-2-x86_64 +installed = openimagedenoise-2.4.1-2-x86_64 +installed = openimageio-3.1.12.1-2-x86_64 +installed = openjpeg2-2.5.4-1-x86_64 +installed = openjph-0.28.1-1-x86_64 +installed = openpgl-0.7.1-1-x86_64 +installed = openpomodoro-0.3.0-2-x86_64 +installed = openshadinglanguage-1.15.3.0-1-x86_64 +installed = openssh-10.3p1-1-x86_64 +installed = openssl-3.6.3-1-x86_64 +installed = opensubdiv-3.7.0-1-x86_64 +installed = openvdb-13.0.0-1-x86_64 +installed = openxr-1.1.60-1-x86_64 +installed = opus-1.6.1-1-x86_64 +installed = orc-0.4.42-1-x86_64 +installed = osinfo-db-20251212-1-any +installed = ostree-2025.7-3-x86_64 +installed = otf-font-awesome-7.2.0-1-any +installed = p11-kit-0.26.2-1-x86_64 +installed = pacman-7.1.0.r9.g54d9411-2-x86_64 +installed = pacman-contrib-1.13.1-1-x86_64 +installed = pacman-mirrorlist-20260610-1-any +installed = pahole-1:1.31-2-x86_64 +installed = pam-1.7.2-2-x86_64 +installed = pambase-20260614-1-any +installed = pango-1:1.57.1-1-x86_64 +installed = pangomm-2.46.4-3-x86_64 +installed = pangomm-2.48-2.56.1-2-x86_64 +installed = papers-50.2-1-x86_64 +installed = papirus-folders-1.14.0-1-any +installed = papirus-icon-theme-20250501-1-any +installed = parallel-20260522-1-any +installed = parted-3.7-1-x86_64 +installed = paru-2.1.0-2-x86_64 +installed = patch-2.8-1-x86_64 +installed = pavucontrol-1:6.2-1-x86_64 +installed = pciutils-3.15.0-1-x86_64 +installed = pcre-8.45-4-x86_64 +installed = pcre2-10.47-1-x86_64 +installed = pcsclite-2.5.1-1-x86_64 +installed = pcsx2-git-2.7.419.r0.ge0566546c6-1-x86_64 +installed = perl-5.42.2-1-x86_64 +installed = perl-error-0.17030-3-any +installed = perl-mailtools-2.22-3-any +installed = perl-timedate-2.35-1-any +installed = pfetch-1.11.0-1-any +installed = phodav-3.0-4-x86_64 +installed = pinentry-1.3.2-2-x86_64 +installed = pipewire-1:1.6.6-1-x86_64 +installed = pipewire-audio-1:1.6.6-1-x86_64 +installed = pipewire-jack-1:1.6.6-1-x86_64 +installed = pipewire-pulse-1:1.6.6-1-x86_64 +installed = pipewire-session-manager-1:1.6.6-1-x86_64 +installed = pixman-0.46.4-1-x86_64 +installed = pkgconf-2.5.1-1-x86_64 +installed = playerctl-2.4.1-5-x86_64 +installed = plutosvg-0.0.8-1-x86_64 +installed = plutovg-git-1.3.3+12.r311.20260606.dd73459-1-x86_64 +installed = polkit-127-3-x86_64 +installed = polkit-gnome-0.105-12-x86_64 +installed = poppler-26.06.0-1-x86_64 +installed = poppler-data-0.4.12-2-any +installed = poppler-glib-26.06.0-1-x86_64 +installed = popt-1.19-2-x86_64 +installed = portaudio-1:19.7.0-4-x86_64 +installed = potrace-1.16-5-x86_64 +installed = pps-tools-1.0.3-2-x86_64 +installed = procps-ng-4.0.6-2-x86_64 +installed = psmisc-23.7-2-x86_64 +installed = ptex-2.5.2-1-x86_64 +installed = pugixml-1.15-3-x86_64 +installed = pyalpm-0.11.1-1-x86_64 +installed = pybind11-3.0.4-1-any +installed = pyside6-6.11.1-1-x86_64 +installed = pystring-1.2.0-1-x86_64 +installed = python-3.14.5-1-x86_64 +installed = python-autocommand-2.2.2-9-any +installed = python-cairo-1.29.0-2-x86_64 +installed = python-certifi-2026.05.20-1-any +installed = python-charset-normalizer-3.4.7-1-x86_64 +installed = python-gobject-3.56.3-1-x86_64 +installed = python-idna-3.18-1-any +installed = python-imageio-2.37.3-1-any +installed = python-imageio-ffmpeg-0.6.0-2-any +installed = python-jaraco.collections-5.1.0-3-any +installed = python-jaraco.context-6.1.2-1-any +installed = python-jaraco.functools-4.1.0-3-any +installed = python-jaraco.text-4.0.0-4-any +installed = python-jinja-1:3.1.6-3-any +installed = python-markupsafe-3.0.3-1-x86_64 +installed = python-more-itertools-11.1.0-1-any +installed = python-numpy-2.4.6-1-x86_64 +installed = python-opengl-3.1.10-3-any +installed = python-packaging-26.2-1-any +installed = python-pillow-12.2.0-1-x86_64 +installed = python-pkg_resources-81.0.0-1-any +installed = python-platformdirs-4.10.0-1-any +installed = python-pyqt6-6.11.0-2-x86_64 +installed = python-pyqt6-sip-13.11.1-1-x86_64 +installed = python-requests-2.34.2-1-any +installed = python-screeninfo-0.8.1-2-any +installed = python-setproctitle-1.3.7-2-x86_64 +installed = python-setuptools-1:82.0.1-1-any +installed = python-tqdm-4.68.2-1-any +installed = python-typing_extensions-4.15.0-3-any +installed = python-urllib3-2.7.0-1-any +installed = python-wheel-0.47.0-1-any +installed = qemu-audio-alsa-11.0.1-1-x86_64 +installed = qemu-audio-dbus-11.0.1-1-x86_64 +installed = qemu-audio-jack-11.0.1-1-x86_64 +installed = qemu-audio-oss-11.0.1-1-x86_64 +installed = qemu-audio-pa-11.0.1-1-x86_64 +installed = qemu-audio-pipewire-11.0.1-1-x86_64 +installed = qemu-audio-sdl-11.0.1-1-x86_64 +installed = qemu-audio-spice-11.0.1-1-x86_64 +installed = qemu-base-11.0.1-1-x86_64 +installed = qemu-block-curl-11.0.1-1-x86_64 +installed = qemu-block-dmg-11.0.1-1-x86_64 +installed = qemu-block-nfs-11.0.1-1-x86_64 +installed = qemu-block-ssh-11.0.1-1-x86_64 +installed = qemu-chardev-spice-11.0.1-1-x86_64 +installed = qemu-common-11.0.1-1-x86_64 +installed = qemu-desktop-11.0.1-1-x86_64 +installed = qemu-hw-display-qxl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-gl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-pci-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-pci-gl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-pci-rutabaga-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-gpu-rutabaga-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-vga-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-vga-gl-11.0.1-1-x86_64 +installed = qemu-hw-display-virtio-vga-rutabaga-11.0.1-1-x86_64 +installed = qemu-hw-uefi-vars-11.0.1-1-x86_64 +installed = qemu-hw-usb-host-11.0.1-1-x86_64 +installed = qemu-hw-usb-redirect-11.0.1-1-x86_64 +installed = qemu-hw-usb-smartcard-11.0.1-1-x86_64 +installed = qemu-img-11.0.1-1-x86_64 +installed = qemu-system-x86-11.0.1-1-x86_64 +installed = qemu-system-x86-firmware-11.0.1-1-x86_64 +installed = qemu-ui-curses-11.0.1-1-x86_64 +installed = qemu-ui-dbus-11.0.1-1-x86_64 +installed = qemu-ui-egl-headless-11.0.1-1-x86_64 +installed = qemu-ui-gtk-11.0.1-1-x86_64 +installed = qemu-ui-opengl-11.0.1-1-x86_64 +installed = qemu-ui-sdl-11.0.1-1-x86_64 +installed = qemu-ui-spice-app-11.0.1-1-x86_64 +installed = qemu-ui-spice-core-11.0.1-1-x86_64 +installed = qemu-vhost-user-gpu-11.0.1-1-x86_64 +installed = qpdf-12.3.2-2-x86_64 +installed = qt5-base-5.15.19+kde+r96-1-x86_64 +installed = qt5-declarative-5.15.19+kde+r23-1-x86_64 +installed = qt5-svg-5.15.19+kde+r5-1-x86_64 +installed = qt5-translations-5.15.19-1-any +installed = qt6-5compat-6.11.1-1-x86_64 +installed = qt6-base-6.11.1-1-x86_64 +installed = qt6-declarative-6.11.1-3-x86_64 +installed = qt6-positioning-6.11.1-1-x86_64 +installed = qt6-shadertools-6.11.1-1-x86_64 +installed = qt6-svg-6.11.1-1-x86_64 +installed = qt6-tools-6.11.1-3-x86_64 +installed = qt6-translations-6.11.1-1-any +installed = qt6-wayland-6.11.1-1-x86_64 +installed = qt6-webchannel-6.11.1-1-x86_64 +installed = qt6-webengine-6.11.1-3-x86_64 +installed = qt6-websockets-6.11.1-1-x86_64 +installed = qtkeychain-qt6-0.16.0-1-x86_64 +installed = rapidyaml-0.11.1-2-x86_64 +installed = raptor-2.0.16-9-x86_64 +installed = rasqal-1:0.9.33-9-x86_64 +installed = rav1e-0.8.1-2-x86_64 +installed = rdma-core-63.0-2-x86_64 +installed = re2-2:2025.11.05-5-x86_64 +installed = readline-8.3.003-1-x86_64 +installed = redland-1:1.0.17-10-x86_64 +installed = reflector-2023-5-any +installed = retroarch-1.22.2-1-x86_64 +installed = rhash-1.4.6-1-x86_64 +installed = ripgrep-15.1.0-4-x86_64 +installed = robin-map-1.4.1-1-x86_64 +installed = rofi-2.0.0-1-x86_64 +installed = rofi-calc-2.5.1-1-x86_64 +installed = rofi-themes-collection-git-1:r28.43ec2f5-1-any +installed = rpcs3-bin-0.0.41.19433-1-x86_64 +installed = rsync-3.4.4-1-x86_64 +installed = rtkit-0.14-1-x86_64 +installed = rubberband-4.0.0-2-x86_64 +installed = run-parts-5.23.2-1-x86_64 +installed = rutabaga-ffi-0.1.75-1-x86_64 +installed = sbc-2.2-1-x86_64 +installed = scdoc-1.11.4-1-x86_64 +installed = scenefx0.4-0.4.1-2-x86_64 +installed = sdbus-cpp-2.3.1-1-x86_64 +installed = sdl2-compat-2.32.70-1-x86_64 +installed = sdl2_image-2.8.12-1-x86_64 +installed = sdl3-3.4.10-1-x86_64 +installed = seabios-1.17.0-2-any +installed = seatd-0.9.3-1-x86_64 +installed = sed-4.10-1-x86_64 +installed = semver-7.8.2-1-any +installed = serd-0.32.10-1-x86_64 +installed = shaderc-2026.2-1-x86_64 +installed = shadow-4.19.4.arch1-1-x86_64 +installed = shared-mime-info-2.4-3-x86_64 +installed = shiboken6-6.11.1-1-x86_64 +installed = signal-desktop-8.14.0-1-x86_64 +installed = simdjson-1:4.6.4-1-x86_64 +installed = slang-2.3.3-4-x86_64 +installed = slurp-1.5.0-2-x86_64 +installed = smbclient-2:4.24.3-1-x86_64 +installed = snappy-1.2.2-3-x86_64 +installed = sndio-1.10.0-1-x86_64 +installed = sord-0.16.22-1-x86_64 +installed = sound-theme-freedesktop-0.8-6-any +installed = source-highlight-3.1.9-18-x86_64 +installed = spandsp-0.0.6-7-x86_64 +installed = spdlog-1.17.0-2-x86_64 +installed = speex-1.2.1-2-x86_64 +installed = speexdsp-1.2.1-2-x86_64 +installed = spice-0.16.0-2-x86_64 +installed = spice-gtk-0.42-5-x86_64 +installed = spice-protocol-0.14.5-1-any +installed = spirv-tools-1:1.4.350.0-1-x86_64 +installed = sqlite-3.53.2-1-x86_64 +installed = sratom-0.6.22-1-x86_64 +installed = srt-1.5.5-1-x86_64 +installed = startup-notification-0.12-9-x86_64 +installed = steam-1.0.0.85-7-x86_64 +installed = steam-devices-1.0.0.85-7-x86_64 +installed = sudo-1.9.17.p2-2-x86_64 +installed = suitesparse-7.12.2-2-x86_64 +installed = svt-av1-4.1.0-1-x86_64 +installed = swaybg-1.2.2-1-x86_64 +installed = swayfx-0.5.3-4-x86_64 +installed = swig-4.4.1-1-x86_64 +installed = swtpm-0.10.1-2-x86_64 +installed = systemd-260.2-2-x86_64 +installed = systemd-libs-260.2-2-x86_64 +installed = systemd-sysvcompat-260.2-2-x86_64 +installed = taglib-2.3-1-x86_64 +installed = talloc-2.4.4-1-x86_64 +installed = tar-1.35-2-x86_64 +installed = tdb-1.4.15-1-x86_64 +installed = tevent-1:0.17.1-2-x86_64 +installed = texinfo-7.3-1-x86_64 +installed = thunderbird-151.0.1-1-x86_64 +installed = thunderbird-gnome-theme-git-r95.c61b897-1-any +installed = thunderbird-i18n-de-151.0.1-1-x86_64 +installed = thunderbird-ublock-origin-1.70.0-1-any +installed = timeshift-25.12.4-1-x86_64 +installed = timeshift-autosnap-0.10.0-1-any +installed = tinysparql-3.11.1-1-x86_64 +installed = tomlplusplus-3.4.0-2-x86_64 +installed = totem-pl-parser-3.26.7-1-x86_64 +installed = tpm2-tss-4.1.3-1-x86_64 +installed = transmission-gtk-4.1.1-1-x86_64 +installed = tslib-1.24-1-x86_64 +installed = ttc-iosevka-34.6.1-1-any +installed = ttc-iosevka-aile-34.6.1-1-any +installed = ttc-iosevka-curly-34.6.1-1-any +installed = ttc-iosevka-curly-slab-34.6.1-1-any +installed = ttc-iosevka-etoile-34.6.1-1-any +installed = ttf-iosevka-nerd-3.4.0-2-any +installed = ttf-iosevkaterm-nerd-3.4.0-2-any +installed = ttf-liberation-2.1.5-2-any +installed = ttf-nerd-fonts-symbols-3.4.0-1-any +installed = ttf-nerd-fonts-symbols-common-3.4.0-1-any +installed = twolame-0.4.0-4-x86_64 +installed = tzdata-2026b-1-x86_64 +installed = uchardet-0.0.8-4-x86_64 +installed = udisks2-2.11.1-2-x86_64 +installed = unzip-6.0-23-x86_64 +installed = upower-1.91.2-1-x86_64 +installed = usbredir-0.15.0-1-x86_64 +installed = usbutils-019-1-x86_64 +installed = usd-26.05-3-x86_64 +installed = util-linux-2.42.1-1-x86_64 +installed = util-linux-libs-2.42.1-1-x86_64 +installed = uv-0.11.21-1-x86_64 +installed = v4l-utils-1.32.0-2-x86_64 +installed = vapoursynth-76-1-x86_64 +installed = vde2-2.3.3-8-x86_64 +installed = vid.stab-1.1.1-2-x86_64 +installed = vim-9.2.0653-1-x86_64 +installed = vim-runtime-9.2.0653-1-x86_64 +installed = virglrenderer-1.3.0-2-x86_64 +installed = virt-install-5.1.0-3-any +installed = virt-manager-5.1.0-3-any +installed = virtiofsd-1.13.3-1-x86_64 +installed = vmaf-3.1.0-1-x86_64 +installed = volume_key-0.3.12-12-x86_64 +installed = vte-common-0.84.0-1-x86_64 +installed = vte3-0.84.0-1-x86_64 +installed = vulkan-headers-1:1.4.350.0-1-any +installed = vulkan-icd-loader-1.4.350.0-1-x86_64 +installed = vulkan-mesa-implicit-layers-1:26.1.2-2-x86_64 +installed = vulkan-radeon-1:26.1.2-2-x86_64 +installed = vulkan-tools-1.4.350.0-1-x86_64 +installed = wavpack-5.9.0-1-x86_64 +installed = waybar-0.15.0-2-x86_64 +installed = wayland-1.25.0-1-x86_64 +installed = wayland-protocols-1.49-1-any +installed = waypaper-2.8-1-any +installed = webkit2gtk-4.1-2.52.4-1-x86_64 +installed = webkitgtk-6.0-2.52.4-1-x86_64 +installed = webrtc-audio-processing-1-1.3-5-x86_64 +installed = wget-1.25.0-5-x86_64 +installed = which-2.25-1-x86_64 +installed = wine-11.11-1-x86_64 +installed = winetricks-20260125-2-any +installed = wireplumber-0.5.14-1-x86_64 +installed = wl-clipboard-1:2.3.0-1-x86_64 +installed = wlroots0.19-0.19.3-1-x86_64 +installed = wlroots0.20-0.20.1-1-x86_64 +installed = wlsunset-0.4.0-1-x86_64 +installed = woff2-1.0.2-6-x86_64 +installed = wolfssl-5.9.1-1-x86_64 +installed = wpa_supplicant-2:2.11-5-x86_64 +installed = x264-3:0.165.r3222.b35605a-2-x86_64 +installed = x265-4.1-1-x86_64 +installed = xapp-3.2.2-1-x86_64 +installed = xapp-symbolic-icons-1.1.0-1-any +installed = xcb-imdkit-1.0.9-1-x86_64 +installed = xcb-proto-1.17.0-4-any +installed = xcb-util-0.4.1-2-x86_64 +installed = xcb-util-cursor-0.1.6-1-x86_64 +installed = xcb-util-errors-1.0.1-2-x86_64 +installed = xcb-util-image-0.4.1-3-x86_64 +installed = xcb-util-keysyms-0.4.1-5-x86_64 +installed = xcb-util-renderutil-0.3.10-2-x86_64 +installed = xcb-util-wm-0.4.2-2-x86_64 +installed = xcur2png-0.7.1-9-x86_64 +installed = xdg-dbus-proxy-0.1.7-1-x86_64 +installed = xdg-desktop-portal-1.22.0-1-x86_64 +installed = xdg-desktop-portal-gtk-1.15.3-1-x86_64 +installed = xdg-desktop-portal-hyprland-1.3.12-2-x86_64 +installed = xdg-terminal-exec-0.14.0-1-any +installed = xdg-user-dirs-0.20-1-x86_64 +installed = xdg-user-dirs-gtk-0.16-1-x86_64 +installed = xdg-utils-1.2.1-2-any +installed = xdotool-4.20260303.1-1-x86_64 +installed = xenia-canary-bin-02d2cb5-2-x86_64 +installed = xenia-edge-bin-20260614125312.ce9fb29-1-x86_64 +installed = xkeyboard-config-2.47-1-any +installed = xmlsec-1.3.11-1-x86_64 +installed = xorg-fonts-encodings-1.1.0-2-any +installed = xorg-server-common-21.1.23-1-x86_64 +installed = xorg-setxkbmap-1.3.5-1-x86_64 +installed = xorg-xkbcomp-1.5.0-1-x86_64 +installed = xorg-xprop-1.2.8-1-x86_64 +installed = xorg-xrandr-1.5.4-1-x86_64 +installed = xorg-xwayland-24.1.12-1-x86_64 +installed = xorgproto-2025.1-1-any +installed = xvidcore-1.3.7-3-x86_64 +installed = xxhash-0.8.3-1-x86_64 +installed = xz-5.8.3-1-x86_64 +installed = yaml-cpp-0.9.0-1-x86_64 +installed = yazi-26.5.6-4-x86_64 +installed = zenity-4.2.2-1-x86_64 +installed = zeromq-4.3.5-3-x86_64 +installed = zimg-3.0.6-1-x86_64 +installed = zint-2.16.0-2-x86_64 +installed = zix-0.8.2-1-x86_64 +installed = zlib-1:1.3.2-3-x86_64 +installed = zlib-ng-2.3.3-1-x86_64 +installed = zram-generator-1.2.1-1-x86_64 +installed = zsh-5.9.1-1-x86_64 +installed = zstd-1.5.7-3-x86_64 +installed = zxing-cpp-3.0.2-1-x86_64 diff --git a/packaging/tanin-setup/pkg/tanin-setup/.MTREE b/packaging/tanin-setup/pkg/tanin-setup/.MTREE new file mode 100644 index 0000000000000000000000000000000000000000..7e1d56d13b1ebf1a64f38d80ed8b32f4ca65b531 GIT binary patch literal 381 zcmV-@0fPP?iwFP!000001C^4?ZWBQeMfdrNkyv9_KkCto*&qapK){9%=<2FABVs4= zj2H0rOl&|3gaDgfUDdg#x}NQqqx;o%_GMVU-1*q28y`-SjWF!a@BY?&q@1rd+s%uQ z*Kc25zkBt5Sf;&?fh9;t9ApE-Jbm>sBP1T?Pcb z%#_e1uEegHYCzzSO1tdiY|e;lgVTI`1b$waO~*@MtJC41LffStro;0Uak~4HQjmfV zokFvqYN@BjnZ1HVC>{;C6f0JH&J8?aUImC;Bx_^uYLbd7)bIRt=F$IN^BlVr{jcy( zw|Sm!51XYPclVd|+k_uib+Jt${&F--ir6%!-hsu}KkCM%_7/dev/null || true + cp -a "$src" "$dst" + done < <(find "$SKEL" -type f -print0) +} + +install_session_target() { + [ -f "$UNIT" ] || return 0 + install -Dm644 "$UNIT" "$CFG/systemd/user/tanin-session.target" + systemctl --user daemon-reload 2>/dev/null || true +} + +# Apply the Fuji GTK theme for the current light/dark mode and enable the +# follower service (tanin-libadwaita watch), so the appearance toggle in the +# TANINUX settings retints every GTK3/GTK4 app live. Best-effort. +enable_theme_follower() { + command -v tanin-libadwaita >/dev/null 2>&1 || return 0 + tanin-libadwaita auto 2>/dev/null || true + systemctl --user enable --now tanin-libadwaita.service 2>/dev/null || true +} + +seed_configs +install_session_target +enable_theme_follower + +cat <<'EOF' +TANINUX setup complete. + • configs seeded into ~/.config (eww + niri) + • session target installed (~/.config/systemd/user/tanin-session.target) + • GTK theme applied + follower enabled (tanin-libadwaita.service) + +The shipped niri config already autostarts the session bits: + spawn-at-startup "dbus-update-activation-environment" "--systemd" "--all" + spawn-at-startup "systemctl" "--user" "start" "tanin-session.target" +EOF diff --git a/packaging/tanin-setup/pkg/tanin-setup/usr/share/tanin/tanin-session.target b/packaging/tanin-setup/pkg/tanin-setup/usr/share/tanin/tanin-session.target new file mode 100644 index 0000000..4bb0554 --- /dev/null +++ b/packaging/tanin-setup/pkg/tanin-setup/usr/share/tanin/tanin-session.target @@ -0,0 +1,7 @@ +[Unit] +Description=TANINUX graphical session +# Startet (per Dependency-Request) graphical-session.target, an dem +# xdg-desktop-portal hängt — sonst kann das Portal nicht aktivieren und +# libadwaita-Apps (Nautilus …) bleiben im Hell-Fallback. +Requires=graphical-session.target +After=graphical-session.target diff --git a/packaging/tanin-setup/tanin-setup-0.1.0-1-any.pkg.tar.zst b/packaging/tanin-setup/tanin-setup-0.1.0-1-any.pkg.tar.zst new file mode 100644 index 0000000000000000000000000000000000000000..c48abfcc01499fcbc79b0779c7b9802baba0d3ae GIT binary patch literal 12923 zcmV->GK9@2wJ-eySap*DsvXi`M_}wEX#-+|`23RNmRb}$J?l`eE3dks*UzG9TWdrj z*LHVr@)IGHBDbkWA{c`ZF$~tBZLJYPBy#`u-(mjSCYPoG98($tr3H)yjs?)7tg|@W z{z-qs;Z`%rOJ&2_%J6OqF0a={%(HN9rXAUr6-Kfs>KN8A$Kf=sH1a(0X>87A#NWe2 zA{g&w7)-<7lJRL2VQ;1AQWlQU1K5`&t({nIrg|EW#l4DM$VchFp5;KFk)O&kc3Gz6>+s*xm;6_`}y%R z)HwFmb6nZ(c~dlU&(Py|+unvrSXDXydi}oq)>CLnf4*p z9CKcKtNPZJhB*vl)?`DFV-b$GBF7bi8rIyJ5VP;iK0yfb*t4`#YTmkF-VjqF>{U;3 z=B>xoDgHpxc_I;$L^5maVQuY?)@0($%UEh(*|+_S*Y+8c{bjGl?zV-Jw9cC4o?~^1 zgQ&k|y~eQ!lQ2ud*qgU>>JnyUSUu#;inx`dy6=q-IaI5=-ZWiC57{g8-9H`DFsGsC zkhdJeJy8(3Ay>lOyv|AhP+`c8*I7UeDV^p&u;JT$D@GREiE*%;<9 zW_gZJscOb_jDet^&BqjVZ?(_Bh_sn2NBsHm+m|VQ%@` zo10^A#ix^mxv_}D+`@2T%q+*Tx9(%`VYi_~67G{X2l(5E} z<@Rokp?vDi4<*Ce@(4<|wuE_8JVHwUeELL~vp$@n@nP;Ux1_!_IvfzU zvQO(YK4xi1BkQpUW0t-8A+R~XlDs zxrWiPw(k4|E!?o;I1268?0b2=+9xtgSmSW(C0IoqbIT`K@1__Cdv`a?v1aX`l*8W2 zdpj)h*ju$uyFKhJ&sVPZSg-x8*C0*e+FQ@w=tcH(#V6;U_<7qa7lpDH< zrj{i0bF3}5pJ9cR$77DURiWptF>V}VR=tc_l$+((-}W(Ak#C`uIGF1`3}XFbQB{fMG?K~34?*jrH3hds=3xTT#wbTeKvL%E=)&ant{ zOMa|Qnf2Jytcrw@Q+wrad!fdfvvj^XQ*y!ma57=V!sV93p5@i0y`~+l$!u7|m<8u! z410@8hB1ykZ@K&`yVl!MSIV~?2FjdZ4oOvmAKkQo{G$S9YNrBeEF9+b3AOtKP6H*?IIh3T(BR+*VNO?@K zY#QW|v>3sNNHUDZAa1#)6n+)T%^2={F|+kk{4fl%ZgdGLey&D1K4q9&8aj3oKZqOF zChQ#6w`oe|3)xQ;-3T=AjCdW(9xG+zQ>twR`h8)u)XKLTvXFg~eY)L3Ha>k0Yim#3 zP7>yA?UgdNTN|H7>sa3uUz(!7DQI8Q7`&lvAar%5zBhrBN?~2!Q#o;!xW

SX&WA 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 lEB*cz1TVH>M-aP+bL9N|j>=J{)QUP#f0y+Qy literal 0 HcmV?d00001