Author SHA1 Message Date
alvinlolloandClaude Opus 5.5 0e57df4360 fix(ci): Make the package conflict check actually detect conflicts
Tests / tests (push) Failing after 2m53s
The step ran `pacman -Sp`, which skips conflict checking entirely: it
happily prints URLs for eternalterminal + eternalterminal-client and
exits 0. It also skipped every localrepo package, so the conflict fixed
in f06bfd1 could never have been caught here.

Now the check resolves against a throwaway config that adds [local-aur]
(localrepo/), with a fresh dbpath/root so runner-installed packages
don't mask or fake conflicts, and runs a real `pacman -S`. Conflicts and
broken deps fail in "prepare", before any download; XferCommand is set
to /usr/bin/false after the sync so a clean list stops at the download
instead of fetching the whole ISO. Package availability comes from one
`-Slq` instead of ~400 `-Si` calls.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 11:50:35 +11:00
alvinlolloandClaude Opus 5.5 da26e88147 fix(localrepo): Drop stale packages so update.sh can't re-add them
f06bfd1 and a940d91 removed eternalterminal-client/-server,
illogical-impulse-quickshell-git, meshy-git and pacserve from
packages.x86_64, but their .pkg.tar.zst files stayed in localrepo/ and
in local-aur.db. update.sh appends every localrepo package name back to
the list, which would bring the eternalterminal conflict back, and CI
shipped the conflicting packages into the image's /opt/localrepo.

Remove the files and their repo DB entries, re-sort the vulkan-* lines
in packages.x86_64, and drop the names from README.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 11:39:06 +11:00
alvinlollo f06bfd1512 fix(ci): Remove conflicting packages
Tests / tests (push) Successful in 4m36s
2026-10-08 21:44:54 +11:00
alvinlollo a940d91794 fix(ci): Fix end4 dependecies
Tests / tests (push) Successful in 4m35s
2026-10-08 20:53:54 +11:00
alvinlollo 9af4bc6c27 fix(tests): Fix yamlint compliance with whitespace
Tests / tests (push) Successful in 4m31s
2026-10-08 19:01:25 +11:00
alvinlollo 3c540f8bed fix(test): Fix yaml formatting
Tests / tests (push) Failing after 24s
2026-10-08 18:55:27 +11:00
alvinlollo 3f3bba05f3 fix(test): Fix formatting
Tests / tests (push) Failing after 25s
2026-10-08 18:53:51 +11:00
alvinlollo 01913f7682 feat(jobs): Output conflicting packages
Tests / tests (push) Failing after 2m24s
2026-10-08 18:46:47 +11:00
alvinlollo f9a2978517 Update MicroTeX submodule pointer
Tests / tests (push) Failing after 2m30s
2026-10-08 18:35:41 +11:00
alvinlollo 1e8a1e3282 fix(ci): Update Qt version to latest
Upstream pin check / quickshell-pin (push) Successful in 46s
Tests / tests (push) Failing after 2m54s
2026-10-08 18:19:34 +11:00
alvinlollo db83549996 feat(gum): Add further additions of gum to install script
Tests / tests (push) Successful in 2m29s
2026-10-08 14:48:20 +11:00
alvinlollo 59d82f06f5 feat(installer): sshd opt-in, gsettings replay, live-medium motd stamp
Tests / tests (push) Successful in 2m50s
- alvin-install: new sshd screen (default on) + install step. openssh is
  guaranteed into the pacstrap list when requested, and the final banner
  reports whether the enable actually succeeded (SSHD_APPLIED) instead of
  what was selected. The prompt warns that password login uses the same
  password as LUKS, and only mentions the GitHub key import when a
  username was given.
- alvin-install: replay the `gsettings set` commands end-4 logged during
  its setup run with a clean env and a throwaway session bus as the target
  user, then read each key back in a second session to confirm it persisted
  (gvariant_unescape normalizes both '...' and "..." GVariant output). The
  venv check now walks the uv bin/python symlink chain, re-rooting
  absolute hops under $TARGET, since that link dangles on the live medium.
- build: append the build stamp to the live /etc/motd (keeps the installed
  system's motd untouched) and drop alvin-install's install_motd step.
- docs: installer sections in README/AGENTS.md, sshd notes, corrected line
  counts.
2026-10-07 21:55:30 +11:00
152 changed files with 16481 additions and 151 deletions
+26
View File
@@ -0,0 +1,26 @@
name: Upstream pin check
on:
schedule:
- cron: "0 6 * * 1" # Mondays 06:00 UTC — catches upstream/Qt drift between ISO builds
workflow_dispatch:
push:
paths:
- "localrepo/end4-pkgbuilds/quickshell-git/PKGBUILD"
- "localrepo/check-quickshell-pin.sh"
- "airootfs/root/customize_airootfs.sh"
- ".gitea/workflows/pin-check.yaml"
jobs:
quickshell-pin:
runs-on: archlinux
steps:
- name: Checkout repo
uses: actions/checkout@v4
# Tripwire for the failure mode that broke ISO build run 137:
# a quickshell pin (ours or end-4's) that predates a Qt compat fix
# or has simply gone stale. Fails the job so the drift is visible
# in Actions instead of surfacing as a 3-hour ISO build failure.
- name: Check quickshell pins
run: ./localrepo/check-quickshell-pin.sh
+48 -8
View File
@@ -309,23 +309,63 @@ jobs:
echo " Checking for conflicting packages in packages.x86_64" echo " Checking for conflicting packages in packages.x86_64"
echo "═══════════════════════════════════════════════════════════════" echo "═══════════════════════════════════════════════════════════════"
# Collect all package names from the list # Resolve against the repos mkarchiso sees, including [local-aur]
# (localrepo/), so conflicts between pre-built AUR packages and
# anything else are caught here instead of in the ISO build.
# A fresh dbpath = empty local db, like pacstrap's target root:
# packages installed on the runner can neither mask a conflict
# nor cause a false one.
CONF=$(mktemp)
DB=$(mktemp -d)
ROOT=$(mktemp -d)
cp /etc/pacman.conf "$CONF"
printf '\n[local-aur]\nSigLevel = Optional TrustAll\nServer = file://%s/localrepo\n' \
"$PWD" >> "$CONF"
mkdir -p "$DB/sync"
cp -p /var/lib/pacman/sync/*.db "$DB/sync/"
pac() { pacman --config "$CONF" --dbpath "$DB" "$@"; }
pac -Sy --noconfirm
# From here on never download (set after -Sy, which needs to fetch
# the file:// local-aur db): the check only needs a prepared
# transaction
sed -i '/^\[options\]/a XferCommand = /usr/bin/false %u' "$CONF"
# Packages built at ISO build time (build-end4-deps.sh) can't be
# resolved yet; everything else must be
mapfile -t AVAIL < <(pac -Slq | sort -u)
PKGS=() PKGS=()
while IFS= read -r pkg; do while IFS= read -r pkg; do
[[ -z "$pkg" || "$pkg" =~ ^# ]] && continue [[ -z "$pkg" || "$pkg" =~ ^# ]] && continue
if printf '%s\n' "${AVAIL[@]}" | grep -qxF -- "$pkg"; then
PKGS+=("$pkg") PKGS+=("$pkg")
else
echo "⚠️ Skipping unresolvable package: $pkg"
fi
done < packages.x86_64 done < packages.x86_64
# Use pacman -Sp --print to resolve the full install set and check for conflicts # `pacman -Sp` skips conflict checks entirely, so run a real -S
# This catches "X and Y are in conflict" errors before the ISO build # into an empty root. Conflicts and broken deps fail in "prepare",
PKG_LIST=$(printf '%s\n' "${PKGS[@]}") # before any download; a clean list gets as far as the download,
if CONFLICTS=$(echo "$PKG_LIST" | pacman -Sp --needed - 2>&1); then # which the XferCommand above makes fail on purpose.
echo "✅ No package conflicts detected" if [ ${#PKGS[@]} -eq 0 ]; then
echo "✅ No resolvable packages to check."
else else
echo "$CONFLICTS" | grep -i "conflict" || true OUT=$(pac -S --noconfirm --root "$ROOT" --cachedir "$ROOT" "${PKGS[@]}" 2>&1)
if grep -q 'failed to prepare transaction' <<< "$OUT"; then
echo "------- Pacman Output -------"
grep -vE '^(http|file|ftp)' <<< "$OUT" | tail -40
echo "-----------------------------"
echo "" echo ""
echo "═══════════════════════════════════════════════════════════════" echo "═══════════════════════════════════════════════════════════════"
echo " ❌ Conflicting packages found — fix packages.x86_64" echo " ❌ Conflicting/unresolvable packages — fix packages.x86_64"
echo "═══════════════════════════════════════════════════════════════" echo "═══════════════════════════════════════════════════════════════"
exit 1 exit 1
elif ! grep -q 'Proceed with installation' <<< "$OUT"; then
echo "------- Pacman Output -------"
tail -40 <<< "$OUT"
echo "-----------------------------"
echo "❌ pacman stopped before the conflict check completed"
exit 1
fi
echo "✅ No package conflicts detected (repos + local-aur)"
fi fi
+43 -3
View File
@@ -54,13 +54,52 @@ install them into the target without the network.
| `bootstrap_packages` | Minimal build-time packages (`base`, `arch-install-scripts`) | | `bootstrap_packages` | Minimal build-time packages (`base`, `arch-install-scripts`) |
| `airootfs/root/customize_airootfs.sh` | Runs inside chroot during build: keyrings, skel dotfiles (incl. end4-pC), qsConfig patch, end-4 `install-deps`, package harvest, uv/font pre-warm | | `airootfs/root/customize_airootfs.sh` | Runs inside chroot during build: keyrings, skel dotfiles (incl. end4-pC), qsConfig patch, end-4 `install-deps`, package harvest, uv/font pre-warm |
| `airootfs/root/.live-pacman.conf` | `/etc/pacman.conf` of the built image (adds `[local-aur]` = `file:///opt/localrepo`) | | `airootfs/root/.live-pacman.conf` | `/etc/pacman.conf` of the built image (adds `[local-aur]` = `file:///opt/localrepo`) |
| `airootfs/usr/local/bin/alvin-install` | Installer: partitions, pacstrap, LUKS (systemd initramfs **or** experimental unl0kr + optional TPM2 unlock), user, git identity + GitHub SSH keys, login manager (none/greetd/sddm/gdm) + autologin, end-4 dotfiles (`--skip-alldeps`), build-stamp motd, boot | | `airootfs/usr/local/bin/alvin-install` | Installer: partitions, pacstrap, LUKS (systemd initramfs **or** experimental unl0kr + optional TPM2 unlock), user, git identity + GitHub SSH keys, login manager (none/greetd/sddm/gdm) + autologin, optional sshd (default on), end-4 dotfiles (`--skip-alldeps`), boot |
| `localrepo/build-end4-deps.sh` | Non-interactive AUR builds for end-4 dependencies | | `localrepo/build-end4-deps.sh` | Non-interactive AUR builds for end-4 dependencies |
| `localrepo/update.sh` | Regenerates localrepo DB, syncs names to packages.x86_64, syncs `airootfs/opt/localrepo/` | | `localrepo/update.sh` | Regenerates localrepo DB, syncs names to packages.x86_64, syncs `airootfs/opt/localrepo/` |
| `localrepo/check-quickshell-pin.sh` | Tripwire: our quickshell pin and end-4's must include the Qt 6.12 fix and stay <45d old (`QUICKSHELL_PIN_MAX_AGE_DAYS` overrides) |
| `.gitea/workflows/pin-check.yaml` | Runs the pin check weekly (Mon 06:00), on dispatch, and on pushes touching pins/`customize_airootfs.sh` |
## alvin-install (installer inside the ISO)
Source: `airootfs/usr/local/bin/alvin-install` (~1,880 lines, **no `.sh` extension**).
The airootfs overlay ships it as `/usr/local/bin/alvin-install` (mode `0755` forced in
`profiledef.sh` `file_permissions`), and `/etc/motd` advertises it on the live medium.
- **Invoke**: as root from the live session. Hard requirements: `gum` and UEFI —
`check_prereqs` exits if `/sys/firmware/efi` is missing. Log: `/var/log/alvin-install.log`
(copied into the target at the end; `ERR` trap prints the failing line).
- **Structure**: `main()` runs 16 `screen_*` TUI functions (collect answers: welcome, keymap,
network, disk, luks, unl0kr, filesystem, username, password, hostname, git, timezone,
locale, login manager, sshd, summary) then a fixed order of `install_*` steps
(partition → LUKS → format/mount → pacstrap → fstab → repos → timezone → locale →
hostname → network → sshd → user → git/SSH → end-4 dots → mkinitcpio → bootloader →
TPM/unl0kr → login manager → autologin → cleanup). Screens and install steps are
independent — edit one without
touching the other. An `EXIT` trap unmounts `$TARGET` and closes `cryptroot` on any exit.
- **Package list**: `install_pacstrap` builds the *installed* system's list from the medium's
`/run/archiso/bootmnt/arch/pkglist.x86_64.txt` (i.e. `pacman -Q` of the live ISO), so
`packages.x86_64` changes flow into installed systems. It drops `PKGS_EXCLUDE`
(`archiso mkinitcpio-archiso mkinitcpio-nfs-utils syslinux memtest86+`) plus names not
resolvable in the live repos, then always appends hardcoded essentials
(`base linux linux-firmware linux-cachyos networkmanager grub efibootmgr sudo git …`).
- **CI never lints it**: the shellcheck step globs only `*.sh`. Check manually after edits:
`shellcheck -x -s bash airootfs/usr/local/bin/alvin-install`
- end-4 quirks (`--skip-alldeps`, `yes i`, end4-pC re-copy) are in [Gotchas](#gotchas) below.
## Verify a single change locally (mirrors CI)
```bash
shellcheck -x -s bash <script>.sh # plus the alvin-install command above
yamllint -d "{extends: relaxed, rules: {document-start: disable, line-length: disable, new-line-at-end-of-file: disable}}" <file>.yaml
```
`packages.x86_64` syntax: one package per line, `[a-zA-Z0-9._@+\-]+` only, no trailing
whitespace.
## Gotchas ## Gotchas
- The profile root is the **repo root** (not a `releng/` subdirectory). The CI build-iso workflow uses `mkarchiso -v -w work -o out/ releng` but this is a naming convention — the actual profile files live at the repo root. - The profile root is the **repo root** (not a `releng/` subdirectory). CI builds with `mkarchiso -v -w "$PWD/work" -o "$PWD/out" -- "$PWD"` (`.gitea/workflows/build-iso.yaml`), and the local build command above does the same — never pass a `releng` path.
- `customize_airootfs.sh` clones git repos (oh-my-zsh, lazy.nvim, plugins, end-4 dots) into `/etc/skel` and `/opt` during the ISO build. These require network access at build time but make the live ISO work offline. - `customize_airootfs.sh` clones git repos (oh-my-zsh, lazy.nvim, plugins, end-4 dots) into `/etc/skel` and `/opt` during the ISO build. These require network access at build time but make the live ISO work offline.
- `customize_airootfs.sh` runs `./setup install-deps -f -s --skip-plasmaintg` as the throwaway user `ii-builder` (end-4's scripts refuse to run as root) and aborts the build if it fails. `--skip-plasmaintg` is deliberate: that optional Firefox widget pulls 410 packages / 526 MiB of KDE. - `customize_airootfs.sh` runs `./setup install-deps -f -s --skip-plasmaintg` as the throwaway user `ii-builder` (end-4's scripts refuse to run as root) and aborts the build if it fails. `--skip-plasmaintg` is deliberate: that optional Firefox widget pulls 410 packages / 526 MiB of KDE.
- The `[local-aur]` repo path in `pacman.conf` (`file:///home/alvin/alvinarch/localrepo`) is for local builds only. The CI does not use this path. - The `[local-aur]` repo path in `pacman.conf` (`file:///home/alvin/alvinarch/localrepo`) is for local builds only. The CI does not use this path.
@@ -70,6 +109,7 @@ install them into the target without the network.
- **end4-pC** (`pctrade/end4-pC`) is the default quickshell config: cloned into `/etc/skel/.config/quickshell/end4-pC` at build time, selected by patching `hl.env("qsConfig", "ii")` → `"end4-pC"` in the **staged** `/opt/dots-hyprland/dots/.config/hypr/hyprland/variables.lua` (there is no `hypr/hyprland/` in this repo — `./setup install` copies it to the installed system). `alvin-install` re-copies end4-pC into the user's home *after* `./setup install`, because end-4's installer `rsync --delete`s all of `~/.config/quickshell`. - **end4-pC** (`pctrade/end4-pC`) is the default quickshell config: cloned into `/etc/skel/.config/quickshell/end4-pC` at build time, selected by patching `hl.env("qsConfig", "ii")` → `"end4-pC"` in the **staged** `/opt/dots-hyprland/dots/.config/hypr/hyprland/variables.lua` (there is no `hypr/hyprland/` in this repo — `./setup install` copies it to the installed system). `alvin-install` re-copies end4-pC into the user's home *after* `./setup install`, because end-4's installer `rsync --delete`s all of `~/.config/quickshell`.
- `airootfs/etc/skel/.config/illogical-impulse/presets/` carries the user's presets (`Laptop.json`, `Personal-Performance.json`, `Personal-Performance.zip`). They embed `/home/alvin/...` paths, so wallpapers/screenshots need fixing up after install. - `airootfs/etc/skel/.config/illogical-impulse/presets/` carries the user's presets (`Laptop.json`, `Personal-Performance.json`, `Personal-Performance.zip`). They embed `/home/alvin/...` paths, so wallpapers/screenshots need fixing up after install.
- End-4 metapackages are built from `localrepo/end4-pkgbuilds/` (quickshell-git, bibata-modern-classic-bin, microtex-git). - End-4 metapackages are built from `localrepo/end4-pkgbuilds/` (quickshell-git, bibata-modern-classic-bin, microtex-git).
- **quickshell pin / Qt 6.12**: end-4 pins quickshell to `41651d7` (Sep 25), which predates upstream fix `5d5d498` (Oct 3, *"use MOC includes instead of opaque pointer definitions — … Qt 6.12 compatibility"*). Arch shipped qt6 6.12.0 on Oct 8 and the old pin died with `Meta Types must be fully defined` in the moc build of quickshell-hyprland-ipc (failed CI run 137). `customize_airootfs.sh` therefore rewrites end-4's `_commit` to `11ca60be` after cloning — but **only** while it still matches `^_commit='41651d7`, so once end-4 bumps their own pin the guard goes inert and theirs wins. `localrepo/check-quickshell-pin.sh` (weekly `pin-check.yaml` job) fails CI if either pin goes stale or loses the fix; it warns instead of failing when end-4's known-stale pin is covered by the override.
- `packages.x86_64` is sorted alphabetically. Keep it sorted when adding/removing entries. - `packages.x86_64` is sorted alphabetically. Keep it sorted when adding/removing entries.
- `airootfs/opt/localrepo/` is a build artifact (gitignored) — never commit it. - `airootfs/opt/localrepo/` is a build artifact (gitignored) — never commit it.
- **Build stamp flow**: `profiledef.sh` (sourced by mkarchiso) stages the gitignored `airootfs/root/.iso-build-stamp` when a `.git` dir exists **or** `CI`/`GITEA_ACTIONS` is set — line reads `AlvinArch build <date> | commit <date> | <4-char hash>` (falls back to `commit unknown` if `git -c safe.directory` can't read the repo; without `.git`/CI no file is staged). `customize_airootfs.sh` installs it as `/etc/alvin-build-stamp` on the live medium, and `alvin-install`'s `install_motd` copies the live `/etc/motd` banner to the target and appends the stamp. If the medium has no stamp, the installed system gets no motd from us. - **Build stamp flow**: `profiledef.sh` (sourced by mkarchiso) stages the gitignored `airootfs/root/.iso-build-stamp` when a `.git` dir exists **or** `CI`/`GITEA_ACTIONS` is set — line reads `AlvinArch build <date> | commit <date> | <4-char hash>` (falls back to `commit unknown` if `git -c safe.directory` can't read the repo; without `.git`/CI no file is staged). `customize_airootfs.sh` keeps it as `/etc/alvin-build-stamp` on the live medium **and appends it to the live `/etc/motd`**, so the booted ISO identifies its build. The installed system's motd is never touched by us — `alvin-install` has no motd step (an earlier `install_motd` that copied the banner + stamp into the target was removed on purpose).
+68 -8
View File
@@ -21,7 +21,6 @@ AlvinArch/
├── localrepo/ ├── localrepo/
│ ├── build-end4-deps.sh # non-interactive AUR build (all deps) │ ├── build-end4-deps.sh # non-interactive AUR build (all deps)
│ ├── end4-pkgbuilds/ # microtex-git, quickshell-git, bibata │ ├── end4-pkgbuilds/ # microtex-git, quickshell-git, bibata
│ ├── illogical-impulse-quickshell-git-*.pkg.tar.zst
│ ├── illogical-impulse-bibata-modern-classic-bin-*.pkg.tar.zst │ ├── illogical-impulse-bibata-modern-classic-bin-*.pkg.tar.zst
│ └── update.sh # existing, regenerates repo db │ └── update.sh # existing, regenerates repo db
└── packages.x86_64 # 420 packages (65+ end-4 deps added) └── packages.x86_64 # 420 packages (65+ end-4 deps added)
@@ -37,9 +36,10 @@ AlvinArch/
6. [System Services & Networking](#system-services--networking) 6. [System Services & Networking](#system-services--networking)
7. [Local Repository (localrepo/)](#local-repository-localrepo) 7. [Local Repository (localrepo/)](#local-repository-localrepo)
8. [Boot Configuration](#boot-configuration) 8. [Boot Configuration](#boot-configuration)
9. [Build & Test](#build--test) 9. [Automated Installer (alvin-install)](#automated-installer-alvin-install)
10. [Planned Additions](#planned-additions) 10. [Build & Test](#build--test)
11. [Troubleshooting](#troubleshooting) 11. [Planned Additions](#planned-additions)
12. [Troubleshooting](#troubleshooting)
--- ---
@@ -50,7 +50,7 @@ AlvinArch/
### Key Features ### Key Features
- **Hyprland + end-4** — Wayland compositor with illogical-impulse dotfiles (quickshell, bibata cursors, microtex) - **Hyprland + end-4** — Wayland compositor with illogical-impulse dotfiles (quickshell, bibata cursors, microtex)
- **Automated installer (`alvin-install`)** — gum TUI: LUKS with systemd initramfs or experimental touchscreen unl0kr, optional TPM2 auto-unlock, GitHub SSH key import, login manager choice (none/greetd/sddm/gdm), autologin, and a build stamp in `/etc/motd` - **Automated installer (`alvin-install`)** — gum TUI: LUKS with systemd initramfs or experimental touchscreen unl0kr, optional TPM2 auto-unlock, GitHub SSH key import, login manager choice (none/greetd/sddm/gdm), optional sshd (on by default), autologin; the build stamp identifies the live ISO via its `/etc/motd`
- **LazyVim** — Pre-configured Neovim with lazy.nvim and curated plugins - **LazyVim** — Pre-configured Neovim with lazy.nvim and curated plugins
- **Fish + Zsh + Starship** — Dual shell setup with oh-my-zsh and a cross-shell prompt - **Fish + Zsh + Starship** — Dual shell setup with oh-my-zsh and a cross-shell prompt
- **Local AUR repo** — Pre-built packages (end-4 deps, wallust, grub-customizer, etc.) that aren't in official repos - **Local AUR repo** — Pre-built packages (end-4 deps, wallust, grub-customizer, etc.) that aren't in official repos
@@ -138,7 +138,7 @@ AlvinArch/
│ │ └── mkinitcpio.conf.d/ # archiso initramfs config │ │ └── mkinitcpio.conf.d/ # archiso initramfs config
│ ├── usr/ │ ├── usr/
│ │ ├── lib/os-release # usr-merge os-release │ │ ├── lib/os-release # usr-merge os-release
│ │ ├── local/bin/ # choose-mirror, Installation_guide, livecd-sound │ │ ├── local/bin/ # alvin-install, choose-mirror, Installation_guide, livecd-sound
│ │ ├── local/share/livecd-sound/ # ALSA config (asound.conf.in) │ │ ├── local/share/livecd-sound/ # ALSA config (asound.conf.in)
│ │ └── share/pacman/keyrings/ # CachyOS GPG keyring + trust data │ │ └── share/pacman/keyrings/ # CachyOS GPG keyring + trust data
│ └── root/ │ └── root/
@@ -152,7 +152,7 @@ AlvinArch/
│ ├── update.sh # Regenerates repo DB + syncs names to packages.x86_64 │ ├── update.sh # Regenerates repo DB + syncs names to packages.x86_64
│ ├── end4-pkgbuilds/ # PKGBUILDs: quickshell-git, microtex-git, bibata-modern-classic-bin │ ├── end4-pkgbuilds/ # PKGBUILDs: quickshell-git, microtex-git, bibata-modern-classic-bin
│ ├── *.pkg.tar.zst # Pre-built packages (illogical-impulse-*, wallust, grub-customizer, │ ├── *.pkg.tar.zst # Pre-built packages (illogical-impulse-*, wallust, grub-customizer,
│ │ # snapd, upscayl, meshy-git, pacserve, etc.) │ │ # snapd, upscayl, eternalterminal, etc.)
│ └── local-aur.db{,.tar.gz} # Repo database files │ └── local-aur.db{,.tar.gz} # Repo database files
├── efiboot/ # UEFI boot (systemd-boot) ├── efiboot/ # UEFI boot (systemd-boot)
│ └── loader/ │ └── loader/
@@ -285,7 +285,7 @@ Custom PKGBUILDs for end-4 metapackages:
### Pre-built Packages ### Pre-built Packages
Packages like `illogical-impulse-quickshell-git`, `illogical-impulse-bibata-modern-classic-bin`, `wallust`, `grub-customizer`, `snapd`, `upscayl-bin`, `meshy-git`, `xwaylandvideobridge`, `pacserve`, etc. Packages like `illogical-impulse-bibata-modern-classic-bin`, `wallust`, `grub-customizer`, `snapd`, `upscayl-bin`, `xwaylandvideobridge`, `eternalterminal`, etc.
--- ---
@@ -305,6 +305,66 @@ Legacy BIOS boot with custom splash screen. Includes PXE network boot config.
--- ---
## Automated Installer (alvin-install)
The ISO ships an interactive installer at `/usr/local/bin/alvin-install` (source:
`airootfs/usr/local/bin/alvin-install`, ~1,880 lines of bash; the live `/etc/motd`
advertises it). It partitions, encrypts, installs, and fully configures a system —
including the end-4 dotfiles — without network access to this repo.
### Running it
```bash
alvin-install # as root on the live medium (root autologins on tty1)
```
Requirements: **UEFI boot** (it exits if `/sys/firmware/efi` is missing — BIOS/CSM
is not supported by the installer) and `gum`. A network connection is required and
verified by pinging `archlinux.org` before any disk is touched; the network screen
can open `nmtui` for WiFi. Every step is logged to `/var/log/alvin-install.log`,
which is copied into the installed system.
### What it asks (gum TUI screens)
Keymap → network → target disk (the live USB is hidden from the list) → LUKS
encryption (optional; **the LUKS passphrase is the same as your login password**)
→ experimental unl0kr touchscreen unlock → filesystem (`ext4`/`btrfs`) →
username/password/hostname → git identity + GitHub username (both optional) →
timezone/locale → login manager → SSH server (enabled by default) → summary.
### What it does
1. GPT partitioning (1 GiB ESP) on the chosen disk, optional LUKS2 on the rest,
format + mount at `/mnt`
2. `pacstrap` with the package list derived from the medium's
`pkglist.x86_64.txt` (`pacman -Q` of the live ISO) — `archiso`, `syslinux`,
`memtest86+` etc. are dropped, hardcoded essentials (kernel, GRUB,
NetworkManager, cryptsetup, microcode) always appended
3. User account, sudo, git config, GitHub SSH keys (`ssh-import-id`, falling
back to `github.com/<user>.keys`)
4. end-4 dotfiles from the staged `/opt/dots-hyprland` via
`./setup install -f -s --skip-alldeps`
5. Initramfs in one of two modes: **Mode A** — systemd initramfs + `sd-encrypt`
(default); **Mode B** — busybox hooks + unl0kr touchscreen unlock
(experimental, mutually exclusive with TPM2; falls back to Mode A on failure)
6. Optional **TPM2 auto-unlock** (`systemd-cryptenroll`, PCR 0+7; passphrase
slot kept as fallback; warns if Secure Boot is off)
7. GRUB (UEFI, boot entry `ALVIN`), login manager — `none` (plain tty, Hyprland
autostarts), `greetd`+tuigreet, `sddm`, or `gdm` — falls back to `none` only
if the **package** can't be resolved/installed; a failed `systemctl enable`
keeps `getty@tty1` as the login path (the summary still reports the chosen
manager). Optional autologin (forced off when TPM2 is enrolled), and sshd
enabled at boot when selected (default: on) — Arch's stock config allows
**password login with the same password as LUKS**, so only accept the default
on networks you trust (or harden `sshd_config` afterwards). The final banner
reports whether the enable actually succeeded, not just what was selected
On failure an `EXIT` trap unmounts `/mnt` and closes the `cryptroot` mapping, so
re-running is safe. If the end-4 step reports "incomplete", see the repository's
`AGENTS.md` Gotchas for the chroot/systemd limitations that cause it.
---
## Build & Test ## Build & Test
### Building the ISO ### Building the ISO
+21 -1
View File
@@ -28,9 +28,13 @@ install -m 0644 /root/.live-pacman.conf /etc/pacman.conf
rm -f /root/.live-pacman.conf rm -f /root/.live-pacman.conf
# Build stamp staged by profiledef.sh (absent for non-git, non-CI builds): # Build stamp staged by profiledef.sh (absent for non-git, non-CI builds):
# keep it where alvin-install looks for it, drop the staging copy. # keep the stamp file itself as a reference, drop the staging copy, and
# stamp the live medium's motd so the booted ISO identifies its build (the
# installed system keeps the stock package motd - alvin-install never
# writes /etc/motd).
if [[ -f /root/.iso-build-stamp ]]; then if [[ -f /root/.iso-build-stamp ]]; then
install -m 0644 /root/.iso-build-stamp /etc/alvin-build-stamp install -m 0644 /root/.iso-build-stamp /etc/alvin-build-stamp
cat /etc/alvin-build-stamp >> /etc/motd
rm -f /root/.iso-build-stamp rm -f /root/.iso-build-stamp
fi fi
@@ -85,6 +89,22 @@ if [[ ! -d "${DOTS_REPO}/.git" ]]; then
git -C "${DOTS_REPO}" submodule update --init --depth=1 git -C "${DOTS_REPO}" submodule update --init --depth=1
fi fi
# end-4 pins quickshell to 41651d7 (Sep 25), which predates quickshell's
# Qt 6.12 fix (5d5d498, Oct 3: "use MOC includes instead of opaque pointer
# definitions - Fixes linking issues and Qt 6.12 compatibility"). Arch
# shipped qt6 6.12.0 into extra on Oct 8; with the old pin qmetatype.h's
# "Meta Types must be fully defined" static_assert kills the moc build of
# quickshell-hyprland-ipc (failed CI run 137) and the whole ISO build with
# it. Force the fixed commit, but ONLY while end-4 still carries the old
# pin - once they bump it themselves the guard stops matching and their
# pin wins untouched. localrepo/check-quickshell-pin.sh (weekly CI)
# verifies both this pin and end-4's stay Qt 6.12-compatible.
QS_PKG="${DOTS_REPO}/sdata/dist-arch/illogical-impulse-quickshell-git/PKGBUILD"
if [[ -f "${QS_PKG}" ]] && grep -q "^_commit='41651d7" "${QS_PKG}"; then
echo "[customize] Bumping end-4 quickshell pin to 11ca60be (Qt 6.12 fix)..."
sed -i "s|^_commit='41651d7[^']*'|_commit='11ca60be22b063478ed9586ca1d7f92f0f261caf'|" "${QS_PKG}"
fi
# ── end4-pC: the default quickshell config, shipped in skel ────────────────── # ── end4-pC: the default quickshell config, shipped in skel ──────────────────
# pctrade/end4-pC is a fork of the ii shell config. It lives next to ii in # pctrade/end4-pC is a fork of the ii shell config. It lives next to ii in
# ~/.config/quickshell and does not modify it; which one runs is decided by # ~/.config/quickshell and does not modify it; which one runs is decided by
+539 -88
View File
@@ -28,6 +28,11 @@ UNL0KR="false"
TPM_STATUS="" TPM_STATUS=""
LOGIN_MANAGER="none" LOGIN_MANAGER="none"
AUTOLOGIN="" AUTOLOGIN=""
# SSHD is the choice made on the sshd screen; SSHD_APPLIED is only flipped once
# the target's sshd.service has actually been enabled, so the final banner can
# report reality instead of the request.
SSHD="true"
SSHD_APPLIED="false"
TPM_DISCLAIMER="" TPM_DISCLAIMER=""
TARGET_DB_SYNCED="false" TARGET_DB_SYNCED="false"
@@ -43,7 +48,110 @@ cleanup() {
true true
} }
trap cleanup EXIT trap cleanup EXIT
trap 'gum style --foreground 9 --bold "Failed at line $LINENO. See $LOG"' ERR
# ── error surfacing ───────────────────────────────────────────────────────────
# Step output normally ends up in $LOG only. These helpers make sure a failure
# is ALSO shown on screen, paged through `gum pager` so long outputs stay
# inspectable instead of scrolling away or hiding in a file nobody opens.
# Page stdin to the user with a context line. $1 = context. gum is a hard
# prerequisite of this installer (check_prereqs), so its pager is used
# instead of depending on less being present.
page_output() {
local ctx="$1"
if [[ -c /dev/tty && -t 1 ]]; then
{ gum style --foreground 11 --bold "$ctx"; echo ""; cat; } | gum pager || true
else
gum style --foreground 9 --bold "$ctx" || true
cat >&2 || true
fi
}
# Page the last $2 lines (default 200) of $LOG - for output that was already
# redirected there. $1 = context.
page_log_tail() {
[[ -f "$LOG" ]] || return 0
tail -n "${2:-200}" "$LOG" | page_output "$1"
}
# Page the $LOG lines appended after $1 (a line count taken with
# `wc -l < "$LOG"` before the step ran). $2 = context. A mark at or past the
# end of the log means nothing new was written - skip instead of opening a
# pager on an empty screen.
page_log_since() {
local mark="$1" total=0
[[ -f "$LOG" ]] || return 0
total=$(wc -l <"$LOG") || total=0
(( mark < total )) || return 0
sed -n "$((mark + 1)),\$p" "$LOG" | page_output "$2"
}
# Run a command, tee its combined output into $LOG (as the old
# `>>"$LOG" 2>&1` redirects did - live, so an interrupted command keeps its
# partial output) and - on failure - page the lines it added so the error
# reaches the user, not just the log. Returns the command's exit status.
# Usage: run_logged [-s SPINNER [-t TITLE]] "what failed" cmd [args...]
# -s show a gum spinner while cmd runs: dot for linear commands, jump for
# ones that compile. Frames render on stderr (the terminal), never $LOG.
# -t spinner title; omit when an info line already says what is running.
run_logged() {
local ctx="" spinner="" title="" rc=0 mark=0 total=0
while [[ "${1:-}" == -[st] ]]; do
case "$1" in
-s) spinner="$2"; shift 2 ;;
-t) title="$2"; shift 2 ;;
esac
done
ctx="$1"
shift
# Line count before the command, so only ITS output gets paged on failure.
# A missing $LOG (mark 0) is fine: tee creates it, so lines 1..n are
# exactly this command's output.
if [[ -f "$LOG" ]]; then
mark=$(wc -l <"$LOG") || mark=0
fi
# tee appends to $LOG while /dev/null keeps the terminal clean. With
# pipefail the pipeline status is the command's own; the only false
# failure possible is tee itself failing to write (e.g. disk full).
if [[ -n "$spinner" ]]; then
# gum spin propagates the command's exit status; --show-output keeps
# its stdout (the command's output) free of spinner frames for tee,
# while the spinner itself renders on stderr = the terminal. The sh
# wrapper merges the command's stderr into that stdout first, so no
# output bypasses $LOG.
local -a spin=(gum spin --show-output --spinner "$spinner")
if [[ -n "$title" ]]; then
spin+=(--title "$title")
fi
"${spin[@]}" -- sh -c '"$@" 2>&1' sh "$@" \
| tee -a "$LOG" >/dev/null || rc=$?
else
"$@" 2>&1 | tee -a "$LOG" >/dev/null || rc=$?
fi
if (( rc != 0 )); then
if [[ -f "$LOG" ]]; then
total=$(wc -l <"$LOG") || total=0
fi
if (( mark < total )); then
page_log_since "$mark" "${ctx} (exit ${rc}) - output below, full log: $LOG"
else
# Silent failure: nothing to page, but still surface where and why.
gum style --foreground 11 --bold \
"${ctx} (exit ${rc}) - no output captured, full log: $LOG" || true
fi
fi
return "$rc"
}
# ERR trap: a fatal failure aborts the install (errexit) - say where, then
# page the recent log so the actual error is on screen, not log-only.
on_err() {
local rc=$?
trap - ERR
gum style --foreground 9 --bold "Installation failed (exit ${rc}) at line $1. Full log: $LOG" || true
page_log_tail "Last output before the failure - q to quit, scroll for more" 300 || true
}
trap 'on_err "$LINENO"' ERR
(( EUID == 0 )) || { echo "Run as root" >&2; exit 1; } (( EUID == 0 )) || { echo "Run as root" >&2; exit 1; }
@@ -76,6 +184,40 @@ target_owner() {
arch-chroot "$TARGET" sh -c "id -u '$USERNAME' && id -g '$USERNAME'" | paste -sd: arch-chroot "$TARGET" sh -c "id -u '$USERNAME' && id -g '$USERNAME'" | paste -sd:
} }
# `gsettings get` prints GVariant text: '...' normally, "..." when the value
# contains an apostrophe, with \n \t \\ \' \" escapes inside. Reduce that to
# the plain string the original `gsettings set` was called with, so a read-back
# can be compared against the replayed command. One left-to-right pass: doing
# global replacements instead would corrupt sequences like \\n (literal
# backslash + n must not become a newline).
gvariant_unescape() {
local s=$1 out="" i n c
if [[ "$s" == \'*\' || "$s" == \"*\" ]]; then
s=${s:1:${#s}-2}
n=${#s}
for ((i = 0; i < n; i++)); do
c=${s:i:1}
if [[ "$c" == "\\" && $((i + 1)) -lt $n ]]; then
i=$((i + 1))
case "${s:i:1}" in
n) out+=$'\n' ;;
t) out+=$'\t' ;;
r) out+=$'\r' ;;
a) out+=$'\a' ;;
b) out+=$'\b' ;;
f) out+=$'\f' ;;
v) out+=$'\v' ;;
*) out+="${s:i:1}" ;;
esac
else
out+=$c
fi
done
s=$out
fi
printf '%s' "$s"
}
# Refresh the target's package databases once before the first target-side # Refresh the target's package databases once before the first target-side
# pacman/yay call (cachyos is appended to the target's pacman.conf after # pacman/yay call (cachyos is appended to the target's pacman.conf after
# pacstrap, so its db is not there yet; keyrings are re-populated as a # pacstrap, so its db is not there yet; keyrings are re-populated as a
@@ -83,13 +225,14 @@ target_owner() {
sync_target_dbs() { sync_target_dbs() {
[[ "${TARGET_DB_SYNCED}" == "true" ]] && return 0 [[ "${TARGET_DB_SYNCED}" == "true" ]] && return 0
info "Syncing target package databases..." info "Syncing target package databases..."
arch-chroot "$TARGET" pacman-key --populate archlinux cachyos chaotic \ run_logged -s dot "pacman-key --populate failed" \
>>"$LOG" 2>&1 || true arch-chroot "$TARGET" pacman-key --populate archlinux cachyos chaotic || true
if arch-chroot "$TARGET" pacman -Syy --noconfirm >>"$LOG" 2>&1; then if run_logged -s dot "Target pacman -Syy failed" \
arch-chroot "$TARGET" pacman -Syy --noconfirm; then
TARGET_DB_SYNCED="true" TARGET_DB_SYNCED="true"
ok "Target databases synced." ok "Target databases synced."
else else
warn "Target pacman -Syy failed (see $LOG) - continuing with existing databases." warn "Target pacman -Syy failed (output above) - continuing with existing databases."
fi fi
} }
@@ -366,6 +509,35 @@ screen_login_manager() {
log "Login manager: $LOGIN_MANAGER" log "Login manager: $LOGIN_MANAGER"
} }
screen_sshd() {
clear
header "SSH Server"
echo ""
local -a ask_lines=(
"Enable the SSH server (sshd) in the installed system?"
""
" - Starts at boot (systemctl enable sshd)"
" - Arch's default config allows password login, and this password"
" is the same as your LUKS passphrase - enable it only on networks"
" you trust, or harden sshd afterwards (keys-only auth, firewall)."
)
# The GitHub import is optional (screen_git), so only mention it when the
# user actually gave a username - and it happens later, during install.
if [[ -n "$GH_USERNAME" ]]; then
ask_lines+=(" - GitHub SSH keys for ${USERNAME} are imported during install")
fi
gum style --foreground 15 "${ask_lines[@]}"
echo ""
# --default pre-selects the affirmative so Enter accepts the default.
if gum confirm --default --affirmative "Enable sshd" --negative "Skip" \
"Enable the SSH server?"; then
SSHD="true"
else
SSHD="false"
fi
log "SSH server: ${SSHD}"
}
screen_summary() { screen_summary() {
clear clear
header "Installation Summary" header "Installation Summary"
@@ -398,6 +570,7 @@ screen_summary() {
"Locale: ${LOCALE}" \ "Locale: ${LOCALE}" \
"Timezone: ${TIMEZONE}" \ "Timezone: ${TIMEZONE}" \
"Login mgr: ${LOGIN_MANAGER}" \ "Login mgr: ${LOGIN_MANAGER}" \
"SSH server: $([[ "$SSHD" == "true" ]] && echo enabled || echo skipped)" \
"SSH keys: ${ssh_line}" \ "SSH keys: ${ssh_line}" \
"Git: ${git_line}" "Git: ${git_line}"
@@ -483,7 +656,8 @@ install_pacstrap() {
# Parse only the first field, then drop names not resolvable in the live # Parse only the first field, then drop names not resolvable in the live
# session's repos (e.g. local-aur packages are not configured there). # session's repos (e.g. local-aur packages are not configured there).
info "Syncing package databases for resolvability check..." info "Syncing package databases for resolvability check..."
if pacman -Syy --noconfirm >>"$LOG" 2>&1; then if run_logged -s dot "pacman -Syy failed (resolvability check)" \
pacman -Syy --noconfirm; then
declare -A available=() declare -A available=()
local db_line local db_line
while IFS= read -r db_line; do while IFS= read -r db_line; do
@@ -491,7 +665,7 @@ install_pacstrap() {
done < <(pacman -Slq 2>>"$LOG" || true) done < <(pacman -Slq 2>>"$LOG" || true)
(( ${#available[@]} > 0 )) && filter_ok=true (( ${#available[@]} > 0 )) && filter_ok=true
else else
warn "pacman -Syy failed (see $LOG) — installing without resolvability filter." warn "pacman -Syy failed (output above) — installing without resolvability filter."
fi fi
local line pkg local line pkg
@@ -528,9 +702,22 @@ install_pacstrap() {
$found || pkgs+=("$p") $found || pkgs+=("$p")
done done
info "Installing ${#pkgs[@]} packages (this may take a while)..." # sshd was requested but openssh is not in the medium's pkglist (or was
# filtered out above) — without this, install_sshd's enable would fail.
if [[ "$SSHD" == "true" ]]; then
local found_ssh=false
for existing in "${pkgs[@]+"${pkgs[@]}"}"; do
[[ "$existing" == "openssh" ]] && found_ssh=true && break
done
$found_ssh || pkgs+=(openssh)
log "Pacstrap: openssh guaranteed in package list (sshd requested)"
fi
log "Pacstrap: ${#pkgs[@]} packages, ${#dropped[@]} skipped" log "Pacstrap: ${#pkgs[@]} packages, ${#dropped[@]} skipped"
pacstrap "$TARGET" "${pkgs[@]}" --noconfirm 2>>"$LOG" run_logged -s dot -t "Installing ${#pkgs[@]} packages (this may take a while)" \
"pacstrap failed" \
pacstrap "$TARGET" "${pkgs[@]}" --noconfirm \
|| die "pacstrap failed - the target system is incomplete (output above, full log: $LOG)."
ok "Packages installed." ok "Packages installed."
} }
@@ -607,6 +794,26 @@ install_network() {
ok "NetworkManager enabled." ok "NetworkManager enabled."
} }
install_sshd() {
[[ "$SSHD" != "true" ]] && return 0
info "Enabling SSH server..."
if [[ ! -x "${TARGET}/usr/bin/sshd" ]]; then
warn "openssh is missing from the target - cannot enable sshd."
log "SSH server: enable skipped (sshd binary missing in target)"
return 0
fi
if run_logged "Could not enable sshd.service" \
arch-chroot "$TARGET" systemctl enable sshd.service; then
SSHD_APPLIED="true"
log "SSH server: enabled"
ok "sshd enabled (starts at boot)."
else
warn "Could not enable sshd.service (output above)."
log "SSH server: enable failed"
fi
}
install_user() { install_user() {
info "Creating user..." info "Creating user..."
@@ -633,12 +840,14 @@ install_git_ssh() {
if [[ -n "$GIT_EMAIL" ]]; then if [[ -n "$GIT_EMAIL" ]]; then
info "Configuring git..." info "Configuring git..."
local git_name="${GIT_NAME:-$USERNAME}" local git_name="${GIT_NAME:-$USERNAME}"
run_logged "git config user.name failed" \
arch-chroot "$TARGET" runuser -u "$USERNAME" -- \ arch-chroot "$TARGET" runuser -u "$USERNAME" -- \
git config --global user.name "$git_name" >>"$LOG" 2>&1 \ git config --global user.name "$git_name" \
|| warn "git config user.name failed (see $LOG)." || warn "git config user.name failed (output above)."
run_logged "git config user.email failed" \
arch-chroot "$TARGET" runuser -u "$USERNAME" -- \ arch-chroot "$TARGET" runuser -u "$USERNAME" -- \
git config --global user.email "$GIT_EMAIL" >>"$LOG" 2>&1 \ git config --global user.email "$GIT_EMAIL" \
|| warn "git config user.email failed (see $LOG)." || warn "git config user.email failed (output above)."
ok "Git configured for ${USERNAME} (${git_name} <${GIT_EMAIL}>)." ok "Git configured for ${USERNAME} (${git_name} <${GIT_EMAIL}>)."
log "Git: ${git_name} <${GIT_EMAIL}>" log "Git: ${git_name} <${GIT_EMAIL}>"
else else
@@ -676,27 +885,33 @@ install_git_ssh() {
else else
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > "${TARGET}/etc/sudoers.d/99-ssh-import-id" echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > "${TARGET}/etc/sudoers.d/99-ssh-import-id"
chmod 440 "${TARGET}/etc/sudoers.d/99-ssh-import-id" chmod 440 "${TARGET}/etc/sudoers.d/99-ssh-import-id"
run_logged "yay -Ss ssh-import-id found nothing" \
arch-chroot "$TARGET" runuser -u "$USERNAME" -- \ arch-chroot "$TARGET" runuser -u "$USERNAME" -- \
env HOME="$home_in_target" yay -Ss ssh-import-id >>"$LOG" 2>&1 \ env HOME="$home_in_target" yay -Ss ssh-import-id \
|| warn "yay -Ss ssh-import-id found nothing (see $LOG)." || warn "yay -Ss ssh-import-id found nothing (output above)."
if arch-chroot "$TARGET" pacman -S --noconfirm python-distro >>"$LOG" 2>&1 \ if run_logged -s dot -t "Installing ssh-import-id" \
&& arch-chroot "$TARGET" runuser -u "$USERNAME" -- \ "pacman -S python-distro failed" \
env HOME="$home_in_target" yay -S --noconfirm ssh-import-id >>"$LOG" 2>&1; then arch-chroot "$TARGET" pacman -S --noconfirm python-distro \
&& run_logged -s jump -t "Installing ssh-import-id" \
"yay failed to install ssh-import-id" \
arch-chroot "$TARGET" runuser -u "$USERNAME" -- \
env HOME="$home_in_target" yay -S --noconfirm ssh-import-id; then
sid_ok="true" sid_ok="true"
log "ssh-import-id: installed via yay" log "ssh-import-id: installed via yay"
else else
warn "yay could not install ssh-import-id (see $LOG) - falling back to github.com keys." warn "yay could not install ssh-import-id (output above) - falling back to github.com keys."
fi fi
rm -f "${TARGET}/etc/sudoers.d/99-ssh-import-id" rm -f "${TARGET}/etc/sudoers.d/99-ssh-import-id"
fi fi
if [[ "$sid_ok" == "true" ]]; then if [[ "$sid_ok" == "true" ]]; then
if arch-chroot "$TARGET" runuser -u "$USERNAME" -- \ if run_logged "ssh-import-id failed" \
env HOME="$home_in_target" ssh-import-id "gh:${GH_USERNAME}" >>"$LOG" 2>&1; then arch-chroot "$TARGET" runuser -u "$USERNAME" -- \
env HOME="$home_in_target" ssh-import-id "gh:${GH_USERNAME}"; then
ok "SSH keys imported via ssh-import-id." ok "SSH keys imported via ssh-import-id."
log "SSH keys: ssh-import-id gh:${GH_USERNAME}" log "SSH keys: ssh-import-id gh:${GH_USERNAME}"
else else
warn "ssh-import-id failed (see $LOG) - falling back to github.com keys." warn "ssh-import-id failed (output above) - falling back to github.com keys."
sid_ok="false" sid_ok="false"
fi fi
fi fi
@@ -709,6 +924,8 @@ install_git_ssh() {
keys=$(curl -fsSL --max-time 30 "$keys_url" 2>>"$LOG") || curl_rc=$? keys=$(curl -fsSL --max-time 30 "$keys_url" 2>>"$LOG") || curl_rc=$?
if (( curl_rc != 0 )); then if (( curl_rc != 0 )); then
warn "Could not fetch ${keys_url} (curl exit ${curl_rc}) - no SSH keys imported." warn "Could not fetch ${keys_url} (curl exit ${curl_rc}) - no SSH keys imported."
# curl's stderr went to $LOG only - put it in front of the user.
page_log_tail "curl error output (q to quit)" 60 || true
log "SSH keys: curl failed (exit ${curl_rc}) for ${keys_url}" log "SSH keys: curl failed (exit ${curl_rc}) for ${keys_url}"
elif [[ -z "$keys" ]]; then elif [[ -z "$keys" ]]; then
# HTTP 200 with an empty body: the account exists but simply has # HTTP 200 with an empty body: the account exists but simply has
@@ -783,16 +1000,27 @@ install_end4_dots() {
# --skip-alldeps: every dependency was already installed at ISO build time # --skip-alldeps: every dependency was already installed at ISO build time
# (customize_airootfs.sh runs ./setup install-deps), so this only copies # (customize_airootfs.sh runs ./setup install-deps), so this only copies
# configs, sets up services and builds the python venv from the warm cache. # configs, sets up services and builds the python venv from the warm cache.
if ! arch-chroot "$TARGET" runuser -u "$USERNAME" -- \ # Both attempts run under a jump spinner (this step compiles the venv and
# pip bits): --show-output + the sh stderr-merge keep every line flowing
# into $LOG, the frames render on the terminal, and stdin still feeds the
# `yes i` process substitution through to ./setup.
if ! gum spin --show-output --spinner jump -- \
sh -c '"$@" 2>&1' sh \
arch-chroot "$TARGET" runuser -u "$USERNAME" -- \
env HOME="$home_in_target" bash -c \ env HOME="$home_in_target" bash -c \
"cd ${repo_in_target} && ./setup install -f -s --skip-alldeps" \ "cd ${repo_in_target} && ./setup install -f -s --skip-alldeps" \
< <(yes i) >>"$LOG" 2>&1; then < <(yes i) >>"$LOG"; then
warn "end-4 setup failed, retrying files only (see $LOG)." warn "end-4 setup failed, retrying files only (see $LOG)."
setups_done=false setups_done=false
gum spin --show-output --spinner jump -- \
sh -c '"$@" 2>&1' sh \
arch-chroot "$TARGET" runuser -u "$USERNAME" -- \ arch-chroot "$TARGET" runuser -u "$USERNAME" -- \
env HOME="$home_in_target" bash -c \ env HOME="$home_in_target" bash -c \
"cd ${repo_in_target} && ./setup install -f -s --skip-alldeps --skip-allsetups" \ "cd ${repo_in_target} && ./setup install -f -s --skip-alldeps --skip-allsetups" \
< <(yes i) >>"$LOG" 2>&1 || dots_ok=false < <(yes i) >>"$LOG" || dots_ok=false
# Both attempts' output exists only in $LOG - page it so the user can
# inspect what end-4 actually choked on.
page_log_since "$log_mark" "end-4 setup output (both attempts) - q to quit, scroll for more" || true
fi fi
rm -f "${TARGET}/etc/sudoers.d/99-end4-install" rm -f "${TARGET}/etc/sudoers.d/99-end4-install"
@@ -813,8 +1041,9 @@ install_end4_dots() {
fi fi
if [[ -f "${TARGET}/usr/lib/systemd/system/bluetooth.service" ]]; then if [[ -f "${TARGET}/usr/lib/systemd/system/bluetooth.service" ]]; then
arch-chroot "$TARGET" systemctl enable bluetooth.service >>"$LOG" 2>&1 \ run_logged "Could not enable bluetooth.service" \
|| warn "Could not enable bluetooth.service (see $LOG)." arch-chroot "$TARGET" systemctl enable bluetooth.service \
|| warn "Could not enable bluetooth.service (output above)."
fi fi
# `systemctl --user` cannot work in this chroot either: it needs # `systemctl --user` cannot work in this chroot either: it needs
# /run/user/UID/bus, which does not exist until the target boots (it only # /run/user/UID/bus, which does not exist until the target boots (it only
@@ -822,14 +1051,104 @@ install_end4_dots() {
# `enable` would write — the same absolute link systemctl produces. # `enable` would write — the same absolute link systemctl produces.
if [[ -f "${TARGET}/usr/lib/systemd/user/ydotool.service" ]]; then if [[ -f "${TARGET}/usr/lib/systemd/user/ydotool.service" ]]; then
local yd_wants="${TARGET}${home_in_target}/.config/systemd/user/default.target.wants" local yd_wants="${TARGET}${home_in_target}/.config/systemd/user/default.target.wants"
# stderr goes to $LOG so the failure warn below points at something # Capture instead of redirecting: on failure the output is both
# that actually records it (as the bluetooth block does). # appended to $LOG and paged to the user (as the bluetooth block's
if { mkdir -p "$yd_wants" \ # run_logged does), never kept in the log alone.
&& ln -sfn /usr/lib/systemd/user/ydotool.service "$yd_wants/ydotool.service"; } 2>>"$LOG"; then local yd_rc=0 yd_err=""
yd_err=$( { mkdir -p "$yd_wants" \
&& ln -sfn /usr/lib/systemd/user/ydotool.service "$yd_wants/ydotool.service"; } 2>&1 ) \
|| yd_rc=$?
if (( yd_rc == 0 )); then
log "ydotool.service enabled for ${USERNAME} (symlinked in user unit dir)." log "ydotool.service enabled for ${USERNAME} (symlinked in user unit dir)."
else else
warn "Could not enable ydotool.service for ${USERNAME} (see $LOG)." if [[ -n "$yd_err" ]]; then
printf '%s\n' "$yd_err" >>"$LOG"
printf '%s\n' "$yd_err" | page_output "ydotool.service symlink failed (exit ${yd_rc}) - full log: $LOG"
fi fi
warn "Could not enable ydotool.service for ${USERNAME} (output above)."
fi
fi
# end-4's gsettings calls run under its sudo session inside this chroot,
# so dconf sees root's environment (/run/user/0, /root/.local/...) and no
# session bus: every write fails with "failed to commit changes to
# dconf" while gsettings still exits 0 and reports "finished". Replay any
# gsettings set this run logged, with a clean environment and a
# throwaway session bus as the target user. gsettings exits 0 even when
# the commit fails, so read the key back in a second session — only a
# matching value counts as persisted.
if ((log_mark > 0)) \
&& [[ -x "${TARGET}/usr/bin/dbus-run-session" && -x "${TARGET}/usr/bin/gsettings" ]]; then
local gs_line gs_schema gs_key gs_val gs_got gs_norm gs_raw gs_err gs_rc
# Snapshot and parse first (the loop below appends to $LOG), keeping
# log order: a key set twice replays chronologically so the last
# write wins, exactly as end-4 ran it. Dedupe identical repeats only.
local -a gs_cmds=()
mapfile -t gs_cmds < <(
# Same ANSI-strip as the ignored-list parse below; the setup log
# shows each command once as its "Next command" line (the
# "…finished." echoes carry a prefix and never match ^gsettings).
sed -n "$((log_mark + 1)),\$p" "$LOG" | sed $'s/\x1b\\[[0-9;]*m//g' |
sed -n 's/^\(gsettings set .*\)$/\1/p' | awk '!seen[$0]++'
)
log "gsettings replay: ${#gs_cmds[@]} command(s) parsed from log"
# Parsing is coupled to end-4's v() echo format: if upstream changes
# it, the replay silently does nothing and the original dconf failure
# returns - so distinguish "none ran" from "none recognized".
if ((${#gs_cmds[@]} == 0)); then
gs_raw=$(sed -n "$((log_mark + 1)),\$p" "$LOG" | sed $'s/\x1b\\[[0-9;]*m//g' |
grep -c 'gsettings set' || true)
if ((gs_raw > 0)); then
warn "setup log mentions gsettings ${gs_raw}x but none matched the replay parser (format drift?) - see $LOG"
fi
fi
for gs_line in "${gs_cmds[@]}"; do
[[ "$gs_line" =~ ^gsettings\ set\ ([^[:space:]]+)\ ([^[:space:]]+)\ (.+)$ ]] || continue
gs_schema=${BASH_REMATCH[1]}
gs_key=${BASH_REMATCH[2]}
gs_val=${BASH_REMATCH[3]}
# env -i: root's env is exactly what broke dconf; rebuild it for
# the target user with only what gsettings/dbus need.
# gsettings exits 0 even when the commit fails, so both the exit
# status AND the read-back below decide success; its output is
# kept in $LOG and paged on failure.
gs_err=""
gs_rc=0
gs_err=$(arch-chroot "$TARGET" runuser -u "$USERNAME" -- \
env -i HOME="$home_in_target" USER="$USERNAME" LOGNAME="$USERNAME" \
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin \
XDG_CONFIG_HOME="${home_in_target}/.config" \
dbus-run-session -- \
gsettings set "$gs_schema" "$gs_key" "$gs_val" 2>&1) || gs_rc=$?
if [[ -n "$gs_err" ]]; then
printf '%s\n' "$gs_err" >>"$LOG"
fi
if (( gs_rc == 0 )); then
gs_got=$(arch-chroot "$TARGET" runuser -u "$USERNAME" -- \
env -i HOME="$home_in_target" USER="$USERNAME" LOGNAME="$USERNAME" \
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin \
XDG_CONFIG_HOME="${home_in_target}/.config" \
dbus-run-session -- \
gsettings get "$gs_schema" "$gs_key" 2>>"$LOG") || gs_got=""
# Normalize the GVariant read-back: strings come back quoted
# ('...' normally, "..." when the value contains an apostrophe)
# with \n \\ \' \" escapes, bools/ints bare ('true' vs true).
gs_norm=$(gvariant_unescape "$gs_got")
if [[ "$gs_norm" == "$gs_val" ]]; then
log "gsettings persisted: ${gs_schema} ${gs_key} = ${gs_val}"
else
if [[ -n "$gs_err" ]]; then
printf '%s\n' "$gs_err" | page_output "gsettings ${gs_schema} ${gs_key} command output (q to quit) - full log: $LOG"
fi
warn "gsettings ${gs_schema} ${gs_key} did not persist (read back: ${gs_got:-nothing}, see $LOG)."
fi
else
if [[ -n "$gs_err" ]]; then
printf '%s\n' "$gs_err" | page_output "gsettings set failed (exit ${gs_rc}) - output below, full log: $LOG"
fi
warn "Could not replay gsettings ${gs_schema} ${gs_key} (see $LOG)."
fi
done
fi fi
# Everything end-4 answered "i" to. systemctl/gsettings are the lines known # Everything end-4 answered "i" to. systemctl/gsettings are the lines known
@@ -902,8 +1221,24 @@ install_end4_dots() {
if $configs_ok; then if $configs_ok; then
[[ -x "${TARGET}/usr/bin/hyprctl" && -x "${TARGET}/usr/bin/quickshell" ]] \ [[ -x "${TARGET}/usr/bin/hyprctl" && -x "${TARGET}/usr/bin/quickshell" ]] \
|| configs_ok=false || configs_ok=false
[[ -x "${TARGET}${home_in_target}/.local/state/quickshell/.venv/bin/python" ]] \
|| configs_ok=false # uv writes bin/python as an absolute symlink into the chroot
# (/home/.../uv/python/...). Tested verbatim from the live medium
# that link dangles - /home/$USERNAME exists only under $TARGET -
# so walk the chain here and re-root absolute hops under $TARGET
# (relative hops stay inside the venv and need no repointing).
local venv_probe="${TARGET}${home_in_target}/.local/state/quickshell/.venv/bin/python"
local venv_link hops=0
while [[ -L "$venv_probe" && $hops -lt 10 ]]; do
venv_link=$(readlink "$venv_probe")
if [[ "$venv_link" == /* ]]; then
venv_probe="${TARGET}${venv_link}"
else
venv_probe="$(dirname "$venv_probe")/$venv_link"
fi
hops=$((hops + 1))
done
[[ -x "$venv_probe" ]] || configs_ok=false
fi fi
if [[ -d /etc/skel/.config/hypr/custom ]]; then if [[ -d /etc/skel/.config/hypr/custom ]]; then
@@ -1025,20 +1360,96 @@ install_bootloader() {
printf '\nGRUB_DISABLE_BOOTNEXT=true\n' >> "${TARGET}/etc/default/grub" printf '\nGRUB_DISABLE_BOOTNEXT=true\n' >> "${TARGET}/etc/default/grub"
fi fi
# Two installs, both verified - this is the step whose failure strands a
# machine with no bootable firmware entry:
# 1. --removable → writes the removable fallback \EFI\BOOT\BOOTX64.EFI
# to the ESP FIRST, so it exists no matter what the NVRAM step does
# 2. normal → registers the ALVIN entry in the firmware NVRAM
# Some firmwares drop their NVRAM entries over time (the classic
# boot-stranding failure); with the fallback on the ESP the firmware
# still finds GRUB and the machine is never bricked.
# Caveat: the fallback is an unsigned direct copy of grubx64.efi, so it
# only boots with Secure Boot disabled or in setup mode - which booting
# the unsigned Arch ISO already implies. If Secure Boot support is ever
# added, the fallback MUST be shimx64.efi instead - otherwise the
# firmware rejects BOOTX64.EFI.
if ! run_logged -s dot "grub-install (removable fallback) failed" \
arch-chroot "$TARGET" grub-install \ arch-chroot "$TARGET" grub-install \
--target=x86_64-efi --efi-directory=/boot --bootloader-id=ALVIN --target=x86_64-efi --efi-directory=/boot --bootloader-id=ALVIN \
--removable --recheck; then
die "grub-install --removable failed - \\EFI\\BOOT\\BOOTX64.EFI was not written (output above, full log: $LOG)."
fi
# Verify the fallback file really landed: $TARGET/boot IS the ESP mount,
# so this checks the exact file firmware will look for. This is the "is
# there any bootloader at all" gate - it must run before any NVRAM
# failure is allowed to abort the install.
if [[ ! -f "${TARGET}/boot/EFI/BOOT/BOOTX64.EFI" ]]; then
die "Fallback bootloader missing: ${TARGET}/boot/EFI/BOOT/BOOTX64.EFI was not created - this system could be unbootable if the firmware drops its boot entry."
fi
log "Bootloader: removable fallback present (EFI/BOOT/BOOTX64.EFI)"
if ! run_logged -s dot "grub-install (NVRAM boot entry) failed" \
arch-chroot "$TARGET" grub-install \
--target=x86_64-efi --efi-directory=/boot --bootloader-id=ALVIN \
--recheck; then
# grub copies its EFI binaries before it asks efibootmgr to register
# the entry, so "files present + non-zero exit" means only the NVRAM
# registration failed - fall through to the host-side creation below.
if [[ -f "${TARGET}/boot/EFI/ALVIN/grubx64.efi" ]]; then
warn "grub-install could not register the NVRAM entry (output above) - trying from the live medium."
log "Bootloader: grub-install NVRAM registration failed; EFI/ALVIN/grubx64.efi present"
else
# Note the fallback honestly: BOOTX64.EFI exists, but grub.cfg is
# only generated at the END of this function - an install aborted
# here leaves no config, so the fallback alone does NOT boot yet.
die "grub-install failed - EFI/ALVIN/grubx64.efi was not written (output above, full log: $LOG). \\EFI\\BOOT\\BOOTX64.EFI exists, but the install stops before grub-mkconfig runs, so no bootable configuration was written."
fi
fi
# Verify the NVRAM entry persisted. arch-chroot rbinds /sys and mounts
# efivarfs, so grub-install inside the chroot wrote the same variables
# efibootmgr reads here - there is no visibility difference; we verify
# and create on the live medium because that is the direct path to the
# real disk. Create the entry if grub-install could not persist it
# (write-protected or flaky NVRAM), then re-verify. Verification failure
# aborts the install.
local esp_partnum boot_entry
esp_partnum=$(lsblk -no PARTN "$(part 1)" 2>/dev/null | head -n1) || esp_partnum=""
esp_partnum=${esp_partnum:-1}
# Match the loader path, not just the label: a stale ALVIN entry left by
# a previous install on another disk would satisfy a bare label match.
boot_entry=$(efibootmgr -v 2>/dev/null \
| grep -iF '\EFI\ALVIN\grubx64.efi' | head -n1) || boot_entry=""
if [[ -z "$boot_entry" ]]; then
warn "No ALVIN entry in the firmware NVRAM - creating one now."
if ! run_logged "efibootmgr could not create the NVRAM boot entry" \
efibootmgr -c -d "$DISK" -p "$esp_partnum" -L ALVIN \
-l '\EFI\ALVIN\grubx64.efi'; then
die "Could not create the firmware NVRAM boot entry (output above). Refusing to finish: the install stops before grub-mkconfig runs, so \\EFI\\BOOT\\BOOTX64.EFI exists but is not bootable yet. Check UEFI setup (NVRAM write access) and re-run."
fi
boot_entry=$(efibootmgr -v 2>/dev/null \
| grep -iF '\EFI\ALVIN\grubx64.efi' | head -n1) || boot_entry=""
if [[ -z "$boot_entry" ]]; then
die "NVRAM boot entry still missing after efibootmgr -c. Refusing to finish: the install stops before grub-mkconfig runs, so the system is not bootable yet - check UEFI setup and re-run."
fi
fi
log "Bootloader: NVRAM entry verified: ${boot_entry}"
if [[ "$UNL0KR" == "true" ]]; then if [[ "$UNL0KR" == "true" ]]; then
# Mode B: grub.cfg is written in install_unl0kr together with the # Mode B: grub.cfg is written in install_unl0kr together with the
# final initramfs (a config generated now would not match it). # final initramfs (a config generated now would not match it).
log "grub-mkconfig deferred (Mode B, after unl0kr build)" log "grub-mkconfig deferred (Mode B, after unl0kr build)"
ok "Bootloader installed (config finalized after unl0kr)." ok "Bootloader installed (NVRAM entry + fallback verified; config finalized after unl0kr)."
return return
fi fi
arch-chroot "$TARGET" grub-mkconfig -o /boot/grub/grub.cfg if ! run_logged -s dot "grub-mkconfig failed" \
arch-chroot "$TARGET" grub-mkconfig -o /boot/grub/grub.cfg; then
die "grub-mkconfig failed - the installed system would boot into an empty GRUB menu (output above, full log: $LOG)."
fi
ok "Bootloader installed." ok "Bootloader installed (NVRAM entry + removable fallback verified)."
} }
# ── TPM2 auto-unlock ────────────────────────────────────────────────────────── # ── TPM2 auto-unlock ──────────────────────────────────────────────────────────
@@ -1098,8 +1509,16 @@ install_tpm() {
# $PASSWORD (stdin would instead trigger the ask-password agent and block # $PASSWORD (stdin would instead trigger the ask-password agent and block
# until someone typed it on a console). It only adds a keyslot - no # until someone typed it on a console). It only adds a keyslot - no
# --wipe-slot - so the passphrase slot always stays as a fallback. # --wipe-slot - so the passphrase slot always stays as a fallback.
if PASSWORD="$PASS" systemd-cryptenroll --tpm2-device=auto \ # Exported rather than put on the command line (env PASSWORD=...): argv
--tpm2-pcrs=0+7 "$(part 2)" >>"$LOG" 2>&1; then # is world-readable via /proc, the environment is not - and unset right
# after, so the secret exists only for the duration of this call.
export PASSWORD="$PASS"
local cenrc=0
run_logged "systemd-cryptenroll failed" \
systemd-cryptenroll --tpm2-device=auto \
--tpm2-pcrs=0+7 "$(part 2)" || cenrc=$?
unset PASSWORD
if (( cenrc == 0 )); then
TPM_STATUS="enrolled" TPM_STATUS="enrolled"
# Enrolment alone does nothing at boot: systemd-cryptsetup only uses # Enrolment alone does nothing at boot: systemd-cryptsetup only uses
# the TPM2 keyslot when the cmdline asks for it. install_bootloader # the TPM2 keyslot when the cmdline asks for it. install_bootloader
@@ -1109,12 +1528,13 @@ install_tpm() {
local luks_uuid local luks_uuid
luks_uuid=$(blkid -s UUID -o value "$(part 2)") luks_uuid=$(blkid -s UUID -o value "$(part 2)")
write_mode_a_cmdline "$luks_uuid" "rd.luks.options=${luks_uuid}=tpm2-device=auto" write_mode_a_cmdline "$luks_uuid" "rd.luks.options=${luks_uuid}=tpm2-device=auto"
arch-chroot "$TARGET" grub-mkconfig -o /boot/grub/grub.cfg >>"$LOG" 2>&1 \ run_logged -s dot "grub-mkconfig failed (rd.luks.options)" \
|| warn "grub-mkconfig failed after adding rd.luks.options (see $LOG) - TPM2 unlock will not activate at boot." arch-chroot "$TARGET" grub-mkconfig -o /boot/grub/grub.cfg \
|| warn "grub-mkconfig failed after adding rd.luks.options (output above) - TPM2 unlock will not activate at boot."
ok "TPM2 auto-unlock enrolled and activated (rd.luks.options, PCR 0+7)." ok "TPM2 auto-unlock enrolled and activated (rd.luks.options, PCR 0+7)."
else else
TPM_STATUS="failed" TPM_STATUS="failed"
warn "TPM enrollment failed (see $LOG) - passphrase unlock still works." warn "TPM enrollment failed (output above) - passphrase unlock still works."
fi fi
# TPM-only unlock with an unencrypted /boot is weak: anyone with physical # TPM-only unlock with an unencrypted /boot is weak: anyone with physical
@@ -1154,10 +1574,12 @@ unl0kr_fallback_mode_a() {
TPM_STATUS="skipped-unl0kr-fallback" TPM_STATUS="skipped-unl0kr-fallback"
fi fi
arch-chroot "$TARGET" mkinitcpio -P >>"$LOG" 2>&1 \ run_logged -s dot "mkinitcpio -P failed (unl0kr fallback)" \
|| warn "mkinitcpio -P failed during unl0kr fallback (see $LOG)." arch-chroot "$TARGET" mkinitcpio -P \
arch-chroot "$TARGET" grub-mkconfig -o /boot/grub/grub.cfg >>"$LOG" 2>&1 \ || warn "mkinitcpio -P failed during unl0kr fallback (output above)."
|| warn "grub-mkconfig failed during unl0kr fallback (see $LOG)." run_logged -s dot "grub-mkconfig failed (unl0kr fallback)" \
arch-chroot "$TARGET" grub-mkconfig -o /boot/grub/grub.cfg \
|| warn "grub-mkconfig failed during unl0kr fallback (output above)."
warn "The system will ask for the LUKS passphrase at boot - test a reboot before relying on it." warn "The system will ask for the LUKS passphrase at boot - test a reboot before relying on it."
} }
@@ -1173,8 +1595,10 @@ install_unl0kr() {
# yay runs as the new user and needs passwordless sudo for this one call. # yay runs as the new user and needs passwordless sudo for this one call.
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > "${TARGET}/etc/sudoers.d/99-unl0kr-install" echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > "${TARGET}/etc/sudoers.d/99-unl0kr-install"
chmod 440 "${TARGET}/etc/sudoers.d/99-unl0kr-install" chmod 440 "${TARGET}/etc/sudoers.d/99-unl0kr-install"
run_logged -s jump -t "Building unl0kr from the AUR (this may take a while)" \
"yay failed to build/install unl0kr" \
arch-chroot "$TARGET" runuser -u "$USERNAME" -- \ arch-chroot "$TARGET" runuser -u "$USERNAME" -- \
env HOME="$home_in_target" yay -S --noconfirm unl0kr >>"$LOG" 2>&1 || build_rc=$? env HOME="$home_in_target" yay -S --noconfirm unl0kr || build_rc=$?
rm -f "${TARGET}/etc/sudoers.d/99-unl0kr-install" rm -f "${TARGET}/etc/sudoers.d/99-unl0kr-install"
if (( build_rc != 0 )); then if (( build_rc != 0 )); then
@@ -1206,7 +1630,10 @@ install_unl0kr() {
cat "$hook" cat "$hook"
echo "-- install/unl0kr --" echo "-- install/unl0kr --"
cat "$hook_install" cat "$hook_install"
} >>"$LOG" 2>&1 || warn "Could not log the unl0kr hook files (see $LOG)." } >>"$LOG" 2>&1 || {
warn "Could not log the unl0kr hook files (see $LOG)."
page_log_tail "unl0kr hook file output (q to quit)" 40 || true
}
# Touchscreen/input stack for the initramfs: mkinitcpio fails the build # Touchscreen/input stack for the initramfs: mkinitcpio fails the build
# on a MODULES entry it cannot resolve, and -P applies the list to every # on a MODULES entry it cannot resolve, and -P applies the list to every
@@ -1241,12 +1668,14 @@ install_unl0kr() {
fi fi
info "Rebuilding initramfs with unl0kr..." info "Rebuilding initramfs with unl0kr..."
if ! arch-chroot "$TARGET" mkinitcpio -P >>"$LOG" 2>&1; then if ! run_logged -s dot "mkinitcpio -P failed (unl0kr image)" \
arch-chroot "$TARGET" mkinitcpio -P; then
unl0kr_fallback_mode_a "mkinitcpio -P failed" unl0kr_fallback_mode_a "mkinitcpio -P failed"
return 0 return 0
fi fi
# grub.cfg is written now, next to the final image (Mode B deferred it). # grub.cfg is written now, next to the final image (Mode B deferred it).
if ! arch-chroot "$TARGET" grub-mkconfig -o /boot/grub/grub.cfg >>"$LOG" 2>&1; then if ! run_logged -s dot "grub-mkconfig failed (unl0kr image)" \
arch-chroot "$TARGET" grub-mkconfig -o /boot/grub/grub.cfg; then
unl0kr_fallback_mode_a "grub-mkconfig failed" unl0kr_fallback_mode_a "grub-mkconfig failed"
return 0 return 0
fi fi
@@ -1255,6 +1684,7 @@ install_unl0kr() {
# `lsinitcpio -a` prints the hook run order and the included module list. # `lsinitcpio -a` prints the hook run order and the included module list.
local analysis local analysis
if ! analysis=$(lsinitcpio -a "${TARGET}/boot/initramfs-linux.img" 2>>"$LOG"); then if ! analysis=$(lsinitcpio -a "${TARGET}/boot/initramfs-linux.img" 2>>"$LOG"); then
page_log_tail "lsinitcpio error output (q to quit)" 40 || true
unl0kr_fallback_mode_a "lsinitcpio could not read the image" unl0kr_fallback_mode_a "lsinitcpio could not read the image"
return 0 return 0
fi fi
@@ -1385,8 +1815,9 @@ install_login_manager() {
local u local u
for u in greetd sddm gdm; do for u in greetd sddm gdm; do
if [[ -f "${TARGET}/usr/lib/systemd/system/${u}.service" ]]; then if [[ -f "${TARGET}/usr/lib/systemd/system/${u}.service" ]]; then
arch-chroot "$TARGET" systemctl disable "$u.service" >>"$LOG" 2>&1 \ run_logged "Could not disable ${u}.service" \
|| warn "Could not disable ${u}.service (see $LOG)." arch-chroot "$TARGET" systemctl disable "$u.service" \
|| warn "Could not disable ${u}.service (output above)."
fi fi
done done
rm -f "${TARGET}/etc/systemd/system/getty@tty1.service.d/autologin.conf" rm -f "${TARGET}/etc/systemd/system/getty@tty1.service.d/autologin.conf"
@@ -1404,9 +1835,10 @@ install_login_manager() {
install_none_profile install_none_profile
return return
fi fi
if ! arch-chroot "$TARGET" pacman -S --noconfirm greetd greetd-tuigreet \ if ! run_logged -s dot -t "Installing greetd + tuigreet" \
>>"$LOG" 2>&1; then "greetd install failed" \
warn "greetd install failed (see $LOG) - falling back to 'none'." arch-chroot "$TARGET" pacman -S --noconfirm greetd greetd-tuigreet; then
warn "greetd install failed (output above) - falling back to 'none'."
LOGIN_MANAGER="none" LOGIN_MANAGER="none"
install_none_profile install_none_profile
return return
@@ -1414,8 +1846,9 @@ install_login_manager() {
# The package normally provides the greeter account; create it if # The package normally provides the greeter account; create it if
# this version does not (ArchWiki: user = "greeter"). # this version does not (ArchWiki: user = "greeter").
if ! arch-chroot "$TARGET" id greeter >/dev/null 2>&1; then if ! arch-chroot "$TARGET" id greeter >/dev/null 2>&1; then
run_logged "Could not create the greeter user" \
arch-chroot "$TARGET" useradd -r -M -s /usr/bin/nologin greeter \ arch-chroot "$TARGET" useradd -r -M -s /usr/bin/nologin greeter \
>>"$LOG" 2>&1 || warn "Could not create the greeter user (see $LOG)." || warn "Could not create the greeter user (output above)."
fi fi
mkdir -p "${TARGET}/etc/greetd" mkdir -p "${TARGET}/etc/greetd"
cat > "${TARGET}/etc/greetd/config.toml" <<'TOML' cat > "${TARGET}/etc/greetd/config.toml" <<'TOML'
@@ -1426,11 +1859,13 @@ vt = 1
command = "tuigreet --cmd Hyprland" command = "tuigreet --cmd Hyprland"
user = "greeter" user = "greeter"
TOML TOML
if arch-chroot "$TARGET" systemctl enable greetd.service >>"$LOG" 2>&1; then if run_logged "Could not enable greetd.service" \
arch-chroot "$TARGET" systemctl disable getty@tty1.service >>"$LOG" 2>&1 || true arch-chroot "$TARGET" systemctl enable greetd.service; then
run_logged "Could not disable getty@tty1.service" \
arch-chroot "$TARGET" systemctl disable getty@tty1.service || true
ok "greetd + tuigreet enabled (Hyprland)." ok "greetd + tuigreet enabled (Hyprland)."
else else
warn "Could not enable greetd.service (see $LOG) - keeping getty@tty1 as the login path." warn "Could not enable greetd.service (output above) - keeping getty@tty1 as the login path."
fi fi
;; ;;
sddm) sddm)
@@ -1441,18 +1876,22 @@ TOML
install_none_profile install_none_profile
return return
fi fi
if ! arch-chroot "$TARGET" pacman -S --noconfirm sddm >>"$LOG" 2>&1; then if ! run_logged -s dot -t "Installing sddm" \
warn "sddm install failed (see $LOG) - falling back to 'none'." "sddm install failed" \
arch-chroot "$TARGET" pacman -S --noconfirm sddm; then
warn "sddm install failed (output above) - falling back to 'none'."
LOGIN_MANAGER="none" LOGIN_MANAGER="none"
install_none_profile install_none_profile
return return
fi fi
ensure_hyprland_session ensure_hyprland_session
if arch-chroot "$TARGET" systemctl enable sddm.service >>"$LOG" 2>&1; then if run_logged "Could not enable sddm.service" \
arch-chroot "$TARGET" systemctl disable getty@tty1.service >>"$LOG" 2>&1 || true arch-chroot "$TARGET" systemctl enable sddm.service; then
run_logged "Could not disable getty@tty1.service" \
arch-chroot "$TARGET" systemctl disable getty@tty1.service || true
ok "sddm enabled (Hyprland)." ok "sddm enabled (Hyprland)."
else else
warn "Could not enable sddm.service (see $LOG) - keeping getty@tty1 as the login path." warn "Could not enable sddm.service (output above) - keeping getty@tty1 as the login path."
fi fi
;; ;;
gdm) gdm)
@@ -1464,25 +1903,29 @@ TOML
install_none_profile install_none_profile
return return
fi fi
if ! arch-chroot "$TARGET" pacman -S --noconfirm gdm >>"$LOG" 2>&1; then if ! run_logged -s dot -t "Installing gdm" \
warn "gdm install failed (see $LOG) - falling back to 'none'." "gdm install failed" \
arch-chroot "$TARGET" pacman -S --noconfirm gdm; then
warn "gdm install failed (output above) - falling back to 'none'."
LOGIN_MANAGER="none" LOGIN_MANAGER="none"
install_none_profile install_none_profile
return return
fi fi
ensure_hyprland_session ensure_hyprland_session
if arch-chroot "$TARGET" systemctl enable gdm.service >>"$LOG" 2>&1; then if run_logged "Could not enable gdm.service" \
arch-chroot "$TARGET" systemctl disable getty@tty1.service >>"$LOG" 2>&1 || true arch-chroot "$TARGET" systemctl enable gdm.service; then
run_logged "Could not disable getty@tty1.service" \
arch-chroot "$TARGET" systemctl disable getty@tty1.service || true
ok "gdm enabled (Hyprland session)." ok "gdm enabled (Hyprland session)."
else else
warn "Could not enable gdm.service (see $LOG) - keeping getty@tty1 as the login path." warn "Could not enable gdm.service (output above) - keeping getty@tty1 as the login path."
fi fi
;; ;;
*) *)
# none: keep getty on tty1; install_none_profile writes the # none: keep getty on tty1; install_none_profile writes the
# login profile that starts the compositor. # login profile that starts the compositor.
arch-chroot "$TARGET" systemctl enable getty@tty1.service >>"$LOG" 2>&1 \ run_logged "Could not enable getty@tty1.service" \
|| true arch-chroot "$TARGET" systemctl enable getty@tty1.service || true
install_none_profile install_none_profile
;; ;;
esac esac
@@ -1614,21 +2057,7 @@ EOF
ok "Login set: manager=${LOGIN_MANAGER}, autologin=${AUTOLOGIN}." ok "Login set: manager=${LOGIN_MANAGER}, autologin=${AUTOLOGIN}."
} }
# ── Build stamp ─────────────────────────────────────────────────────────────── # ── Cleanup ───────────────────────────────────────────────────────────────────
install_motd() {
# Only stamped media carry a stamp; without one (local non-git build)
# the installed system keeps whatever motd the target packages shipped.
local stamp="/etc/alvin-build-stamp"
if [[ ! -f "$stamp" ]]; then
log "motd: no build stamp on this medium - target motd left as-is"
return 0
fi
cp /etc/motd "${TARGET}/etc/motd" 2>/dev/null || true
cat "$stamp" >> "${TARGET}/etc/motd"
log "motd: appended build stamp: $(tr -d '\n' < "$stamp")"
ok "Build stamp appended to the installed /etc/motd."
}
install_cleanup() { install_cleanup() {
info "Cleaning up..." info "Cleaning up..."
@@ -1637,10 +2066,21 @@ install_cleanup() {
log "Installation complete." log "Installation complete."
ok "Installation complete!" ok "Installation complete!"
echo "" echo ""
# Report what actually happened, not what was asked for: the enable step
# only warns when it cannot work (openssh missing / systemctl failed).
local ssh_state
if [[ "$SSHD" != "true" ]]; then
ssh_state="disabled"
elif [[ "$SSHD_APPLIED" == "true" ]]; then
ssh_state="enabled (starts at boot)"
else
ssh_state="NOT enabled - see ${LOG}"
fi
gum style --foreground 10 --align center \ gum style --foreground 10 --align center \
"Arch Linux installed successfully." \ "Arch Linux installed successfully." \
"" \ "" \
"Login manager: ${LOGIN_MANAGER} Autologin: ${AUTOLOGIN:-disabled}" \ "Login manager: ${LOGIN_MANAGER} Autologin: ${AUTOLOGIN:-disabled}" \
"SSH server: ${ssh_state}" \
"TPM2 auto-unlock: ${TPM_STATUS:-n/a} unl0kr: ${UNL0KR}" "TPM2 auto-unlock: ${TPM_STATUS:-n/a} unl0kr: ${UNL0KR}"
if [[ -n "${TPM_DISCLAIMER}" ]]; then if [[ -n "${TPM_DISCLAIMER}" ]]; then
echo "" echo ""
@@ -1650,6 +2090,16 @@ install_cleanup() {
gum style --foreground 10 --align center \ gum style --foreground 10 --align center \
"Run 'reboot' to boot into your new system." "Run 'reboot' to boot into your new system."
echo "" echo ""
# Debug aid: every failure was already paged at the moment it happened;
# this offers the complete record (all step output) on demand.
if gum confirm --affirmative "View install log" --negative "No thanks" \
"Open the full install log (${LOG})?"; then
gum pager <"$LOG" || true
fi
echo ""
# Last line on screen after the optional log view - the instruction to
# reboot must be the final thing the user reads.
echo "Run 'reboot' to boot into your new system."
} }
# ── Main ────────────────────────────────────────────────────────────────────── # ── Main ──────────────────────────────────────────────────────────────────────
@@ -1671,6 +2121,7 @@ main() {
screen_timezone screen_timezone
screen_locale screen_locale
screen_login_manager screen_login_manager
screen_sshd
screen_summary screen_summary
install_partition install_partition
@@ -1683,6 +2134,7 @@ main() {
install_locale install_locale
install_hostname install_hostname
install_network install_network
install_sshd
install_user install_user
install_git_ssh install_git_ssh
install_end4_dots install_end4_dots
@@ -1692,7 +2144,6 @@ main() {
install_unl0kr install_unl0kr
install_login_manager install_login_manager
install_autologin install_autologin
install_motd
install_cleanup install_cleanup
} }
+184
View File
@@ -0,0 +1,184 @@
#!/usr/bin/env bash
# Verify that every quickshell pin we build against is current enough to
# survive the next Arch Qt update.
#
# Why this exists: CI run 137 (2026-10-08) failed because end-4 pinned
# quickshell to 41651d7 (Sep 25), which predates quickshell's Qt 6.12 fix
# (5d5d498, Oct 3: "use MOC includes instead of opaque pointer definitions
# - Fixes linking issues and Qt 6.12 compatibility"). Arch shipped
# qt6 6.12.0 the next day and the pinned commit stopped compiling
# ("Meta Types must be fully defined"). customize_airootfs.sh papers over
# end-4's stale pin at build time; this script is the tripwire that tells
# us when pins - ours OR end-4's - fall behind again BEFORE a build does.
#
# Checked pins:
# 1. localrepo/end4-pkgbuilds/quickshell-git/PKGBUILD (our own pin)
# 2. end-4/dots-hyprland sdata/dist-arch PKGBUILD (live from GitHub)
#
# Checks per pin:
# - commit exists upstream
# - includes the Qt 6.12 fix (5d5d498)
# - not older than QUICKSHELL_PIN_MAX_AGE_DAYS (default 45)
#
# Exit 1 on any failure so CI (pin-check.yaml) goes red.
#
# Usage: ./localrepo/check-quickshell-pin.sh
set -euo pipefail
QT612_FIX='5d5d49873fe8cf1f99ddfd5006ceb2057c5c9b13'
QS_REPO='https://git.outfoxxed.me/quickshell/quickshell.git'
END4_STALE_PIN='41651d7' # the pin customize_airootfs.sh overrides
END4_PKGBUILD_URL='https://raw.githubusercontent.com/end-4/dots-hyprland/main/sdata/dist-arch/illogical-impulse-quickshell-git/PKGBUILD'
MAX_AGE_DAYS="${QUICKSHELL_PIN_MAX_AGE_DAYS:-45}"
profile_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
LOCAL_PKGBUILD="${profile_dir}/localrepo/end4-pkgbuilds/quickshell-git/PKGBUILD"
FAILED=0
fail() {
echo "❌ $1" >&2
FAILED=1
}
# ── collect pins ────────────────────────────────────────────────────────────
pin_of() { # <file-contents-stdin> -> first _commit='...' value
sed -n "s/^_commit='\([0-9a-f]\{7,40\}\)'.*/\1/p" | head -n1
}
if [[ ! -f "$LOCAL_PKGBUILD" ]]; then
echo "❌ missing ${LOCAL_PKGBUILD}" >&2
exit 1
fi
local_pin=$(pin_of < "$LOCAL_PKGBUILD")
if [[ -z "$local_pin" ]]; then
echo "❌ no _commit= found in ${LOCAL_PKGBUILD}" >&2
exit 1
fi
end4_pin=''
end4_pkgbuild=''
for try in 1 2 3 4 5; do
if end4_pkgbuild=$(curl -fsSL --max-time 30 "$END4_PKGBUILD_URL"); then
end4_pin=$(printf '%s\n' "$end4_pkgbuild" | pin_of)
break
fi
echo " ⏳ fetch of end-4 PKGBUILD failed (try $try/5), retrying in $(( try * 3 ))s..." >&2
sleep $(( try * 3 ))
done
if [[ -z "$end4_pin" ]]; then
fail "could not fetch end-4's quickshell PKGBUILD from GitHub — network or path change?"
echo ""
echo "Result: FAILED"
exit 1
fi
# ── clone quickshell (blobless: commits+trees only, fast) ───────────────────
tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT
cloned=0
for try in 1 2 3; do
if git clone --filter=blob:none --quiet "$QS_REPO" "$tmp/qs" 2>/dev/null; then
cloned=1
break
fi
rm -rf "$tmp/qs"
echo " ⏳ clone of quickshell failed (try $try/3), retrying in $(( try * 5 ))s..." >&2
sleep $(( try * 5 ))
done
if [[ "$cloned" -ne 1 ]]; then
fail "could not clone ${QS_REPO} — network or repo moved?"
echo ""
echo "Result: FAILED"
exit 1
fi
QS="$tmp/qs"
qs_head=$(git -C "$QS" rev-parse HEAD)
qs_head_date=$(git -C "$QS" show -s --format=%cs HEAD)
echo "quickshell upstream master: ${qs_head:0:12} (${qs_head_date})"
echo ""
now=$(date +%s)
# <label> <pin> <mode>: mode "hard" fails on any problem; mode "soft" only
# warns, for pins we don't control (end-4's) — UNLESS the problem is one the
# customize_airootfs.sh override does not cover, which always fails hard
# because it would break the next ISO build.
check_pin() {
local label=$1 pin=$2 mode=$3
local ts age behind bad=0
if ! git -C "$QS" cat-file -e "${pin}^{commit}" 2>/dev/null; then
fail "$label: pin '$pin' does not exist in quickshell upstream"
return
fi
local has_fix=0
if git -C "$QS" merge-base --is-ancestor "$QT612_FIX" "$pin"; then
has_fix=1
fi
ts=$(git -C "$QS" show -s --format=%ct "$pin")
age=$(( (now - ts) / 86400 ))
behind=$(git -C "$QS" rev-list --count "$pin..HEAD")
if [[ "$mode" == "hard" ]]; then
if [[ "$has_fix" -eq 0 ]]; then
fail "$label: pin '$pin' PREDATES the Qt 6.12 fix (${QT612_FIX:0:12}) — will not compile against Qt >= 6.12"
bad=1
fi
if (( age > MAX_AGE_DAYS )); then
fail "$label: pin is $age days old (> ${MAX_AGE_DAYS}d), $behind commit(s) behind upstream master — bump it"
bad=1
fi
if [[ "$bad" -eq 0 ]]; then
echo " ✅ $label: pin ${pin:0:12} includes the Qt 6.12 fix, age ${age}d (${behind} commit(s) behind master)"
fi
return
fi
# soft mode: our build-time override compensates for this pin, so drift is
# a heads-up — it cannot break the ISO build on its own.
if [[ "$has_fix" -eq 0 ]]; then
echo " ⚠️ $label: pin ${pin:0:12} predates the Qt 6.12 fix — covered by the customize_airootfs.sh override, but end-4 should bump it"
else
echo " ✅ $label: pin ${pin:0:12} includes the Qt 6.12 fix"
fi
if (( age > MAX_AGE_DAYS )); then
echo " ⚠️ $label: pin is $age days old (> ${MAX_AGE_DAYS}d), $behind commit(s) behind master — consider bumping (not enforced, we don't own this pin)"
else
echo " ✅ $label: pin age ${age}d (${behind} commit(s) behind master), limit ${MAX_AGE_DAYS}d"
fi
}
# ── our pin ─────────────────────────────────────────────────────────────────
echo "our pin (localrepo/end4-pkgbuilds):"
check_pin "ours" "$local_pin" hard
# ── end-4's pin ─────────────────────────────────────────────────────────────
echo ""
echo "end-4's pin (dots-hyprland sdata/dist-arch):"
# end-4's pin is only safe if OUR override covers it: customize_airootfs.sh
# rewrites exactly the 41651d7 pin. Any other Qt-unsafe end-4 pin sails
# straight into the ISO build unpatched → hard failure.
if [[ "$end4_pin" == "$END4_STALE_PIN"* ]]; then
echo " ℹ️ end-4 still pins ${end4_pin:0:12} — customize_airootfs.sh override is active"
check_pin "end-4" "$end4_pin" soft
else
check_pin "end-4" "$end4_pin" hard
echo " ℹ️ end-4 has moved off ${END4_STALE_PIN} to ${end4_pin:0:12}"
echo " → if it now passes, consider retiring the override guard in"
echo " customize_airootfs.sh and syncing our own pin to match."
fi
echo ""
if [[ "$FAILED" -ne 0 ]]; then
echo "Result: FAILED"
exit 1
fi
echo "Result: OK — all quickshell pins are Qt 6.12-safe and within ${MAX_AGE_DAYS}d of upstream"
@@ -0,0 +1 @@
ref: refs/heads/master
@@ -0,0 +1,9 @@
[core]
repositoryformatversion = 0
filemode = true
bare = true
[remote "origin"]
url = https://github.com/end-4/MicroTeX.git
tagOpt = --no-tags
fetch = +refs/*:refs/*
mirror = true
@@ -0,0 +1 @@
Unnamed repository; edit this file 'description' to name the repository.
@@ -0,0 +1,15 @@
#!/bin/sh
#
# An example hook script to check the commit log message taken by
# applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit. The hook is
# allowed to edit the commit message file.
#
# To enable this hook, rename this file to "applypatch-msg".
. git-sh-setup
commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
:
@@ -0,0 +1,74 @@
#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by "git commit" with one argument, the name of the file
# that has the commit message. The hook should exit with non-zero
# status after issuing an appropriate message if it wants to stop the
# commit. The hook is allowed to edit the commit message file.
#
# To enable this hook, rename this file to "commit-msg".
# Uncomment the below to add a Signed-off-by line to the message.
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
# hook is more suited to it.
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
# This example catches duplicate Signed-off-by lines and messages that
# would confuse 'git am'.
ret=0
test "" = "$(grep '^Signed-off-by: ' "$1" |
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
echo >&2 Duplicate Signed-off-by lines.
ret=1
}
comment_re="$(
{
git config --get-regexp "^core\.comment(char|string)\$" ||
echo '#'
} | sed -n -e '
${
s/^[^ ]* //
s|[][*./\]|\\&|g
s/^auto$/[#;@!$%^&|:]/
p
}'
)"
scissors_line="^${comment_re} -\{8,\} >8 -\{8,\}\$"
comment_line="^${comment_re}.*"
blank_line='^[ ]*$'
# Disallow lines starting with "diff -" or "Index: " in the body of the
# message. Stop looking if we see a scissors line.
line="$(sed -n -e "
# Skip comments and blank lines at the start of the file.
/${scissors_line}/q
/${comment_line}/d
/${blank_line}/d
# The first paragraph will become the subject header so
# does not need to be checked.
: subject
n
/${scissors_line}/q
/${blank_line}/!b subject
# Check the body of the message for problematic
# prefixes.
: body
n
/${scissors_line}/q
/${comment_line}/b body
/^diff -/{p;q;}
/^Index: /{p;q;}
b body
" "$1")"
if test -n "$line"
then
echo >&2 "Message contains a diff that will confuse 'git am'."
echo >&2 "To fix this indent the diff."
ret=1
fi
exit $ret
@@ -0,0 +1,168 @@
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open2;
# An example hook script to integrate Watchman
# (https://facebook.github.io/watchman/) with git to speed up detecting
# new and modified files.
#
# The hook is passed a version (currently 2) and last update token
# formatted as a string and outputs to stdout a new update token and
# all files that have been modified since the update token. Paths must
# be relative to the root of the working tree and separated by a single NUL.
#
# To enable this hook, rename this file to "query-watchman" and set
# 'git config core.fsmonitor .git/hooks/query-watchman'
#
my ($version, $last_update_token) = @ARGV;
# Uncomment for debugging
# print STDERR "$0 $version $last_update_token\n";
# Check the hook interface version
if ($version ne 2) {
die "Unsupported query-fsmonitor hook version '$version'.\n" .
"Falling back to scanning...\n";
}
my $git_work_tree = get_working_dir();
my $json_pkg;
eval {
require JSON::XS;
$json_pkg = "JSON::XS";
1;
} or do {
require JSON::PP;
$json_pkg = "JSON::PP";
};
launch_watchman();
sub launch_watchman {
my $o = watchman_query();
if (is_work_tree_watched($o)) {
output_result($o->{clock}, @{$o->{files}});
}
}
sub output_result {
my ($clockid, @files) = @_;
# Uncomment for debugging watchman output
# open (my $fh, ">", ".git/watchman-output.out");
# binmode $fh, ":utf8";
# print $fh "$clockid\n@files\n";
# close $fh;
binmode STDOUT, ":utf8";
print $clockid;
print "\0";
local $, = "\0";
print @files;
}
sub watchman_clock {
my $response = qx/watchman clock "$git_work_tree"/;
die "Failed to get clock id on '$git_work_tree'.\n" .
"Falling back to scanning...\n" if $? != 0;
return $json_pkg->new->utf8->decode($response);
}
sub watchman_query {
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
or die "open2() failed: $!\n" .
"Falling back to scanning...\n";
# In the query expression below we're asking for names of files that
# changed since $last_update_token but not from the .git folder.
#
# To accomplish this, we're using the "since" generator to use the
# recency index to select candidate nodes and "fields" to limit the
# output to file names only. Then we're using the "expression" term to
# further constrain the results.
my $last_update_line = "";
if (substr($last_update_token, 0, 1) eq "c") {
$last_update_token = "\"$last_update_token\"";
$last_update_line = qq[\n"since": $last_update_token,];
}
my $query = <<" END";
["query", "$git_work_tree", {$last_update_line
"fields": ["name"],
"expression": ["not", ["dirname", ".git"]]
}]
END
# Uncomment for debugging the watchman query
# open (my $fh, ">", ".git/watchman-query.json");
# print $fh $query;
# close $fh;
print CHLD_IN $query;
close CHLD_IN;
my $response = do {local $/; <CHLD_OUT>};
# Uncomment for debugging the watch response
# open ($fh, ">", ".git/watchman-response.json");
# print $fh $response;
# close $fh;
die "Watchman: command returned no output.\n" .
"Falling back to scanning...\n" if $response eq "";
die "Watchman: command returned invalid output: $response\n" .
"Falling back to scanning...\n" unless $response =~ /^\{/;
return $json_pkg->new->utf8->decode($response);
}
sub is_work_tree_watched {
my ($output) = @_;
my $error = $output->{error};
if ($error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
my $response = qx/watchman watch "$git_work_tree"/;
die "Failed to make watchman watch '$git_work_tree'.\n" .
"Falling back to scanning...\n" if $? != 0;
$output = $json_pkg->new->utf8->decode($response);
$error = $output->{error};
die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;
# Uncomment for debugging watchman output
# open (my $fh, ">", ".git/watchman-output.out");
# close $fh;
# Watchman will always return all files on the first query so
# return the fast "everything is dirty" flag to git and do the
# Watchman query just to get it over with now so we won't pay
# the cost in git to look up each individual file.
my $o = watchman_clock();
$error = $o->{error};
die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;
output_result($o->{clock}, ("/"));
return 0;
}
die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;
return 1;
}
sub get_working_dir {
my $working_dir;
if ($^O =~ 'msys' || $^O =~ 'cygwin') {
$working_dir = Win32::GetCwd();
$working_dir =~ tr/\\/\//;
} else {
require Cwd;
$working_dir = Cwd::cwd();
}
return $working_dir;
}
@@ -0,0 +1,8 @@
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
exec git update-server-info
@@ -0,0 +1,14 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed
# by applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-applypatch".
. git-sh-setup
precommit="$(git rev-parse --git-path hooks/pre-commit)"
test -x "$precommit" && exec "$precommit" ${1+"$@"}
:
@@ -0,0 +1,49 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
if git rev-parse --verify HEAD >/dev/null 2>&1
then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=$(git hash-object -t tree /dev/null)
fi
# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --type=bool hooks.allownonascii)
# Redirect output to stderr.
exec 1>&2
# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
# Note that the use of brackets around a tr range is ok here, (it's
# even required, for portability to Solaris 10's /usr/bin/tr), since
# the square bracket bytes happen to fall in the designated range.
test $(git diff-index --cached --name-only --diff-filter=A -z $against |
LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
cat <<\EOF
Error: Attempt to add a non-ASCII file name.
This can cause problems if you want to work with people on other platforms.
To be portable it is advisable to rename the file.
If you know what you are doing you can disable this check using:
git config hooks.allownonascii true
EOF
exit 1
fi
# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --
@@ -0,0 +1,13 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git merge" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message to
# stderr if it wants to stop the merge commit.
#
# To enable this hook, rename this file to "pre-merge-commit".
. git-sh-setup
test -x "$GIT_DIR/hooks/pre-commit" &&
exec "$GIT_DIR/hooks/pre-commit"
:
@@ -0,0 +1,53 @@
#!/bin/sh
# An example hook script to verify what is about to be pushed. Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed. If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local oid> <remote ref> <remote oid>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).
remote="$1"
url="$2"
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
while read local_ref local_oid remote_ref remote_oid
do
if test "$local_oid" = "$zero"
then
# Handle delete
:
else
if test "$remote_oid" = "$zero"
then
# New branch, examine all commits
range="$local_oid"
else
# Update to existing branch, examine new commits
range="$remote_oid..$local_oid"
fi
# Check for WIP commit
commit=$(git rev-list -n 1 --grep '^WIP' "$range")
if test -n "$commit"
then
echo >&2 "Found WIP commit in $local_ref, not pushing"
exit 1
fi
fi
done
exit 0
@@ -0,0 +1,169 @@
#!/bin/sh
#
# Copyright (c) 2006, 2008 Junio C Hamano
#
# The "pre-rebase" hook is run just before "git rebase" starts doing
# its job, and can prevent the command from running by exiting with
# non-zero status.
#
# The hook is called with the following parameters:
#
# $1 -- the upstream the series was forked from.
# $2 -- the branch being rebased (or empty when rebasing the current branch).
#
# This sample shows how to prevent topic branches that are already
# merged to 'next' branch from getting rebased, because allowing it
# would result in rebasing already published history.
publish=next
basebranch="$1"
if test "$#" = 2
then
topic="refs/heads/$2"
else
topic=`git symbolic-ref HEAD` ||
exit 0 ;# we do not interrupt rebasing detached HEAD
fi
case "$topic" in
refs/heads/??/*)
;;
*)
exit 0 ;# we do not interrupt others.
;;
esac
# Now we are dealing with a topic branch being rebased
# on top of master. Is it OK to rebase it?
# Does the topic really exist?
git show-ref -q "$topic" || {
echo >&2 "No such branch $topic"
exit 1
}
# Is topic fully merged to master?
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
if test -z "$not_in_master"
then
echo >&2 "$topic is fully merged to master; better remove it."
exit 1 ;# we could allow it, but there is no point.
fi
# Is topic ever merged to next? If so you should not be rebasing it.
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
only_next_2=`git rev-list ^master ${publish} | sort`
if test "$only_next_1" = "$only_next_2"
then
not_in_topic=`git rev-list "^$topic" master`
if test -z "$not_in_topic"
then
echo >&2 "$topic is already up to date with master"
exit 1 ;# we could allow it, but there is no point.
else
exit 0
fi
else
not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
/usr/bin/perl -e '
my $topic = $ARGV[0];
my $msg = "* $topic has commits already merged to public branch:\n";
my (%not_in_next) = map {
/^([0-9a-f]+) /;
($1 => 1);
} split(/\n/, $ARGV[1]);
for my $elem (map {
/^([0-9a-f]+) (.*)$/;
[$1 => $2];
} split(/\n/, $ARGV[2])) {
if (!exists $not_in_next{$elem->[0]}) {
if ($msg) {
print STDERR $msg;
undef $msg;
}
print STDERR " $elem->[1]\n";
}
}
' "$topic" "$not_in_next" "$not_in_master"
exit 1
fi
<<\DOC_END
This sample hook safeguards topic branches that have been
published from being rewound.
The workflow assumed here is:
* Once a topic branch forks from "master", "master" is never
merged into it again (either directly or indirectly).
* Once a topic branch is fully cooked and merged into "master",
it is deleted. If you need to build on top of it to correct
earlier mistakes, a new topic branch is created by forking at
the tip of the "master". This is not strictly necessary, but
it makes it easier to keep your history simple.
* Whenever you need to test or publish your changes to topic
branches, merge them into "next" branch.
The script, being an example, hardcodes the publish branch name
to be "next", but it is trivial to make it configurable via
$GIT_DIR/config mechanism.
With this workflow, you would want to know:
(1) ... if a topic branch has ever been merged to "next". Young
topic branches can have stupid mistakes you would rather
clean up before publishing, and things that have not been
merged into other branches can be easily rebased without
affecting other people. But once it is published, you would
not want to rewind it.
(2) ... if a topic branch has been fully merged to "master".
Then you can delete it. More importantly, you should not
build on top of it -- other people may already want to
change things related to the topic as patches against your
"master", so if you need further changes, it is better to
fork the topic (perhaps with the same name) afresh from the
tip of "master".
Let's look at this example:
o---o---o---o---o---o---o---o---o---o "next"
/ / / /
/ a---a---b A / /
/ / / /
/ / c---c---c---c B /
/ / / \ /
/ / / b---b C \ /
/ / / / \ /
---o---o---o---o---o---o---o---o---o---o---o "master"
A, B and C are topic branches.
* A has one fix since it was merged up to "next".
* B has finished. It has been fully merged up to "master" and "next",
and is ready to be deleted.
* C has not merged to "next" at all.
We would want to allow C to be rebased, refuse A, and encourage
B to be deleted.
To compute (1):
git rev-list ^master ^topic next
git rev-list ^master next
if these match, topic has not merged in next at all.
To compute (2):
git rev-list master..topic
if this is empty, it is fully merged to "master".
DOC_END
@@ -0,0 +1,24 @@
#!/bin/sh
#
# An example hook script to make use of push options.
# The example simply echoes all push options that start with 'echoback='
# and rejects all pushes when the "reject" push option is used.
#
# To enable this hook, rename this file to "pre-receive".
if test -n "$GIT_PUSH_OPTION_COUNT"
then
i=0
while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
do
eval "value=\$GIT_PUSH_OPTION_$i"
case "$value" in
echoback=*)
echo "echo from the pre-receive-hook: ${value#*=}" >&2
;;
reject)
exit 1
esac
i=$((i + 1))
done
fi
@@ -0,0 +1,42 @@
#!/bin/sh
#
# An example hook script to prepare the commit log message.
# Called by "git commit" with the name of the file that has the
# commit message, followed by the description of the commit
# message's source. The hook's purpose is to edit the commit
# message file. If the hook fails with a non-zero status,
# the commit is aborted.
#
# To enable this hook, rename this file to "prepare-commit-msg".
# This hook includes three examples. The first one removes the
# "# Please enter the commit message..." help message.
#
# The second includes the output of "git diff --name-status -r"
# into the message, just before the "git status" output. It is
# commented because it doesn't cope with --amend or with squashed
# commits.
#
# The third example adds a Signed-off-by line to the message, that can
# still be edited. This is rarely a good idea.
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3
/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
# case "$COMMIT_SOURCE,$SHA1" in
# ,|template,)
# /usr/bin/perl -i.bak -pe '
# print "\n" . `git diff --cached --name-status -r`
# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
# *) ;;
# esac
# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
# if test -z "$COMMIT_SOURCE"
# then
# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
# fi
@@ -0,0 +1,78 @@
#!/bin/sh
# An example hook script to update a checked-out tree on a git push.
#
# This hook is invoked by git-receive-pack(1) when it reacts to git
# push and updates reference(s) in its repository, and when the push
# tries to update the branch that is currently checked out and the
# receive.denyCurrentBranch configuration variable is set to
# updateInstead.
#
# By default, such a push is refused if the working tree and the index
# of the remote repository has any difference from the currently
# checked out commit; when both the working tree and the index match
# the current commit, they are updated to match the newly pushed tip
# of the branch. This hook is to be used to override the default
# behaviour; however the code below reimplements the default behaviour
# as a starting point for convenient modification.
#
# The hook receives the commit with which the tip of the current
# branch is going to be updated:
commit=$1
# It can exit with a non-zero status to refuse the push (when it does
# so, it must not modify the index or the working tree).
die () {
echo >&2 "$*"
exit 1
}
# Or it can make any necessary changes to the working tree and to the
# index to bring them to the desired state when the tip of the current
# branch is updated to the new commit, and exit with a zero status.
#
# For example, the hook can simply run git read-tree -u -m HEAD "$1"
# in order to emulate git fetch that is run in the reverse direction
# with git push, as the two-tree form of git read-tree -u -m is
# essentially the same as git switch or git checkout that switches
# branches while keeping the local changes in the working tree that do
# not interfere with the difference between the branches.
# The below is a more-or-less exact translation to shell of the C code
# for the default behaviour for git's push-to-checkout hook defined in
# the push_to_deploy() function in builtin/receive-pack.c.
#
# Note that the hook will be executed from the repository directory,
# not from the working tree, so if you want to perform operations on
# the working tree, you will have to adapt your code accordingly, e.g.
# by adding "cd .." or using relative paths.
if ! git update-index -q --ignore-submodules --refresh
then
die "Up-to-date check failed"
fi
if ! git diff-files --quiet --ignore-submodules --
then
die "Working directory has unstaged changes"
fi
# This is a rough translation of:
#
# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
if git cat-file -e HEAD 2>/dev/null
then
head=HEAD
else
head=$(git hash-object -t tree --stdin </dev/null)
fi
if ! git diff-index --quiet --cached --ignore-submodules $head --
then
die "Working directory has staged changes"
fi
if ! git read-tree -u -m "$commit"
then
die "Could not update working tree to new HEAD"
fi
@@ -0,0 +1,77 @@
#!/bin/sh
# An example hook script to validate a patch (and/or patch series) before
# sending it via email.
#
# The hook should exit with non-zero status after issuing an appropriate
# message if it wants to prevent the email(s) from being sent.
#
# To enable this hook, rename this file to "sendemail-validate".
#
# By default, it will only check that the patch(es) can be applied on top of
# the default upstream branch without conflicts in a secondary worktree. After
# validation (successful or not) of the last patch of a series, the worktree
# will be deleted.
#
# The following config variables can be set to change the default remote and
# remote ref that are used to apply the patches against:
#
# sendemail.validateRemote (default: origin)
# sendemail.validateRemoteRef (default: HEAD)
#
# Replace the TODO placeholders with appropriate checks according to your
# needs.
validate_cover_letter () {
file="$1"
# TODO: Replace with appropriate checks (e.g. spell checking).
true
}
validate_patch () {
file="$1"
# Ensure that the patch applies without conflicts.
git am -3 "$file" || return
# TODO: Replace with appropriate checks for this patch
# (e.g. checkpatch.pl).
true
}
validate_series () {
# TODO: Replace with appropriate checks for the whole series
# (e.g. quick build, coding style checks, etc.).
true
}
# main -------------------------------------------------------------------------
if test "$GIT_SENDEMAIL_FILE_COUNTER" = 1
then
remote=$(git config --default origin --get sendemail.validateRemote) &&
ref=$(git config --default HEAD --get sendemail.validateRemoteRef) &&
worktree=$(mktemp --tmpdir -d sendemail-validate.XXXXXXX) &&
git worktree add -fd --checkout "$worktree" "refs/remotes/$remote/$ref" &&
git config --replace-all sendemail.validateWorktree "$worktree"
else
worktree=$(git config --get sendemail.validateWorktree)
fi || {
echo "sendemail-validate: error: failed to prepare worktree" >&2
exit 1
}
unset GIT_DIR GIT_WORK_TREE
cd "$worktree" &&
if grep -q "^diff --git " "$1"
then
validate_patch "$1"
else
validate_cover_letter "$1"
fi &&
if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL"
then
git config --unset-all sendemail.validateWorktree &&
trap 'git worktree remove -ff "$worktree"' EXIT &&
validate_series
fi
@@ -0,0 +1,128 @@
#!/bin/sh
#
# An example hook script to block unannotated tags from entering.
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
#
# To enable this hook, rename this file to "update".
#
# Config
# ------
# hooks.allowunannotated
# This boolean sets whether unannotated tags will be allowed into the
# repository. By default they won't be.
# hooks.allowdeletetag
# This boolean sets whether deleting tags will be allowed in the
# repository. By default they won't be.
# hooks.allowmodifytag
# This boolean sets whether a tag may be modified after creation. By default
# it won't be.
# hooks.allowdeletebranch
# This boolean sets whether deleting branches will be allowed in the
# repository. By default they won't be.
# hooks.denycreatebranch
# This boolean sets whether remotely creating branches will be denied
# in the repository. By default this is allowed.
#
# --- Command line
refname="$1"
oldrev="$2"
newrev="$3"
# --- Safety check
if [ -z "$GIT_DIR" ]; then
echo "Don't run this script from the command line." >&2
echo " (if you want, you could supply GIT_DIR then run" >&2
echo " $0 <ref> <oldrev> <newrev>)" >&2
exit 1
fi
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
echo "usage: $0 <ref> <oldrev> <newrev>" >&2
exit 1
fi
# --- Config
allowunannotated=$(git config --type=bool hooks.allowunannotated)
allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
allowmodifytag=$(git config --type=bool hooks.allowmodifytag)
# check for no description
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
case "$projectdesc" in
"Unnamed repository"* | "")
echo "*** Project description file hasn't been set" >&2
exit 1
;;
esac
# --- Check types
# if $newrev is 0000...0000, it's a commit to delete a ref.
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
if [ "$newrev" = "$zero" ]; then
newrev_type=delete
else
newrev_type=$(git cat-file -t $newrev)
fi
case "$refname","$newrev_type" in
refs/tags/*,commit)
# un-annotated tag
short_refname=${refname##refs/tags/}
if [ "$allowunannotated" != "true" ]; then
echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
exit 1
fi
;;
refs/tags/*,delete)
# delete tag
if [ "$allowdeletetag" != "true" ]; then
echo "*** Deleting a tag is not allowed in this repository" >&2
exit 1
fi
;;
refs/tags/*,tag)
# annotated tag
if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
then
echo "*** Tag '$refname' already exists." >&2
echo "*** Modifying a tag is not allowed in this repository." >&2
exit 1
fi
;;
refs/heads/*,commit)
# branch
if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
echo "*** Creating a branch is not allowed in this repository" >&2
exit 1
fi
;;
refs/heads/*,delete)
# delete branch
if [ "$allowdeletebranch" != "true" ]; then
echo "*** Deleting a branch is not allowed in this repository" >&2
exit 1
fi
;;
refs/remotes/*,commit)
# tracking branch
;;
refs/remotes/*,delete)
# delete tracking branch
if [ "$allowdeletebranch" != "true" ]; then
echo "*** Deleting a tracking branch is not allowed in this repository" >&2
exit 1
fi
;;
*)
# Anything else (is there anything else?)
echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
exit 1
;;
esac
# --- Finished
exit 0
@@ -0,0 +1 @@
* -export-subst -export-ignore
@@ -0,0 +1,6 @@
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
@@ -0,0 +1,2 @@
# pack-refs with: peeled fully-peeled sorted
e8c6e58b1306119e51297b02f0b449fa7300416d refs/heads/master
Submodule localrepo/end4-pkgbuilds/microtex-git/src/MicroTeX added at f1dc9f74bb
@@ -1,4 +1,4 @@
_commit='7511545ee20664e3b8b8d3322c0ffe7567c56f7a' _commit='11ca60be22b063478ed9586ca1d7f92f0f261caf'
# Useful links: # Useful links:
# https://git.outfoxxed.me/quickshell/quickshell/commits/branch/master # https://git.outfoxxed.me/quickshell/quickshell/commits/branch/master
# https://aur.archlinux.org/packages/quickshell-git # https://aur.archlinux.org/packages/quickshell-git
@@ -8,7 +8,7 @@ _prefix='illogical-impulse'
_pkgname=quickshell _pkgname=quickshell
pkgname="$_prefix-$_pkgname-git" pkgname="$_prefix-$_pkgname-git"
pkgver=0.1.0.r1 pkgver=0.1.0.r1
pkgrel=8 pkgrel=9
pkgdesc="$_pkgname-git pinned commit and extra deps for $_prefix" pkgdesc="$_pkgname-git pinned commit and extra deps for $_prefix"
arch=(x86_64 aarch64) arch=(x86_64 aarch64)
url='https://git.outfoxxed.me/quickshell/quickshell' url='https://git.outfoxxed.me/quickshell/quickshell'
@@ -0,0 +1,52 @@
# Generated by makepkg 7.1.0
# using fakeroot version 1.37.2
pkgname = illogical-impulse-quickshell-git
pkgbase = illogical-impulse-quickshell-git
xdata = pkgtype=pkg
pkgver = 0.1.0.r1-9
pkgdesc = quickshell-git pinned commit and extra deps for illogical-impulse
url = https://git.outfoxxed.me/quickshell/quickshell
builddate = 1791439825
packager = Unknown Packager
size = 198896342
arch = x86_64
license = LGPL-3.0-only
group = illogical-impulse
conflict = quickshell
conflict = quickshell-git
provides = quickshell
provides = quickshell-git
depend = cpptrace
depend = jemalloc
depend = mesa
depend = qt6-declarative
depend = qt6-base
depend = qt6-svg
depend = libdrm
depend = libpipewire
depend = libxcb
depend = wayland
depend = qt6-5compat
depend = qt6-avif-image-plugin
depend = qt6-imageformats
depend = qt6-multimedia
depend = qt6-positioning
depend = qt6-quicktimeline
depend = qt6-sensors
depend = qt6-svg
depend = qt6-tools
depend = qt6-translations
depend = qt6-virtualkeyboard
depend = qt6-wayland
depend = kirigami
depend = kdialog
depend = syntax-highlighting
makedepend = cli11
makedepend = cmake
makedepend = git
makedepend = ninja
makedepend = qt6-shadertools
makedepend = spirv-tools
makedepend = vulkan-headers
makedepend = wayland
makedepend = wayland-protocols
@@ -0,0 +1 @@
/usr/bin/quickshell
@@ -0,0 +1,8 @@
module Quickshell.Bluetooth
linktarget quickshell-bluetoothplugin
optional plugin quickshell-bluetoothplugin
classname Quickshell_BluetoothPlugin
typeinfo quickshell-bluetooth.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Bluetooth/
@@ -0,0 +1,411 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "adapter.hpp"
lineNumber: 57
name: "qs::bluetooth::BluetoothAdapter"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Bluetooth/BluetoothAdapter 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "name"
type: "QString"
bindable: "bindableName"
read: "default"
notify: "nameChanged"
index: 0
lineNumber: 63
isReadonly: true
}
Property {
name: "enabled"
type: "bool"
read: "enabled"
write: "setEnabled"
notify: "enabledChanged"
index: 1
lineNumber: 65
}
Property {
name: "state"
type: "BluetoothAdapterState::Enum"
bindable: "bindableState"
read: "default"
notify: "stateChanged"
index: 2
lineNumber: 67
isReadonly: true
}
Property {
name: "discoverable"
type: "bool"
read: "discoverable"
write: "setDiscoverable"
notify: "discoverableChanged"
index: 3
lineNumber: 69
}
Property {
name: "discoverableTimeout"
type: "uint"
read: "discoverableTimeout"
write: "setDiscoverableTimeout"
notify: "discoverableTimeoutChanged"
index: 4
lineNumber: 72
}
Property {
name: "discovering"
type: "bool"
read: "discovering"
write: "setDiscovering"
notify: "discoveringChanged"
index: 5
lineNumber: 74
}
Property {
name: "pairable"
type: "bool"
read: "pairable"
write: "setPairable"
notify: "pairableChanged"
index: 6
lineNumber: 79
}
Property {
name: "pairableTimeout"
type: "uint"
read: "pairableTimeout"
write: "setPairableTimeout"
notify: "pairableTimeoutChanged"
index: 7
lineNumber: 82
}
Property {
name: "devices"
type: "UntypedObjectModel"
isPointer: true
read: "devices"
index: 8
lineNumber: 85
isReadonly: true
isPropertyConstant: true
}
Property {
name: "adapterId"
type: "QString"
read: "adapterId"
index: 9
lineNumber: 87
isReadonly: true
isPropertyConstant: true
}
Property {
name: "dbusPath"
type: "QString"
read: "path"
index: 10
lineNumber: 89
isReadonly: true
isPropertyConstant: true
}
Signal { name: "nameChanged"; lineNumber: 136 }
Signal { name: "enabledChanged"; lineNumber: 137 }
Signal { name: "stateChanged"; lineNumber: 138 }
Signal { name: "discoverableChanged"; lineNumber: 139 }
Signal { name: "discoverableTimeoutChanged"; lineNumber: 140 }
Signal { name: "discoveringChanged"; lineNumber: 141 }
Signal { name: "pairableChanged"; lineNumber: 142 }
Signal { name: "pairableTimeoutChanged"; lineNumber: 143 }
}
Component {
file: "adapter.hpp"
lineNumber: 15
name: "qs::bluetooth::BluetoothAdapterState"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Bluetooth/BluetoothAdapterState 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 21
values: [
"Disabled",
"Enabled",
"Enabling",
"Disabling",
"Blocked"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 35
Parameter { name: "state"; type: "BluetoothAdapterState::Enum" }
}
}
Component {
file: "device.hpp"
lineNumber: 55
name: "qs::bluetooth::BluetoothDevice"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Bluetooth/BluetoothDevice 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "address"
type: "QString"
bindable: "bindableAddress"
read: "default"
notify: "addressChanged"
index: 0
lineNumber: 61
isReadonly: true
}
Property {
name: "name"
type: "QString"
read: "name"
write: "setName"
notify: "nameChanged"
index: 1
lineNumber: 66
}
Property {
name: "deviceName"
type: "QString"
bindable: "bindableDeviceName"
read: "default"
notify: "deviceNameChanged"
index: 2
lineNumber: 69
isReadonly: true
}
Property {
name: "icon"
type: "QString"
bindable: "bindableIcon"
read: "default"
notify: "iconChanged"
index: 3
lineNumber: 71
isReadonly: true
}
Property {
name: "state"
type: "BluetoothDeviceState::Enum"
bindable: "bindableState"
read: "default"
notify: "stateChanged"
index: 4
lineNumber: 73
isReadonly: true
}
Property {
name: "connected"
type: "bool"
read: "connected"
write: "setConnected"
notify: "connectedChanged"
index: 5
lineNumber: 79
}
Property {
name: "paired"
type: "bool"
bindable: "bindablePaired"
read: "default"
notify: "pairedChanged"
index: 6
lineNumber: 83
isReadonly: true
}
Property {
name: "bonded"
type: "bool"
bindable: "bindableBonded"
read: "default"
notify: "bondedChanged"
index: 7
lineNumber: 85
isReadonly: true
}
Property {
name: "pairing"
type: "bool"
read: "pairing"
notify: "pairingChanged"
index: 8
lineNumber: 89
isReadonly: true
}
Property {
name: "trusted"
type: "bool"
read: "trusted"
write: "setTrusted"
notify: "trustedChanged"
index: 9
lineNumber: 92
}
Property {
name: "blocked"
type: "bool"
read: "blocked"
write: "setBlocked"
notify: "blockedChanged"
index: 10
lineNumber: 95
}
Property {
name: "wakeAllowed"
type: "bool"
read: "wakeAllowed"
write: "setWakeAllowed"
notify: "wakeAllowedChanged"
index: 11
lineNumber: 97
}
Property {
name: "batteryAvailable"
type: "bool"
read: "batteryAvailable"
notify: "batteryAvailableChanged"
index: 12
lineNumber: 99
isReadonly: true
}
Property {
name: "battery"
type: "double"
bindable: "bindableBattery"
read: "default"
notify: "batteryChanged"
index: 13
lineNumber: 101
isReadonly: true
}
Property {
name: "adapter"
type: "BluetoothAdapter"
isPointer: true
read: "adapter"
notify: "adapterChanged"
index: 14
lineNumber: 103
isReadonly: true
}
Property {
name: "dbusPath"
type: "QString"
read: "path"
index: 15
lineNumber: 105
isReadonly: true
isPropertyConstant: true
}
Signal { name: "addressChanged"; lineNumber: 167 }
Signal { name: "deviceNameChanged"; lineNumber: 168 }
Signal { name: "nameChanged"; lineNumber: 169 }
Signal { name: "connectedChanged"; lineNumber: 170 }
Signal { name: "stateChanged"; lineNumber: 171 }
Signal { name: "pairedChanged"; lineNumber: 172 }
Signal { name: "bondedChanged"; lineNumber: 173 }
Signal { name: "pairingChanged"; lineNumber: 174 }
Signal { name: "trustedChanged"; lineNumber: 175 }
Signal { name: "blockedChanged"; lineNumber: 176 }
Signal { name: "wakeAllowedChanged"; lineNumber: 177 }
Signal { name: "iconChanged"; lineNumber: 178 }
Signal { name: "batteryAvailableChanged"; lineNumber: 179 }
Signal { name: "batteryChanged"; lineNumber: 180 }
Signal { name: "adapterChanged"; lineNumber: 181 }
Method { name: "connect"; lineNumber: 112 }
Method { name: "disconnect"; lineNumber: 114 }
Method { name: "pair"; lineNumber: 118 }
Method { name: "cancelPair"; lineNumber: 120 }
Method { name: "forget"; lineNumber: 122 }
}
Component {
file: "device.hpp"
lineNumber: 14
name: "qs::bluetooth::BluetoothDeviceState"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Bluetooth/BluetoothDeviceState 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 20
values: [
"Disconnected",
"Connected",
"Disconnecting",
"Connecting"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 32
Parameter { name: "state"; type: "BluetoothDeviceState::Enum" }
}
}
Component {
file: "bluez.hpp"
lineNumber: 63
name: "qs::bluetooth::BluezQml"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Bluetooth/Bluetooth 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "defaultAdapter"
type: "BluetoothAdapter"
isPointer: true
bindable: "bindableDefaultAdapter"
read: "default"
notify: "defaultAdapterChanged"
index: 0
lineNumber: 69
isReadonly: true
}
Property {
name: "adapters"
type: "UntypedObjectModel"
isPointer: true
read: "adapters"
index: 1
lineNumber: 72
isReadonly: true
isPropertyConstant: true
}
Property {
name: "devices"
type: "UntypedObjectModel"
isPointer: true
read: "devices"
index: 2
lineNumber: 76
isReadonly: true
isPropertyConstant: true
}
Signal { name: "defaultAdapterChanged"; lineNumber: 80 }
}
}
@@ -0,0 +1,10 @@
module Quickshell.DBusMenu
linktarget quickshell-dbusmenuplugin
optional plugin quickshell-dbusmenuplugin
classname Quickshell_DBusMenuPlugin
typeinfo quickshell-dbusmenu.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/DBusMenu/
depends Quickshell
depends QtQuick
@@ -0,0 +1,67 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "dbusmenu.hpp"
lineNumber: 118
name: "qs::dbus::dbusmenu::DBusMenu"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.DBusMenu/DBusMenuHandle 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "menu"
type: "qs::dbus::dbusmenu::DBusMenuItem"
isPointer: true
read: "menu"
index: 0
lineNumber: 120
isReadonly: true
isPropertyConstant: true
}
Signal { name: "iconThemePathChanged"; lineNumber: 130 }
Method {
name: "onLayoutUpdated"
lineNumber: 146
Parameter { name: "revision"; type: "uint" }
Parameter { name: "parent"; type: "int" }
}
Method {
name: "onItemPropertiesUpdated"
lineNumber: 147
Parameter { name: "updatedProps"; type: "DBusMenuItemPropertiesList" }
Parameter { name: "removedProps"; type: "DBusMenuItemPropertyNamesList" }
}
}
Component {
file: "dbusmenu.hpp"
lineNumber: 48
name: "qs::dbus::dbusmenu::DBusMenuItem"
accessSemantics: "reference"
prototype: "QsMenuEntry"
exports: ["Quickshell.DBusMenu/DBusMenuItem 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "menuHandle"
type: "qs::dbus::dbusmenu::DBusMenu"
isPointer: true
read: "menuHandle"
index: 0
lineNumber: 51
isReadonly: true
isPropertyConstant: true
}
Signal { name: "layoutUpdated"; lineNumber: 92 }
Method { name: "sendOpened"; isMethodConstant: true; lineNumber: 95 }
Method { name: "sendClosed"; isMethodConstant: true; lineNumber: 96 }
Method { name: "sendTriggered"; isMethodConstant: true; lineNumber: 97 }
Method { name: "updateLayout"; isMethodConstant: true; lineNumber: 64 }
}
}
@@ -0,0 +1,10 @@
module Quickshell.Hyprland._FocusGrab
linktarget quickshell-hyprland-focus-grabplugin
optional plugin quickshell-hyprland-focus-grabplugin
classname Quickshell_Hyprland__FocusGrabPlugin
typeinfo quickshell-hyprland-focus-grab.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Hyprland/_FocusGrab/
depends Quickshell
depends QtQuick
@@ -0,0 +1,48 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "qml.hpp"
lineNumber: 55
name: "qs::hyprland::HyprlandFocusGrab"
accessSemantics: "reference"
prototype: "QObject"
interfaces: ["QQmlParserStatus"]
exports: ["Quickshell.Hyprland._FocusGrab/HyprlandFocusGrab 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "active"
type: "bool"
read: "isActive"
write: "setActive"
notify: "activeChanged"
index: 0
lineNumber: 68
}
Property {
name: "windows"
type: "QObjectList"
read: "windows"
write: "setWindows"
notify: "windowsChanged"
index: 1
lineNumber: 70
}
Signal { name: "cleared"; lineNumber: 90 }
Signal { name: "activeChanged"; lineNumber: 92 }
Signal { name: "windowsChanged"; lineNumber: 93 }
Method { name: "onGrabActivated"; lineNumber: 96 }
Method { name: "onGrabCleared"; lineNumber: 97 }
Method { name: "onProxyConnected"; lineNumber: 98 }
Method {
name: "onObjectDestroyed"
lineNumber: 99
Parameter { name: "object"; type: "QObject"; isPointer: true }
}
}
}
@@ -0,0 +1,9 @@
module Quickshell.Hyprland._GlobalShortcuts
linktarget quickshell-hyprland-global-shortcutsplugin
optional plugin quickshell-hyprland-global-shortcutsplugin
classname Quickshell_Hyprland__GlobalShortcutsPlugin
typeinfo quickshell-hyprland-global-shortcuts.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Hyprland/_GlobalShortcuts/
depends QtQuick
@@ -0,0 +1,72 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "qml.hpp"
lineNumber: 35
name: "qs::hyprland::global_shortcuts::GlobalShortcut"
accessSemantics: "reference"
prototype: "PostReloadHook"
exports: ["Quickshell.Hyprland._GlobalShortcuts/GlobalShortcut 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "pressed"
type: "bool"
read: "isPressed"
notify: "pressedChanged"
index: 0
lineNumber: 41
isReadonly: true
}
Property {
name: "appid"
type: "QString"
read: "appid"
write: "setAppid"
notify: "appidChanged"
index: 1
lineNumber: 47
}
Property {
name: "name"
type: "QString"
read: "name"
write: "setName"
notify: "nameChanged"
index: 2
lineNumber: 50
}
Property {
name: "description"
type: "QString"
read: "description"
write: "setDescription"
notify: "descriptionChanged"
index: 3
lineNumber: 53
}
Property {
name: "triggerDescription"
type: "QString"
read: "triggerDescription"
write: "setTriggerDescription"
notify: "triggerDescriptionChanged"
index: 4
lineNumber: 55
}
Signal { name: "pressed"; lineNumber: 82 }
Signal { name: "released"; lineNumber: 84 }
Signal { name: "pressedChanged"; lineNumber: 86 }
Signal { name: "appidChanged"; lineNumber: 87 }
Signal { name: "nameChanged"; lineNumber: 88 }
Signal { name: "descriptionChanged"; lineNumber: 89 }
Signal { name: "triggerDescriptionChanged"; lineNumber: 90 }
Method { name: "onPressed"; lineNumber: 93 }
Method { name: "onReleased"; lineNumber: 94 }
}
}
@@ -0,0 +1,9 @@
module Quickshell.Hyprland._Ipc
linktarget quickshell-hyprland-ipcplugin
optional plugin quickshell-hyprland-ipcplugin
classname Quickshell_Hyprland__IpcPlugin
typeinfo quickshell-hyprland-ipc.qmltypes
depends QtQuick
prefer :/qt/qml/Quickshell/Hyprland/_Ipc/
depends Quickshell
@@ -0,0 +1,538 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "connection.hpp"
lineNumber: 40
name: "qs::hyprland::ipc::HyprlandIpcEvent"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Hyprland._Ipc/HyprlandEvent 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "name"
type: "QString"
read: "nameStr"
index: 0
lineNumber: 45
isReadonly: true
isPropertyConstant: true
}
Property {
name: "data"
type: "QString"
read: "dataStr"
index: 1
lineNumber: 47
isReadonly: true
isPropertyConstant: true
}
Method {
name: "parse"
type: "QString"
isList: true
isMethodConstant: true
lineNumber: 58
Parameter { name: "argumentCount"; type: "int" }
}
}
Component {
file: "qml.hpp"
lineNumber: 16
name: "qs::hyprland::ipc::HyprlandIpcQml"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Hyprland._Ipc/Hyprland 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "usingLua"
type: "bool"
bindable: "bindableUsingLua"
read: "default"
notify: "usingLuaChanged"
index: 0
lineNumber: 22
isReadonly: true
}
Property {
name: "requestSocketPath"
type: "QString"
read: "requestSocketPath"
index: 1
lineNumber: 24
isReadonly: true
isPropertyConstant: true
}
Property {
name: "eventSocketPath"
type: "QString"
read: "eventSocketPath"
index: 2
lineNumber: 26
isReadonly: true
isPropertyConstant: true
}
Property {
name: "focusedMonitor"
type: "qs::hyprland::ipc::HyprlandMonitor"
isPointer: true
bindable: "bindableFocusedMonitor"
read: "default"
notify: "focusedMonitorChanged"
index: 3
lineNumber: 28
isReadonly: true
}
Property {
name: "focusedWorkspace"
type: "qs::hyprland::ipc::HyprlandWorkspace"
isPointer: true
bindable: "bindableFocusedWorkspace"
read: "default"
notify: "focusedWorkspaceChanged"
index: 4
lineNumber: 30
isReadonly: true
}
Property {
name: "activeToplevel"
type: "qs::hyprland::ipc::HyprlandToplevel"
isPointer: true
bindable: "bindableActiveToplevel"
read: "default"
notify: "activeToplevelChanged"
index: 5
lineNumber: 32
isReadonly: true
}
Property {
name: "monitors"
type: "UntypedObjectModel"
isPointer: true
read: "monitors"
index: 6
lineNumber: 35
isReadonly: true
isPropertyConstant: true
}
Property {
name: "workspaces"
type: "UntypedObjectModel"
isPointer: true
read: "workspaces"
index: 7
lineNumber: 40
isReadonly: true
isPropertyConstant: true
}
Property {
name: "toplevels"
type: "UntypedObjectModel"
isPointer: true
read: "toplevels"
index: 8
lineNumber: 43
isReadonly: true
isPropertyConstant: true
}
Signal {
name: "rawEvent"
lineNumber: 89
Parameter { name: "event"; type: "qs::hyprland::ipc::HyprlandIpcEvent"; isPointer: true }
}
Signal { name: "usingLuaChanged"; lineNumber: 91 }
Signal { name: "focusedMonitorChanged"; lineNumber: 92 }
Signal { name: "focusedWorkspaceChanged"; lineNumber: 93 }
Signal { name: "activeToplevelChanged"; lineNumber: 94 }
Method {
name: "dispatch"
lineNumber: 52
Parameter { name: "request"; type: "QString" }
}
Method {
name: "monitorFor"
type: "HyprlandMonitor"
isPointer: true
lineNumber: 55
Parameter { name: "screen"; type: "QuickshellScreenInfo"; isPointer: true }
}
Method { name: "refreshMonitors"; lineNumber: 61 }
Method { name: "refreshWorkspaces"; lineNumber: 67 }
Method { name: "refreshToplevels"; lineNumber: 73 }
}
Component {
file: "monitor.hpp"
lineNumber: 17
name: "qs::hyprland::ipc::HyprlandMonitor"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Hyprland._Ipc/HyprlandMonitor 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "id"
type: "int"
bindable: "bindableId"
read: "default"
notify: "idChanged"
index: 0
lineNumber: 20
isReadonly: true
}
Property {
name: "name"
type: "QString"
bindable: "bindableName"
read: "default"
notify: "nameChanged"
index: 1
lineNumber: 21
isReadonly: true
}
Property {
name: "description"
type: "QString"
bindable: "bindableDescription"
read: "default"
notify: "descriptionChanged"
index: 2
lineNumber: 22
isReadonly: true
}
Property {
name: "x"
type: "int"
bindable: "bindableX"
read: "default"
notify: "xChanged"
index: 3
lineNumber: 23
isReadonly: true
}
Property {
name: "y"
type: "int"
bindable: "bindableY"
read: "default"
notify: "yChanged"
index: 4
lineNumber: 24
isReadonly: true
}
Property {
name: "width"
type: "int"
bindable: "bindableWidth"
read: "default"
notify: "widthChanged"
index: 5
lineNumber: 25
isReadonly: true
}
Property {
name: "height"
type: "int"
bindable: "bindableHeight"
read: "default"
notify: "heightChanged"
index: 6
lineNumber: 26
isReadonly: true
}
Property {
name: "scale"
type: "double"
bindable: "bindableScale"
read: "default"
notify: "scaleChanged"
index: 7
lineNumber: 27
isReadonly: true
}
Property {
name: "lastIpcObject"
type: "QVariantMap"
read: "lastIpcObject"
notify: "lastIpcObjectChanged"
index: 8
lineNumber: 33
isReadonly: true
}
Property {
name: "activeWorkspace"
type: "qs::hyprland::ipc::HyprlandWorkspace"
isPointer: true
bindable: "bindableActiveWorkspace"
read: "default"
notify: "activeWorkspaceChanged"
index: 9
lineNumber: 35
isReadonly: true
}
Property {
name: "focused"
type: "bool"
bindable: "bindableFocused"
read: "default"
notify: "focusedChanged"
index: 10
lineNumber: 37
isReadonly: true
}
Signal { name: "idChanged"; lineNumber: 66 }
Signal { name: "nameChanged"; lineNumber: 67 }
Signal { name: "descriptionChanged"; lineNumber: 68 }
Signal { name: "xChanged"; lineNumber: 69 }
Signal { name: "yChanged"; lineNumber: 70 }
Signal { name: "widthChanged"; lineNumber: 71 }
Signal { name: "heightChanged"; lineNumber: 72 }
Signal { name: "scaleChanged"; lineNumber: 73 }
Signal { name: "lastIpcObjectChanged"; lineNumber: 74 }
Signal { name: "activeWorkspaceChanged"; lineNumber: 75 }
Signal { name: "focusedChanged"; lineNumber: 76 }
Method { name: "onActiveWorkspaceDestroyed"; lineNumber: 79 }
}
Component {
file: "hyprland_toplevel.hpp"
lineNumber: 20
name: "qs::hyprland::ipc::HyprlandToplevel"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Hyprland._Ipc/HyprlandToplevel 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
attachedType: "qs::hyprland::ipc::HyprlandToplevel"
Property {
name: "address"
type: "QString"
read: "addressStr"
notify: "addressChanged"
index: 0
lineNumber: 28
isReadonly: true
}
Property {
name: "handle"
type: "HyprlandToplevel"
isPointer: true
read: "hyprlandHandle"
notify: "hyprlandHandleChanged"
index: 1
lineNumber: 31
isReadonly: true
}
Property {
name: "wayland"
type: "qs::wayland::toplevel::Toplevel"
isPointer: true
read: "waylandHandle"
notify: "waylandHandleChanged"
index: 2
lineNumber: 33
isReadonly: true
}
Property {
name: "title"
type: "QString"
bindable: "bindableTitle"
read: "default"
notify: "titleChanged"
index: 3
lineNumber: 35
isReadonly: true
}
Property {
name: "activated"
type: "bool"
bindable: "bindableActivated"
read: "default"
notify: "activatedChanged"
index: 4
lineNumber: 37
isReadonly: true
}
Property {
name: "urgent"
type: "bool"
bindable: "bindableUrgent"
read: "default"
notify: "urgentChanged"
index: 5
lineNumber: 39
isReadonly: true
}
Property {
name: "lastIpcObject"
type: "QVariantMap"
bindable: "bindableLastIpcObject"
read: "default"
notify: "lastIpcObjectChanged"
index: 6
lineNumber: 45
isReadonly: true
}
Property {
name: "workspace"
type: "qs::hyprland::ipc::HyprlandWorkspace"
isPointer: true
bindable: "bindableWorkspace"
read: "default"
notify: "workspaceChanged"
index: 7
lineNumber: 47
isReadonly: true
}
Property {
name: "monitor"
type: "qs::hyprland::ipc::HyprlandMonitor"
isPointer: true
bindable: "bindableMonitor"
read: "default"
notify: "monitorChanged"
index: 8
lineNumber: 49
isReadonly: true
}
Signal { name: "addressChanged"; lineNumber: 90 }
Signal { name: "waylandHandleChanged"; lineNumber: 91 }
Signal { name: "hyprlandHandleChanged"; lineNumber: 92 }
Signal { name: "titleChanged"; lineNumber: 94 }
Signal { name: "activatedChanged"; lineNumber: 95 }
Signal { name: "urgentChanged"; lineNumber: 96 }
Signal { name: "workspaceChanged"; lineNumber: 97 }
Signal { name: "monitorChanged"; lineNumber: 98 }
Signal { name: "lastIpcObjectChanged"; lineNumber: 99 }
Method { name: "onActivatedChanged"; lineNumber: 102 }
}
Component {
file: "workspace.hpp"
lineNumber: 19
name: "qs::hyprland::ipc::HyprlandWorkspace"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Hyprland._Ipc/HyprlandWorkspace 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "address"
type: "QString"
bindable: "bindableAddress"
read: "default"
notify: "addressChanged"
index: 0
lineNumber: 25
isReadonly: true
}
Property {
name: "id"
type: "int"
bindable: "bindableId"
read: "default"
notify: "idChanged"
index: 1
lineNumber: 29
isReadonly: true
}
Property {
name: "name"
type: "QString"
bindable: "bindableName"
read: "default"
notify: "nameChanged"
index: 2
lineNumber: 30
isReadonly: true
}
Property {
name: "active"
type: "bool"
bindable: "bindableActive"
read: "default"
notify: "activeChanged"
index: 3
lineNumber: 32
isReadonly: true
}
Property {
name: "focused"
type: "bool"
bindable: "bindableFocused"
read: "default"
notify: "focusedChanged"
index: 4
lineNumber: 35
isReadonly: true
}
Property {
name: "urgent"
type: "bool"
bindable: "bindableUrgent"
read: "default"
notify: "urgentChanged"
index: 5
lineNumber: 38
isReadonly: true
}
Property {
name: "hasFullscreen"
type: "bool"
bindable: "bindableHasFullscreen"
read: "default"
notify: "hasFullscreenChanged"
index: 6
lineNumber: 40
isReadonly: true
}
Property {
name: "lastIpcObject"
type: "QVariantMap"
read: "lastIpcObject"
notify: "lastIpcObjectChanged"
index: 7
lineNumber: 46
isReadonly: true
}
Property {
name: "monitor"
type: "qs::hyprland::ipc::HyprlandMonitor"
isPointer: true
bindable: "bindableMonitor"
read: "default"
notify: "monitorChanged"
index: 8
lineNumber: 47
isReadonly: true
}
Property {
name: "toplevels"
type: "UntypedObjectModel"
isPointer: true
read: "toplevels"
index: 9
lineNumber: 50
isReadonly: true
isPropertyConstant: true
}
Signal { name: "addressChanged"; lineNumber: 87 }
Signal { name: "idChanged"; lineNumber: 88 }
Signal { name: "typeChanged"; lineNumber: 89 }
Signal { name: "nameChanged"; lineNumber: 90 }
Signal { name: "activeChanged"; lineNumber: 91 }
Signal { name: "focusedChanged"; lineNumber: 92 }
Signal { name: "urgentChanged"; lineNumber: 93 }
Signal { name: "hasFullscreenChanged"; lineNumber: 94 }
Signal { name: "lastIpcObjectChanged"; lineNumber: 95 }
Signal { name: "monitorChanged"; lineNumber: 96 }
Method { name: "onMonitorDestroyed"; lineNumber: 99 }
Method { name: "updateUrgent"; lineNumber: 100 }
Method { name: "activate"; lineNumber: 67 }
}
}
@@ -0,0 +1,9 @@
module Quickshell.Hyprland._SurfaceExtensions
linktarget quickshell-hyprland-surface-extensionsplugin
optional plugin quickshell-hyprland-surface-extensionsplugin
classname Quickshell_Hyprland__SurfaceExtensionsPlugin
typeinfo quickshell-hyprland-surface-extensions.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Hyprland/_SurfaceExtensions/
depends QtQuick
@@ -0,0 +1,50 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "qml.hpp"
lineNumber: 33
name: "qs::hyprland::surface::HyprlandWindow"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Hyprland._SurfaceExtensions/HyprlandWindow 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
attachedType: "qs::hyprland::surface::HyprlandWindow"
Property {
name: "opacity"
type: "double"
read: "opacity"
write: "setOpacity"
notify: "opacityChanged"
index: 0
lineNumber: 40
}
Property {
name: "visibleMask"
type: "PendingRegion"
isPointer: true
read: "visibleMask"
write: "setVisibleMask"
notify: "visibleMaskChanged"
index: 1
lineNumber: 45
}
Signal { name: "opacityChanged"; lineNumber: 65 }
Signal { name: "visibleMaskChanged"; lineNumber: 66 }
Method { name: "onWindowConnected"; lineNumber: 69 }
Method { name: "onWindowVisibleChanged"; lineNumber: 70 }
Method { name: "onWaylandWindowDestroyed"; lineNumber: 71 }
Method { name: "onWaylandSurfaceCreated"; lineNumber: 72 }
Method { name: "onWaylandSurfaceDestroyed"; lineNumber: 73 }
Method { name: "onProxyWindowDestroyed"; lineNumber: 74 }
Method { name: "onVisibleMaskDestroyed"; lineNumber: 75 }
Method { name: "onWindowPolished"; lineNumber: 76 }
Method { name: "updateVisibleMask"; lineNumber: 77 }
}
}
@@ -0,0 +1,11 @@
module Quickshell.Hyprland
linktarget quickshell-hyprlandplugin
optional plugin quickshell-hyprlandplugin
classname Quickshell_HyprlandPlugin
typeinfo quickshell-hyprland.qmltypes
import Quickshell.Hyprland._Ipc
import Quickshell.Hyprland._FocusGrab
import Quickshell.Hyprland._GlobalShortcuts
import Quickshell.Hyprland._SurfaceExtensions
prefer :/qt/qml/Quickshell/Hyprland/
@@ -0,0 +1,8 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {}
@@ -0,0 +1,10 @@
module Quickshell.I3._Ipc
linktarget quickshell-i3-ipcplugin
optional plugin quickshell-i3-ipcplugin
classname Quickshell_I3__IpcPlugin
typeinfo quickshell-i3-ipc.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/I3/_Ipc/
depends Quickshell
depends QtQuick
@@ -0,0 +1,413 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "connection.hpp"
lineNumber: 41
name: "qs::i3::ipc::I3IpcEvent"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.I3._Ipc/I3Event 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "type"
type: "QString"
read: "type"
index: 0
lineNumber: 44
isReadonly: true
isPropertyConstant: true
}
Property {
name: "data"
type: "QString"
read: "data"
index: 1
lineNumber: 45
isReadonly: true
isPropertyConstant: true
}
}
Component {
file: "listener.hpp"
lineNumber: 36
name: "qs::i3::ipc::I3IpcListener"
accessSemantics: "reference"
prototype: "PostReloadHook"
exports: ["Quickshell.I3._Ipc/I3IpcListener 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "subscriptions"
type: "QString"
isList: true
read: "subscriptions"
write: "setSubscriptions"
notify: "subscriptionsChanged"
index: 0
lineNumber: 40
}
Signal {
name: "ipcEvent"
lineNumber: 55
Parameter { name: "event"; type: "I3IpcEvent"; isPointer: true }
}
Signal { name: "subscriptionsChanged"; lineNumber: 56 }
}
Component {
file: "qml.hpp"
lineNumber: 15
name: "qs::i3::ipc::I3IpcQml"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.I3._Ipc/I3 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "socketPath"
type: "QString"
read: "socketPath"
index: 0
lineNumber: 19
isReadonly: true
isPropertyConstant: true
}
Property {
name: "focusedWorkspace"
type: "qs::i3::ipc::I3Workspace"
isPointer: true
bindable: "bindableFocusedWorkspace"
read: "default"
notify: "focusedWorkspaceChanged"
index: 1
lineNumber: 21
isReadonly: true
}
Property {
name: "focusedMonitor"
type: "qs::i3::ipc::I3Monitor"
isPointer: true
bindable: "bindableFocusedMonitor"
read: "default"
notify: "focusedMonitorChanged"
index: 2
lineNumber: 22
isReadonly: true
}
Property {
name: "monitors"
type: "UntypedObjectModel"
isPointer: true
read: "monitors"
index: 3
lineNumber: 25
isReadonly: true
isPropertyConstant: true
}
Property {
name: "workspaces"
type: "UntypedObjectModel"
isPointer: true
read: "workspaces"
index: 4
lineNumber: 28
isReadonly: true
isPropertyConstant: true
}
Signal {
name: "rawEvent"
lineNumber: 70
Parameter { name: "event"; type: "I3IpcEvent"; isPointer: true }
}
Signal { name: "connected"; lineNumber: 71 }
Signal { name: "focusedWorkspaceChanged"; lineNumber: 72 }
Signal { name: "focusedMonitorChanged"; lineNumber: 73 }
Method {
name: "dispatch"
lineNumber: 37
Parameter { name: "request"; type: "QString" }
}
Method { name: "refreshMonitors"; lineNumber: 40 }
Method { name: "refreshWorkspaces"; lineNumber: 43 }
Method {
name: "findWorkspaceByName"
type: "I3Workspace"
isPointer: true
lineNumber: 46
Parameter { name: "name"; type: "QString" }
}
Method {
name: "findMonitorByName"
type: "I3Monitor"
isPointer: true
lineNumber: 49
Parameter { name: "name"; type: "QString" }
}
Method {
name: "monitorFor"
type: "I3Monitor"
isPointer: true
lineNumber: 52
Parameter { name: "screen"; type: "QuickshellScreenInfo"; isPointer: true }
}
}
Component {
file: "monitor.hpp"
lineNumber: 12
name: "qs::i3::ipc::I3Monitor"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.I3._Ipc/I3Monitor 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "id"
type: "int"
bindable: "bindableId"
read: "default"
notify: "idChanged"
index: 0
lineNumber: 16
isReadonly: true
}
Property {
name: "name"
type: "QString"
bindable: "bindableName"
read: "default"
notify: "nameChanged"
index: 1
lineNumber: 18
isReadonly: true
}
Property {
name: "power"
type: "bool"
bindable: "bindablePower"
read: "default"
notify: "powerChanged"
index: 2
lineNumber: 20
isReadonly: true
}
Property {
name: "activeWorkspace"
type: "qs::i3::ipc::I3Workspace"
isPointer: true
bindable: "bindableActiveWorkspace"
read: "default"
notify: "activeWorkspaceChanged"
index: 3
lineNumber: 22
isReadonly: true
}
Property {
name: "focusedWorkspace"
type: "qs::i3::ipc::I3Workspace"
isPointer: true
bindable: "bindableActiveWorkspace"
read: "default"
notify: "activeWorkspaceChanged"
index: 4
lineNumber: 24
isReadonly: true
}
Property {
name: "x"
type: "int"
bindable: "bindableX"
read: "default"
notify: "xChanged"
index: 5
lineNumber: 26
isReadonly: true
}
Property {
name: "y"
type: "int"
bindable: "bindableY"
read: "default"
notify: "yChanged"
index: 6
lineNumber: 28
isReadonly: true
}
Property {
name: "width"
type: "int"
bindable: "bindableWidth"
read: "default"
notify: "widthChanged"
index: 7
lineNumber: 30
isReadonly: true
}
Property {
name: "height"
type: "int"
bindable: "bindableHeight"
read: "default"
notify: "heightChanged"
index: 8
lineNumber: 32
isReadonly: true
}
Property {
name: "scale"
type: "double"
bindable: "bindableScale"
read: "default"
notify: "scaleChanged"
index: 9
lineNumber: 34
isReadonly: true
}
Property {
name: "focused"
type: "bool"
bindable: "bindableFocused"
read: "default"
notify: "focusedChanged"
index: 10
lineNumber: 36
isReadonly: true
}
Property {
name: "lastIpcObject"
type: "QVariantMap"
read: "lastIpcObject"
notify: "lastIpcObjectChanged"
index: 11
lineNumber: 40
isReadonly: true
}
Signal { name: "idChanged"; lineNumber: 68 }
Signal { name: "nameChanged"; lineNumber: 69 }
Signal { name: "powerChanged"; lineNumber: 70 }
Signal { name: "activeWorkspaceChanged"; lineNumber: 71 }
Signal { name: "xChanged"; lineNumber: 72 }
Signal { name: "yChanged"; lineNumber: 73 }
Signal { name: "widthChanged"; lineNumber: 74 }
Signal { name: "heightChanged"; lineNumber: 75 }
Signal { name: "scaleChanged"; lineNumber: 76 }
Signal { name: "lastIpcObjectChanged"; lineNumber: 77 }
Signal { name: "focusedChanged"; lineNumber: 78 }
Method { name: "onActiveWorkspaceDestroyed"; lineNumber: 81 }
}
Component {
file: "workspace.hpp"
lineNumber: 15
name: "qs::i3::ipc::I3Workspace"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.I3._Ipc/I3Workspace 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "id"
type: "int"
bindable: "bindableId"
read: "default"
notify: "idChanged"
index: 0
lineNumber: 19
isReadonly: true
}
Property {
name: "name"
type: "QString"
bindable: "bindableName"
read: "default"
notify: "nameChanged"
index: 1
lineNumber: 21
isReadonly: true
}
Property {
name: "number"
type: "int"
bindable: "bindableNumber"
read: "default"
notify: "numberChanged"
index: 2
lineNumber: 23
isReadonly: true
}
Property {
name: "num"
type: "int"
bindable: "bindableNumber"
read: "default"
notify: "numberChanged"
index: 3
lineNumber: 25
isReadonly: true
}
Property {
name: "urgent"
type: "bool"
bindable: "bindableUrgent"
read: "default"
notify: "urgentChanged"
index: 4
lineNumber: 27
isReadonly: true
}
Property {
name: "active"
type: "bool"
bindable: "bindableActive"
read: "default"
notify: "activeChanged"
index: 5
lineNumber: 29
isReadonly: true
}
Property {
name: "focused"
type: "bool"
bindable: "bindableFocused"
read: "default"
notify: "focusedChanged"
index: 6
lineNumber: 32
isReadonly: true
}
Property {
name: "monitor"
type: "qs::i3::ipc::I3Monitor"
isPointer: true
bindable: "bindableMonitor"
read: "default"
notify: "monitorChanged"
index: 7
lineNumber: 34
isReadonly: true
}
Property {
name: "lastIpcObject"
type: "QVariantMap"
read: "lastIpcObject"
notify: "lastIpcObjectChanged"
index: 8
lineNumber: 38
isReadonly: true
}
Signal { name: "idChanged"; lineNumber: 68 }
Signal { name: "nameChanged"; lineNumber: 69 }
Signal { name: "urgentChanged"; lineNumber: 70 }
Signal { name: "activeChanged"; lineNumber: 71 }
Signal { name: "focusedChanged"; lineNumber: 72 }
Signal { name: "numberChanged"; lineNumber: 73 }
Signal { name: "monitorChanged"; lineNumber: 74 }
Signal { name: "lastIpcObjectChanged"; lineNumber: 75 }
Method { name: "onMonitorDestroyed"; lineNumber: 78 }
Method { name: "activate"; lineNumber: 52 }
}
}
@@ -0,0 +1,8 @@
module Quickshell.I3
linktarget quickshell-i3plugin
optional plugin quickshell-i3plugin
classname Quickshell_I3Plugin
typeinfo quickshell-i3.qmltypes
import Quickshell.I3._Ipc
prefer :/qt/qml/Quickshell/I3/
@@ -0,0 +1,8 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {}
@@ -0,0 +1,53 @@
import Quickshell.Io
FileViewInternal {
property bool preload: this.__preload;
property bool blockLoading: this.__blockLoading;
property bool blockAllReads: this.__blockAllReads;
property bool printErrors: this.__printErrors;
property string path: this.__path;
onPreloadChanged: this.__preload = preload;
onBlockLoadingChanged: this.__blockLoading = this.blockLoading;
onBlockAllReadsChanged: this.__blockAllReads = this.blockAllReads;
onPrintErrorsChanged: this.__printErrors = this.printErrors;
// Unfortunately path can't be kept as an empty string until the file loads
// without using QQmlPropertyValueInterceptor which is private. If we lean fully
// into using private code in the future, there will be no reason not to do it here.
onPathChanged: {
if (!this.preload) this.__preload = false;
this.__printErrors = this.printErrors;
this.__path = this.path;
if (this.preload) this.__preload = true;
}
// The C++ side can't force bindings to be resolved in a specific order so
// its done here. Functions are used to avoid the eager loading aspect of properties.
// Preload is set as it is below to avoid starting an async read from a preload
// if the user wants an initial blocking read.
function text(): string {
if (!this.preload) this.__preload = false;
this.__blockLoading = this.blockLoading;
this.__blockAllReads = this.blockAllReads;
this.__printErrors = this.printErrors;
this.__path = this.path;
const text = this.__text;
if (this.preload) this.__preload = true;
return text;
}
function data(): var {
if (!this.preload) this.__preload = false;
this.__blockLoading = this.blockLoading;
this.__blockAllReads = this.blockAllReads;
this.__printErrors = this.printErrors;
this.__path = this.path;
const data = this.__data;
if (this.preload) this.__preload = true;
return data;
}
}
@@ -0,0 +1,11 @@
module Quickshell.Io
linktarget quickshell-ioplugin
optional plugin quickshell-ioplugin
classname Quickshell_IoPlugin
typeinfo quickshell-io.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Io/
FileView 0.0 FileView.qml
depends Quickshell
depends QtQuick
@@ -0,0 +1,642 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "datastream.hpp"
lineNumber: 15
name: "DataStream"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Io/DataStream 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "parser"
type: "DataStreamParser"
isPointer: true
read: "reader"
write: "setReader"
notify: "readerChanged"
index: 0
lineNumber: 19
}
Signal { name: "readerChanged"; lineNumber: 30 }
Method { name: "onBytesAvailable"; lineNumber: 33 }
Method { name: "onReaderDestroyed"; lineNumber: 39 }
}
Component {
file: "datastream.hpp"
lineNumber: 48
name: "DataStreamParser"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Io/DataStreamParser 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Signal {
name: "read"
lineNumber: 62
Parameter { name: "data"; type: "QString" }
}
}
Component {
file: "process.hpp"
lineNumber: 34
name: "Process"
accessSemantics: "reference"
prototype: "PostReloadHook"
exports: ["Quickshell.Io/Process 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "running"
type: "bool"
read: "isRunning"
write: "setRunning"
notify: "runningChanged"
index: 0
lineNumber: 56
}
Property {
name: "processId"
type: "QVariant"
read: "processId"
notify: "processIdChanged"
index: 1
lineNumber: 58
isReadonly: true
}
Property {
name: "command"
type: "QString"
isList: true
read: "command"
write: "setCommand"
notify: "commandChanged"
index: 2
lineNumber: 76
}
Property {
name: "workingDirectory"
type: "QString"
read: "workingDirectory"
write: "setWorkingDirectory"
notify: "workingDirectoryChanged"
index: 3
lineNumber: 84
}
Property {
name: "environment"
type: "QVariantHash"
read: "environment"
write: "setEnvironment"
notify: "environmentChanged"
index: 4
lineNumber: 105
}
Property {
name: "clearEnvironment"
type: "bool"
read: "environmentCleared"
write: "setEnvironmentCleared"
notify: "environmentClearChanged"
index: 5
lineNumber: 125
}
Property {
name: "stdout"
type: "DataStreamParser"
isPointer: true
read: "stdoutParser"
write: "setStdoutParser"
notify: "stdoutParserChanged"
index: 6
lineNumber: 128
}
Property {
name: "stderr"
type: "DataStreamParser"
isPointer: true
read: "stderrParser"
write: "setStderrParser"
notify: "stderrParserChanged"
index: 7
lineNumber: 131
}
Property {
name: "stdinEnabled"
type: "bool"
read: "stdinEnabled"
write: "setStdinEnabled"
notify: "stdinEnabledChanged"
index: 8
lineNumber: 134
}
Signal { name: "started"; lineNumber: 220 }
Signal {
name: "exited"
lineNumber: 221
Parameter { name: "exitCode"; type: "int" }
Parameter { name: "exitStatus"; type: "QProcess::ExitStatus" }
}
Signal { name: "runningChanged"; lineNumber: 223 }
Signal { name: "processIdChanged"; lineNumber: 224 }
Signal { name: "commandChanged"; lineNumber: 225 }
Signal { name: "workingDirectoryChanged"; lineNumber: 226 }
Signal { name: "environmentChanged"; lineNumber: 227 }
Signal { name: "environmentClearChanged"; lineNumber: 228 }
Signal { name: "stdoutParserChanged"; lineNumber: 229 }
Signal { name: "stderrParserChanged"; lineNumber: 230 }
Signal { name: "stdinEnabledChanged"; lineNumber: 231 }
Method { name: "onStarted"; lineNumber: 234 }
Method {
name: "onFinished"
lineNumber: 235
Parameter { name: "exitCode"; type: "int" }
Parameter { name: "exitStatus"; type: "QProcess::ExitStatus" }
}
Method {
name: "onErrorOccurred"
lineNumber: 236
Parameter { name: "error"; type: "QProcess::ProcessError" }
}
Method { name: "onStdoutReadyRead"; lineNumber: 237 }
Method { name: "onStderrReadyRead"; lineNumber: 238 }
Method { name: "onStdoutParserDestroyed"; lineNumber: 239 }
Method { name: "onStderrParserDestroyed"; lineNumber: 240 }
Method { name: "onGlobalWorkingDirectoryChanged"; lineNumber: 241 }
Method {
name: "exec"
lineNumber: 146
Parameter { name: "command"; type: "QString"; isList: true }
}
Method {
name: "exec"
lineNumber: 177
Parameter { name: "context"; type: "qs::io::process::ProcessContext" }
}
Method {
name: "signal"
lineNumber: 180
Parameter { name: "signal"; type: "int" }
}
Method {
name: "write"
lineNumber: 183
Parameter { name: "data"; type: "QString" }
}
Method { name: "startDetached"; lineNumber: 191 }
}
Component {
file: "socket.hpp"
lineNumber: 20
name: "Socket"
accessSemantics: "reference"
prototype: "DataStream"
exports: ["Quickshell.Io/Socket 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "connected"
type: "bool"
read: "isConnected"
write: "setConnected"
notify: "connectionStateChanged"
index: 0
lineNumber: 27
}
Property {
name: "path"
type: "QString"
read: "path"
write: "setPath"
notify: "pathChanged"
index: 1
lineNumber: 31
}
Signal {
name: "error"
lineNumber: 56
Parameter { name: "error"; type: "QLocalSocket::LocalSocketError" }
}
Signal { name: "connectionStateChanged"; lineNumber: 58 }
Signal { name: "pathChanged"; lineNumber: 59 }
Method { name: "onSocketConnected"; lineNumber: 65 }
Method { name: "onSocketDisconnected"; lineNumber: 66 }
Method {
name: "onSocketError"
lineNumber: 67
Parameter { name: "error"; type: "QLocalSocket::LocalSocketError" }
}
Method {
name: "write"
lineNumber: 40
Parameter { name: "data"; type: "QString" }
}
Method { name: "flush"; lineNumber: 43 }
}
Component {
file: "socket.hpp"
lineNumber: 95
name: "SocketServer"
accessSemantics: "reference"
prototype: "Reloadable"
exports: ["Quickshell.Io/SocketServer 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "active"
type: "bool"
read: "isActive"
write: "setActive"
notify: "activeStatusChanged"
index: 0
lineNumber: 103
}
Property {
name: "path"
type: "QString"
read: "path"
write: "setPath"
notify: "pathChanged"
index: 1
lineNumber: 107
}
Property {
name: "handler"
type: "QQmlComponent"
isPointer: true
read: "handler"
write: "setHandler"
notify: "handlerChanged"
index: 2
lineNumber: 114
}
Signal { name: "activeStatusChanged"; lineNumber: 134 }
Signal { name: "pathChanged"; lineNumber: 135 }
Signal { name: "handlerChanged"; lineNumber: 136 }
Method { name: "onNewConnection"; lineNumber: 139 }
}
Component {
file: "datastream.hpp"
lineNumber: 67
name: "SplitParser"
accessSemantics: "reference"
prototype: "DataStreamParser"
exports: ["Quickshell.Io/SplitParser 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "splitMarker"
type: "QString"
read: "splitMarker"
write: "setSplitMarker"
notify: "splitMarkerChanged"
index: 0
lineNumber: 73
}
Signal { name: "splitMarkerChanged"; lineNumber: 86 }
}
Component {
file: "datastream.hpp"
lineNumber: 95
name: "StdioCollector"
accessSemantics: "reference"
prototype: "DataStreamParser"
exports: ["Quickshell.Io/StdioCollector 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "text"
type: "QString"
read: "text"
notify: "dataChanged"
index: 0
lineNumber: 100
isReadonly: true
}
Property {
name: "data"
type: "QByteArray"
read: "data"
notify: "dataChanged"
index: 1
lineNumber: 105
isReadonly: true
}
Property {
name: "waitForEnd"
type: "bool"
read: "waitForEnd"
write: "setWaitForEnd"
notify: "waitForEndChanged"
index: 2
lineNumber: 107
}
Signal { name: "waitForEndChanged"; lineNumber: 122 }
Signal { name: "dataChanged"; lineNumber: 123 }
Signal { name: "streamFinished"; lineNumber: 124 }
}
Component {
file: "fileview.hpp"
lineNumber: 164
name: "qs::io::FileView"
accessSemantics: "reference"
defaultProperty: "adapter"
prototype: "QObject"
exports: ["Quickshell.Io/FileViewInternal 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "blockWrites"
type: "bool"
bindable: "bindableBlockWrites"
read: "default"
write: "default"
notify: "blockWritesChanged"
index: 0
lineNumber: 201
}
Property {
name: "atomicWrites"
type: "bool"
bindable: "bindableAtomicWrites"
read: "default"
write: "default"
notify: "atomicWritesChanged"
index: 1
lineNumber: 207
}
Property {
name: "watchChanges"
type: "bool"
bindable: "bindableWatchChanges"
read: "default"
write: "default"
notify: "watchChangesChanged"
index: 2
lineNumber: 222
}
Property {
name: "adapter"
type: "FileViewAdapter"
isPointer: true
read: "adapter"
write: "setAdapter"
notify: "adapterChanged"
index: 3
lineNumber: 230
}
Property {
name: "__path"
type: "QString"
read: "path"
write: "setPath"
notify: "pathChanged"
index: 4
lineNumber: 232
}
Property {
name: "__text"
type: "QString"
read: "text"
notify: "internalTextChanged"
index: 5
lineNumber: 233
isReadonly: true
}
Property {
name: "__data"
type: "QByteArray"
read: "data"
notify: "internalDataChanged"
index: 6
lineNumber: 234
isReadonly: true
}
Property {
name: "__preload"
type: "bool"
read: "shouldPreload"
write: "setPreload"
notify: "preloadChanged"
index: 7
lineNumber: 235
}
Property {
name: "loaded"
type: "bool"
read: "isLoadedOrAsync"
notify: "loadedOrAsyncChanged"
index: 8
lineNumber: 241
isReadonly: true
}
Property {
name: "__blockLoading"
type: "bool"
read: "blockLoading"
write: "setBlockLoading"
notify: "blockLoadingChanged"
index: 9
lineNumber: 242
}
Property {
name: "__blockAllReads"
type: "bool"
read: "blockAllReads"
write: "setBlockAllReads"
notify: "blockAllReadsChanged"
index: 10
lineNumber: 243
}
Property {
name: "__printErrors"
type: "bool"
bindable: "bindablePrintErrors"
read: "default"
write: "default"
notify: "printErrorsChanged"
index: 11
lineNumber: 244
}
Signal { name: "loaded"; lineNumber: 338 }
Signal {
name: "loadFailed"
lineNumber: 340
Parameter { name: "error"; type: "qs::io::FileViewError::Enum" }
}
Signal { name: "saved"; lineNumber: 342 }
Signal {
name: "saveFailed"
lineNumber: 344
Parameter { name: "error"; type: "qs::io::FileViewError::Enum" }
}
Signal { name: "fileChanged"; lineNumber: 346 }
Signal { name: "adapterUpdated"; lineNumber: 348 }
Signal { name: "pathChanged"; lineNumber: 350 }
Signal { name: "internalTextChanged"; lineNumber: 351 }
Signal { name: "internalDataChanged"; lineNumber: 352 }
Signal { name: "textChanged"; lineNumber: 353 }
Signal { name: "dataChanged"; lineNumber: 354 }
Signal { name: "preloadChanged"; lineNumber: 355 }
Signal { name: "loadedOrAsyncChanged"; lineNumber: 356 }
Signal { name: "blockLoadingChanged"; lineNumber: 357 }
Signal { name: "blockAllReadsChanged"; lineNumber: 358 }
Signal { name: "blockWritesChanged"; lineNumber: 359 }
Signal { name: "atomicWritesChanged"; lineNumber: 360 }
Signal { name: "printErrorsChanged"; lineNumber: 361 }
Signal { name: "watchChangesChanged"; lineNumber: 362 }
Signal { name: "adapterChanged"; lineNumber: 363 }
Method { name: "operationFinished"; lineNumber: 366 }
Method { name: "onAdapterDestroyed"; lineNumber: 367 }
Method { name: "waitForJob"; type: "bool"; lineNumber: 293 }
Method { name: "reload"; lineNumber: 298 }
Method { name: "writeAdapter"; lineNumber: 300 }
Method {
name: "setData"
lineNumber: 316
Parameter { name: "data"; type: "QByteArray" }
}
Method {
name: "setText"
lineNumber: 324
Parameter { name: "text"; type: "QString" }
}
}
Component {
file: "fileview.hpp"
lineNumber: 436
name: "qs::io::FileViewAdapter"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Io/FileViewAdapter 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Signal { name: "adapterUpdated"; lineNumber: 448 }
Method { name: "onDataChanged"; lineNumber: 451 }
}
Component {
file: "fileview.hpp"
lineNumber: 25
name: "qs::io::FileViewError"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Io/FileViewError 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 31
values: [
"Success",
"Unknown",
"FileNotFound",
"PermissionDenied",
"NotAFile"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 46
Parameter { name: "value"; type: "qs::io::FileViewError::Enum" }
}
}
Component {
file: "jsonadapter.hpp"
lineNumber: 89
name: "qs::io::JsonAdapter"
accessSemantics: "reference"
prototype: "qs::io::FileViewAdapter"
interfaces: ["QQmlParserStatus"]
exports: ["Quickshell.Io/JsonAdapter 0.0"]
exportMetaObjectRevisions: [0]
Method { name: "onPropertyChanged"; lineNumber: 104 }
}
Component {
file: "jsonadapter.hpp"
lineNumber: 19
name: "qs::io::JsonObject"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Io/JsonObject 0.0"]
exportMetaObjectRevisions: [0]
}
Component {
file: "ipchandler.hpp"
lineNumber: 222
name: "qs::io::ipc::IpcHandler"
accessSemantics: "reference"
prototype: "PostReloadHook"
exports: ["Quickshell.Io/IpcHandler 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "enabled"
type: "bool"
read: "enabled"
write: "setEnabled"
notify: "enabledChanged"
index: 0
lineNumber: 225
}
Property {
name: "target"
type: "QString"
read: "target"
write: "setTarget"
notify: "targetChanged"
index: 1
lineNumber: 228
}
Signal { name: "enabledChanged"; lineNumber: 251 }
Signal { name: "targetChanged"; lineNumber: 252 }
Method {
name: "onSignalTriggered"
isMethodConstant: true
lineNumber: 255
Parameter { name: "signal"; type: "QString" }
Parameter { name: "value"; type: "QString" }
}
}
Component {
file: "processcore.hpp"
lineNumber: 14
name: "qs::io::process::ProcessContext"
accessSemantics: "value"
exports: ["Quickshell.Io/processContext 0.0"]
isStructured: true
exportMetaObjectRevisions: [0]
Property {
name: "command"
type: "QString"
isList: true
write: "setCommand"
index: 0
lineNumber: 15
}
Property {
name: "environment"
type: "QVariantHash"
write: "setEnvironment"
index: 1
lineNumber: 16
}
Property {
name: "clearEnvironment"
type: "bool"
write: "setClearEnvironment"
index: 2
lineNumber: 17
}
Property {
name: "workingDirectory"
type: "QString"
write: "setWorkingDirectory"
index: 3
lineNumber: 18
}
Property { name: "unbindStdout"; type: "bool"; write: "setUnbindStdout"; index: 4; lineNumber: 19 }
}
}
@@ -0,0 +1,9 @@
module Quickshell.Networking
linktarget quickshell-networkplugin
optional plugin quickshell-networkplugin
classname Quickshell_NetworkingPlugin
typeinfo quickshell-network.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Networking/
depends Quickshell
@@ -0,0 +1,614 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "enums.hpp"
lineNumber: 67
name: "qs::network::ConnectionFailReason"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Networking/ConnectionFailReason 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 73
values: [
"Unknown",
"NoSecrets",
"WifiClientDisconnected",
"WifiClientFailed",
"WifiAuthTimeout",
"WifiNetworkLost"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 88
Parameter { name: "reason"; type: "ConnectionFailReason::Enum" }
}
}
Component {
file: "enums.hpp"
lineNumber: 49
name: "qs::network::ConnectionState"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Networking/ConnectionState 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 55
values: [
"Unknown",
"Connecting",
"Connected",
"Disconnecting",
"Disconnected"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 63
Parameter { name: "state"; type: "ConnectionState::Enum" }
}
}
Component {
file: "enums.hpp"
lineNumber: 92
name: "qs::network::DeviceType"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Networking/DeviceType 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 98
values: ["None", "Wifi", "Wired"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 104
Parameter { name: "type"; type: "DeviceType::Enum" }
}
}
Component {
file: "network.hpp"
lineNumber: 21
name: "qs::network::Network"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Networking/Network 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "name"
type: "QString"
bindable: "bindableName"
read: "default"
notify: "nameChanged"
index: 0
lineNumber: 28
isReadonly: true
}
Property {
name: "device"
type: "NetworkDevice"
isPointer: true
read: "device"
index: 1
lineNumber: 30
isReadonly: true
isPropertyConstant: true
}
Property {
name: "nmSettings"
type: "QList<NMSettings*>"
bindable: "bindableNmSettings"
read: "default"
notify: "nmSettingsChanged"
index: 2
lineNumber: 34
isReadonly: true
}
Property {
name: "connected"
type: "bool"
bindable: "bindableConnected"
read: "default"
notify: "connectedChanged"
index: 3
lineNumber: 36
isReadonly: true
}
Property {
name: "known"
type: "bool"
bindable: "bindableKnown"
read: "default"
notify: "knownChanged"
index: 4
lineNumber: 38
isReadonly: true
}
Property {
name: "state"
type: "ConnectionState::Enum"
bindable: "bindableState"
read: "default"
notify: "stateChanged"
index: 5
lineNumber: 40
isReadonly: true
}
Property {
name: "stateChanging"
type: "bool"
bindable: "bindableStateChanging"
read: "default"
notify: "stateChangingChanged"
index: 6
lineNumber: 42
isReadonly: true
}
Signal {
name: "connectionFailed"
lineNumber: 80
Parameter { name: "reason"; type: "ConnectionFailReason::Enum" }
}
Signal { name: "nameChanged"; lineNumber: 82 }
Signal { name: "connectedChanged"; lineNumber: 83 }
Signal { name: "knownChanged"; lineNumber: 84 }
Signal { name: "stateChanged"; lineNumber: 85 }
Signal { name: "stateChangingChanged"; lineNumber: 86 }
Signal { name: "nmSettingsChanged"; lineNumber: 87 }
Signal { name: "requestConnect"; lineNumber: 88 }
Signal {
name: "requestConnectWithSettings"
lineNumber: 89
Parameter { name: "settings"; type: "NMSettings"; isPointer: true }
}
Signal { name: "requestDisconnect"; lineNumber: 90 }
Signal { name: "requestForget"; lineNumber: 91 }
Method { name: "connect"; lineNumber: 52 }
Method {
name: "connectWithSettings"
lineNumber: 56
Parameter { name: "settings"; type: "NMSettings"; isPointer: true }
}
Method { name: "disconnect"; lineNumber: 58 }
Method { name: "forget"; lineNumber: 60 }
}
Component {
file: "enums.hpp"
lineNumber: 34
name: "qs::network::NetworkBackendType"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Networking/NetworkBackendType 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 40
values: ["None", "NetworkManager"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 45
Parameter { name: "type"; type: "NetworkBackendType::Enum" }
}
}
Component {
file: "enums.hpp"
lineNumber: 10
name: "qs::network::NetworkConnectivity"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Networking/NetworkConnectivity 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 16
values: ["Unknown", "None", "Portal", "Limited", "Full"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 30
Parameter { name: "conn"; type: "NetworkConnectivity::Enum" }
}
}
Component {
file: "device.hpp"
lineNumber: 18
name: "qs::network::NetworkDevice"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Networking/NetworkDevice 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "type"
type: "DeviceType::Enum"
read: "type"
index: 0
lineNumber: 28
isReadonly: true
isPropertyConstant: true
}
Property {
name: "name"
type: "QString"
bindable: "bindableName"
read: "name"
notify: "nameChanged"
index: 1
lineNumber: 30
isReadonly: true
}
Property {
name: "networks"
type: "UntypedObjectModel"
isPointer: true
read: "networks"
index: 2
lineNumber: 35
isReadonly: true
isPropertyConstant: true
}
Property {
name: "address"
type: "QString"
bindable: "bindableAddress"
read: "default"
notify: "addressChanged"
index: 3
lineNumber: 37
isReadonly: true
}
Property {
name: "connected"
type: "bool"
bindable: "bindableConnected"
read: "default"
notify: "connectedChanged"
index: 4
lineNumber: 39
isReadonly: true
}
Property {
name: "state"
type: "qs::network::ConnectionState::Enum"
bindable: "bindableState"
read: "default"
notify: "stateChanged"
index: 5
lineNumber: 41
isReadonly: true
}
Property {
name: "nmManaged"
type: "bool"
read: "nmManaged"
write: "setNmManaged"
notify: "nmManagedChanged"
index: 6
lineNumber: 45
}
Property {
name: "autoconnect"
type: "bool"
read: "autoconnect"
write: "setAutoconnect"
notify: "autoconnectChanged"
index: 7
lineNumber: 47
}
Signal { name: "requestDisconnect"; lineNumber: 74 }
Signal {
name: "requestSetAutoconnect"
lineNumber: 75
Parameter { name: "autoconnect"; type: "bool" }
}
Signal {
name: "requestSetNmManaged"
lineNumber: 76
Parameter { name: "managed"; type: "bool" }
}
Signal { name: "nameChanged"; lineNumber: 77 }
Signal { name: "addressChanged"; lineNumber: 78 }
Signal { name: "connectedChanged"; lineNumber: 79 }
Signal { name: "stateChanged"; lineNumber: 80 }
Signal { name: "nmManagedChanged"; lineNumber: 81 }
Signal { name: "autoconnectChanged"; lineNumber: 82 }
Method { name: "disconnect"; lineNumber: 54 }
}
Component {
file: "qml.hpp"
lineNumber: 79
name: "qs::network::NetworkingQml"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Networking/Networking 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "devices"
type: "UntypedObjectModel"
isPointer: true
read: "devices"
index: 0
lineNumber: 86
isReadonly: true
isPropertyConstant: true
}
Property {
name: "backend"
type: "qs::network::NetworkBackendType::Enum"
read: "backend"
index: 1
lineNumber: 88
isReadonly: true
isPropertyConstant: true
}
Property {
name: "wifiEnabled"
type: "bool"
read: "wifiEnabled"
write: "setWifiEnabled"
notify: "wifiEnabledChanged"
index: 2
lineNumber: 90
}
Property {
name: "wifiHardwareEnabled"
type: "bool"
bindable: "bindableWifiHardwareEnabled"
read: "default"
notify: "wifiHardwareEnabledChanged"
index: 3
lineNumber: 92
isReadonly: true
}
Property {
name: "canCheckConnectivity"
type: "bool"
bindable: "bindableCanCheckConnectivity"
read: "default"
notify: "canCheckConnectivityChanged"
index: 4
lineNumber: 94
isReadonly: true
}
Property {
name: "connectivityCheckEnabled"
type: "bool"
read: "connectivityCheckEnabled"
write: "setConnectivityCheckEnabled"
notify: "connectivityCheckEnabledChanged"
index: 5
lineNumber: 96
}
Property {
name: "connectivity"
type: "qs::network::NetworkConnectivity::Enum"
bindable: "bindableConnectivity"
read: "default"
notify: "connectivityChanged"
index: 6
lineNumber: 106
isReadonly: true
}
Signal { name: "wifiEnabledChanged"; lineNumber: 144 }
Signal { name: "wifiHardwareEnabledChanged"; lineNumber: 145 }
Signal { name: "canCheckConnectivityChanged"; lineNumber: 146 }
Signal { name: "connectivityCheckEnabledChanged"; lineNumber: 147 }
Signal { name: "connectivityChanged"; lineNumber: 148 }
Method { name: "checkConnectivity"; lineNumber: 114 }
}
Component {
file: "wifi.hpp"
lineNumber: 57
name: "qs::network::WifiDevice"
accessSemantics: "reference"
prototype: "qs::network::NetworkDevice"
exports: ["Quickshell.Networking/WifiDevice 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "scannerEnabled"
type: "bool"
bindable: "bindableScannerEnabled"
read: "scannerEnabled"
write: "setScannerEnabled"
notify: "scannerEnabledChanged"
index: 0
lineNumber: 65
}
Property {
name: "mode"
type: "WifiDeviceMode::Enum"
bindable: "bindableMode"
read: "default"
notify: "modeChanged"
index: 1
lineNumber: 67
isReadonly: true
}
Signal { name: "modeChanged"; lineNumber: 79 }
Signal {
name: "scannerEnabledChanged"
lineNumber: 80
Parameter { name: "enabled"; type: "bool" }
}
}
Component {
file: "enums.hpp"
lineNumber: 133
name: "qs::network::WifiDeviceMode"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Networking/WifiDeviceMode 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 139
values: ["AdHoc", "Station", "AccessPoint", "Mesh", "Unknown"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 152
Parameter { name: "mode"; type: "WifiDeviceMode::Enum" }
}
}
Component {
file: "wifi.hpp"
lineNumber: 17
name: "qs::network::WifiNetwork"
accessSemantics: "reference"
prototype: "qs::network::Network"
exports: ["Quickshell.Networking/WifiNetwork 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "signalStrength"
type: "double"
bindable: "bindableSignalStrength"
read: "default"
notify: "signalStrengthChanged"
index: 0
lineNumber: 23
isReadonly: true
}
Property {
name: "security"
type: "WifiSecurityType::Enum"
bindable: "bindableSecurity"
read: "default"
notify: "securityChanged"
index: 1
lineNumber: 25
isReadonly: true
}
Signal {
name: "requestConnectWithPsk"
lineNumber: 45
Parameter { name: "psk"; type: "QString" }
}
Signal { name: "signalStrengthChanged"; lineNumber: 46 }
Signal { name: "securityChanged"; lineNumber: 47 }
Method {
name: "connectWithPsk"
lineNumber: 39
Parameter { name: "psk"; type: "QString" }
}
}
Component {
file: "enums.hpp"
lineNumber: 108
name: "qs::network::WifiSecurityType"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Networking/WifiSecurityType 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 114
values: [
"Wpa3SuiteB192",
"Sae",
"Wpa2Eap",
"Wpa2Psk",
"WpaEap",
"WpaPsk",
"StaticWep",
"DynamicWep",
"Leap",
"Owe",
"Open",
"Unknown"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 129
Parameter { name: "type"; type: "WifiSecurityType::Enum" }
}
}
Component {
file: "wired.hpp"
lineNumber: 15
name: "qs::network::WiredDevice"
accessSemantics: "reference"
prototype: "qs::network::NetworkDevice"
exports: ["Quickshell.Networking/WiredDevice 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "network"
type: "Network"
isPointer: true
bindable: "bindableNetwork"
read: "network"
notify: "networkChanged"
index: 0
lineNumber: 23
isReadonly: true
}
Property {
name: "linkSpeed"
type: "uint"
bindable: "bindableLinkSpeed"
read: "default"
notify: "linkSpeedChanged"
index: 1
lineNumber: 25
isReadonly: true
}
Property {
name: "hasLink"
type: "bool"
bindable: "bindableHasLink"
read: "default"
notify: "hasLinkChanged"
index: 2
lineNumber: 27
isReadonly: true
}
Signal { name: "networkChanged"; lineNumber: 41 }
Signal { name: "linkSpeedChanged"; lineNumber: 42 }
Signal { name: "hasLinkChanged"; lineNumber: 43 }
}
}
@@ -0,0 +1,9 @@
module Quickshell.Services.Greetd
linktarget quickshell-service-greetdplugin
optional plugin quickshell-service-greetdplugin
classname Quickshell_Services_GreetdPlugin
typeinfo quickshell-service-greetd.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Services/Greetd/
depends QtQuick
@@ -0,0 +1,127 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "qml.hpp"
lineNumber: 16
name: "Greetd"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Greetd/Greetd 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "available"
type: "bool"
read: "isAvailable"
index: 0
lineNumber: 19
isReadonly: true
isPropertyConstant: true
}
Property {
name: "state"
type: "GreetdState::Enum"
read: "state"
notify: "stateChanged"
index: 1
lineNumber: 21
isReadonly: true
}
Property {
name: "user"
type: "QString"
read: "user"
notify: "userChanged"
index: 2
lineNumber: 23
isReadonly: true
}
Signal {
name: "authMessage"
lineNumber: 78
Parameter { name: "message"; type: "QString" }
Parameter { name: "error"; type: "bool" }
Parameter { name: "responseRequired"; type: "bool" }
Parameter { name: "echoResponse"; type: "bool" }
}
Signal {
name: "authFailure"
lineNumber: 82
Parameter { name: "message"; type: "QString" }
}
Signal { name: "readyToLaunch"; lineNumber: 84 }
Signal { name: "launched"; lineNumber: 89 }
Signal {
name: "error"
lineNumber: 91
Parameter { name: "error"; type: "QString" }
}
Signal { name: "stateChanged"; lineNumber: 93 }
Signal { name: "userChanged"; lineNumber: 94 }
Method {
name: "createSession"
lineNumber: 31
Parameter { name: "user"; type: "QString" }
}
Method { name: "cancelSession"; lineNumber: 33 }
Method {
name: "respond"
lineNumber: 37
Parameter { name: "response"; type: "QString" }
}
Method {
name: "launch"
lineNumber: 44
Parameter { name: "command"; type: "QString"; isList: true }
}
Method {
name: "launch"
lineNumber: 47
Parameter { name: "command"; type: "QString"; isList: true }
Parameter { name: "environment"; type: "QString"; isList: true }
}
Method {
name: "launch"
lineNumber: 59
Parameter { name: "command"; type: "QString"; isList: true }
Parameter { name: "environment"; type: "QString"; isList: true }
Parameter { name: "quit"; type: "bool" }
}
}
Component {
file: "connection.hpp"
lineNumber: 15
name: "GreetdState"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Greetd/GreetdState 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 21
values: [
"Inactive",
"Authenticating",
"ReadyToLaunch",
"Launching",
"Launched"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 30
Parameter { name: "value"; type: "GreetdState::Enum" }
}
}
}
@@ -0,0 +1,9 @@
module Quickshell.Services.Mpris
linktarget quickshell-service-mprisplugin
optional plugin quickshell-service-mprisplugin
classname Quickshell_Services_MprisPlugin
typeinfo quickshell-service-mpris.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Services/Mpris/
depends Quickshell
@@ -0,0 +1,529 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "player.hpp"
lineNumber: 38
name: "qs::service::mpris::MprisLoopState"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Mpris/MprisLoopState 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 44
values: ["None", "Track", "Playlist"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 51
Parameter { name: "status"; type: "qs::service::mpris::MprisLoopState::Enum" }
}
}
Component {
file: "player.hpp"
lineNumber: 20
name: "qs::service::mpris::MprisPlaybackState"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Mpris/MprisPlaybackState 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 26
values: ["Stopped", "Playing", "Paused"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 33
Parameter { name: "status"; type: "qs::service::mpris::MprisPlaybackState::Enum" }
}
}
Component {
file: "player.hpp"
lineNumber: 87
name: "qs::service::mpris::MprisPlayer"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Mpris/MprisPlayer 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "canControl"
type: "bool"
bindable: "bindableCanControl"
read: "default"
notify: "canControlChanged"
index: 0
lineNumber: 90
isReadonly: true
}
Property {
name: "canPlay"
type: "bool"
bindable: "bindableCanPlay"
read: "default"
notify: "canPlayChanged"
index: 1
lineNumber: 91
isReadonly: true
}
Property {
name: "canPause"
type: "bool"
bindable: "bindableCanPause"
read: "default"
notify: "canPauseChanged"
index: 2
lineNumber: 92
isReadonly: true
}
Property {
name: "canTogglePlaying"
type: "bool"
bindable: "bindableCanTogglePlaying"
read: "default"
notify: "canTogglePlayingChanged"
index: 3
lineNumber: 93
isReadonly: true
}
Property {
name: "canSeek"
type: "bool"
bindable: "bindableCanSeek"
read: "default"
notify: "canSeekChanged"
index: 4
lineNumber: 94
isReadonly: true
}
Property {
name: "canGoNext"
type: "bool"
bindable: "bindableCanGoNext"
read: "default"
notify: "canGoNextChanged"
index: 5
lineNumber: 95
isReadonly: true
}
Property {
name: "canGoPrevious"
type: "bool"
bindable: "bindableCanGoPrevious"
read: "default"
notify: "canGoPreviousChanged"
index: 6
lineNumber: 96
isReadonly: true
}
Property {
name: "canQuit"
type: "bool"
bindable: "bindableCanQuit"
read: "default"
notify: "canQuitChanged"
index: 7
lineNumber: 97
isReadonly: true
}
Property {
name: "canRaise"
type: "bool"
bindable: "bindableCanRaise"
read: "default"
notify: "canRaiseChanged"
index: 8
lineNumber: 98
isReadonly: true
}
Property {
name: "canSetFullscreen"
type: "bool"
bindable: "bindableCanSetFullscreen"
read: "default"
notify: "canSetFullscreenChanged"
index: 9
lineNumber: 99
isReadonly: true
}
Property {
name: "identity"
type: "QString"
bindable: "bindableIdentity"
read: "default"
notify: "identityChanged"
index: 10
lineNumber: 101
isReadonly: true
}
Property {
name: "desktopEntry"
type: "QString"
bindable: "bindableDesktopEntry"
read: "default"
notify: "desktopEntryChanged"
index: 11
lineNumber: 103
isReadonly: true
}
Property {
name: "dbusName"
type: "QString"
read: "address"
index: 12
lineNumber: 105
isReadonly: true
isPropertyConstant: true
}
Property {
name: "position"
type: "double"
read: "position"
write: "setPosition"
notify: "positionChanged"
index: 13
lineNumber: 139
}
Property {
name: "positionSupported"
type: "bool"
read: "positionSupported"
notify: "positionSupportedChanged"
index: 14
lineNumber: 140
isReadonly: true
}
Property {
name: "length"
type: "double"
read: "length"
notify: "lengthChanged"
index: 15
lineNumber: 143
isReadonly: true
}
Property {
name: "lengthSupported"
type: "bool"
bindable: "bindableLengthSupported"
read: "default"
notify: "lengthSupportedChanged"
index: 16
lineNumber: 144
isReadonly: true
}
Property {
name: "volume"
type: "double"
read: "volume"
write: "setVolume"
notify: "volumeChanged"
index: 17
lineNumber: 148
}
Property {
name: "volumeSupported"
type: "bool"
read: "volumeSupported"
notify: "volumeSupportedChanged"
index: 18
lineNumber: 149
isReadonly: true
}
Property {
name: "metadata"
type: "QVariantMap"
bindable: "bindableMetadata"
read: "default"
notify: "metadataChanged"
index: 19
lineNumber: 158
isReadonly: true
}
Property {
name: "uniqueId"
type: "uint"
bindable: "bindableUniqueId"
read: "default"
notify: "uniqueIdChanged"
index: 20
lineNumber: 163
isReadonly: true
}
Property {
name: "trackTitle"
type: "QString"
bindable: "bindableTrackTitle"
read: "default"
notify: "trackTitleChanged"
index: 21
lineNumber: 168
isReadonly: true
}
Property {
name: "trackArtist"
type: "QString"
bindable: "bindableTrackArtist"
read: "default"
notify: "trackArtistChanged"
index: 22
lineNumber: 173
isReadonly: true
}
Property {
name: "trackArtists"
type: "QString"
bindable: "bindableTrackArtist"
read: "default"
notify: "trackArtistChanged"
index: 23
lineNumber: 175
isReadonly: true
}
Property {
name: "trackAlbum"
type: "QString"
bindable: "bindableTrackAlbum"
read: "default"
notify: "trackAlbumChanged"
index: 24
lineNumber: 180
isReadonly: true
}
Property {
name: "trackAlbumArtist"
type: "QString"
bindable: "bindableTrackAlbumArtist"
read: "default"
notify: "trackAlbumArtistChanged"
index: 25
lineNumber: 185
isReadonly: true
}
Property {
name: "trackArtUrl"
type: "QString"
bindable: "bindableTrackArtUrl"
read: "default"
notify: "trackArtUrlChanged"
index: 26
lineNumber: 187
isReadonly: true
}
Property {
name: "playbackState"
type: "qs::service::mpris::MprisPlaybackState::Enum"
read: "playbackState"
write: "setPlaybackState"
notify: "playbackStateChanged"
index: 27
lineNumber: 194
}
Property {
name: "isPlaying"
type: "bool"
read: "isPlaying"
write: "setPlaying"
notify: "isPlayingChanged"
index: 28
lineNumber: 199
}
Property {
name: "loopState"
type: "qs::service::mpris::MprisLoopState::Enum"
read: "loopState"
write: "setLoopState"
notify: "loopStateChanged"
index: 29
lineNumber: 203
}
Property {
name: "loopSupported"
type: "bool"
read: "loopSupported"
notify: "loopSupportedChanged"
index: 30
lineNumber: 204
isReadonly: true
}
Property {
name: "rate"
type: "double"
read: "rate"
write: "setRate"
notify: "rateChanged"
index: 31
lineNumber: 211
}
Property {
name: "minRate"
type: "double"
bindable: "bindableMinRate"
read: "default"
notify: "minRateChanged"
index: 32
lineNumber: 212
isReadonly: true
}
Property {
name: "maxRate"
type: "double"
bindable: "bindableMaxRate"
read: "default"
notify: "maxRateChanged"
index: 33
lineNumber: 213
isReadonly: true
}
Property {
name: "shuffle"
type: "bool"
read: "shuffle"
write: "setShuffle"
notify: "shuffleChanged"
index: 34
lineNumber: 217
}
Property {
name: "shuffleSupported"
type: "bool"
read: "shuffleSupported"
notify: "shuffleSupportedChanged"
index: 35
lineNumber: 218
isReadonly: true
}
Property {
name: "fullscreen"
type: "bool"
read: "fullscreen"
write: "setFullscreen"
notify: "fullscreenChanged"
index: 36
lineNumber: 222
}
Property {
name: "supportedUriSchemes"
type: "QString"
isList: true
bindable: "bindableSupportedUriSchemes"
read: "default"
notify: "supportedUriSchemesChanged"
index: 37
lineNumber: 224
isReadonly: true
}
Property {
name: "supportedMimeTypes"
type: "QString"
isList: true
bindable: "bindableSupportedMimeTypes"
read: "default"
notify: "supportedMimeTypesChanged"
index: 38
lineNumber: 226
isReadonly: true
}
Signal { name: "trackChanged"; lineNumber: 359 }
Signal { name: "postTrackChanged"; lineNumber: 365 }
Signal { name: "ready"; lineNumber: 367 }
Signal { name: "canControlChanged"; lineNumber: 368 }
Signal { name: "canPlayChanged"; lineNumber: 369 }
Signal { name: "canPauseChanged"; lineNumber: 370 }
Signal { name: "canTogglePlayingChanged"; lineNumber: 371 }
Signal { name: "canSeekChanged"; lineNumber: 372 }
Signal { name: "canGoNextChanged"; lineNumber: 373 }
Signal { name: "canGoPreviousChanged"; lineNumber: 374 }
Signal { name: "canQuitChanged"; lineNumber: 375 }
Signal { name: "canRaiseChanged"; lineNumber: 376 }
Signal { name: "canSetFullscreenChanged"; lineNumber: 377 }
Signal { name: "identityChanged"; lineNumber: 378 }
Signal { name: "desktopEntryChanged"; lineNumber: 379 }
Signal { name: "positionChanged"; lineNumber: 380 }
Signal { name: "positionSupportedChanged"; lineNumber: 381 }
Signal { name: "lengthChanged"; lineNumber: 382 }
Signal { name: "lengthSupportedChanged"; lineNumber: 383 }
Signal { name: "volumeChanged"; lineNumber: 384 }
Signal { name: "volumeSupportedChanged"; lineNumber: 385 }
Signal { name: "metadataChanged"; lineNumber: 386 }
Signal { name: "uniqueIdChanged"; lineNumber: 387 }
Signal { name: "trackTitleChanged"; lineNumber: 388 }
Signal { name: "trackArtistChanged"; lineNumber: 389 }
Signal { name: "trackAlbumChanged"; lineNumber: 390 }
Signal { name: "trackAlbumArtistChanged"; lineNumber: 391 }
Signal { name: "trackArtUrlChanged"; lineNumber: 392 }
Signal { name: "playbackStateChanged"; lineNumber: 393 }
Signal { name: "isPlayingChanged"; lineNumber: 394 }
Signal { name: "loopStateChanged"; lineNumber: 395 }
Signal { name: "loopSupportedChanged"; lineNumber: 396 }
Signal { name: "rateChanged"; lineNumber: 397 }
Signal { name: "minRateChanged"; lineNumber: 398 }
Signal { name: "maxRateChanged"; lineNumber: 399 }
Signal { name: "shuffleChanged"; lineNumber: 400 }
Signal { name: "shuffleSupportedChanged"; lineNumber: 401 }
Signal { name: "fullscreenChanged"; lineNumber: 402 }
Signal { name: "supportedUriSchemesChanged"; lineNumber: 403 }
Signal { name: "supportedMimeTypesChanged"; lineNumber: 404 }
Method { name: "onGetAllFinished"; lineNumber: 407 }
Method { name: "onExportedPositionChanged"; lineNumber: 408 }
Method {
name: "onSeek"
lineNumber: 409
Parameter { name: "time"; type: "qlonglong" }
}
Method { name: "raise"; lineNumber: 237 }
Method { name: "quit"; lineNumber: 241 }
Method {
name: "openUri"
lineNumber: 246
Parameter { name: "uri"; type: "QString" }
}
Method { name: "next"; lineNumber: 250 }
Method { name: "previous"; lineNumber: 254 }
Method {
name: "seek"
lineNumber: 261
Parameter { name: "offset"; type: "double" }
}
Method { name: "play"; lineNumber: 263 }
Method { name: "pause"; lineNumber: 265 }
Method { name: "stop"; lineNumber: 267 }
Method { name: "togglePlaying"; lineNumber: 272 }
}
Component {
file: "watcher.hpp"
lineNumber: 45
name: "qs::service::mpris::MprisQml"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Mpris/Mpris 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "players"
type: "UntypedObjectModel"
isPointer: true
read: "players"
index: 0
lineNumber: 51
isReadonly: true
isPropertyConstant: true
}
}
}
@@ -0,0 +1,9 @@
module Quickshell.Services.Notifications
linktarget quickshell-service-notificationsplugin
optional plugin quickshell-service-notificationsplugin
classname Quickshell_Services_NotificationsPlugin
typeinfo quickshell-service-notifications.qmltypes
prefer :/qt/qml/Quickshell/Services/Notifications/
depends Quickshell
depends QtQuick
@@ -0,0 +1,441 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "notification.hpp"
lineNumber: 66
name: "qs::service::notifications::Notification"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Notifications/Notification 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "id"
type: "uint"
read: "id"
index: 0
lineNumber: 72
isReadonly: true
isPropertyConstant: true
}
Property {
name: "tracked"
type: "bool"
read: "isTracked"
write: "setTracked"
notify: "trackedChanged"
index: 1
lineNumber: 76
}
Property {
name: "lastGeneration"
type: "bool"
read: "isLastGeneration"
index: 2
lineNumber: 82
isReadonly: true
isPropertyConstant: true
}
Property {
name: "expireTimeout"
type: "double"
bindable: "bindableExpireTimeout"
read: "default"
notify: "expireTimeoutChanged"
index: 3
lineNumber: 84
isReadonly: true
}
Property {
name: "appName"
type: "QString"
bindable: "bindableAppName"
read: "default"
notify: "appNameChanged"
index: 4
lineNumber: 86
isReadonly: true
}
Property {
name: "appIcon"
type: "QString"
bindable: "bindableAppIcon"
read: "default"
notify: "appIconChanged"
index: 5
lineNumber: 89
isReadonly: true
}
Property {
name: "summary"
type: "QString"
bindable: "bindableSummary"
read: "default"
notify: "summaryChanged"
index: 6
lineNumber: 91
isReadonly: true
}
Property {
name: "body"
type: "QString"
bindable: "bindableBody"
read: "default"
notify: "bodyChanged"
index: 7
lineNumber: 92
isReadonly: true
}
Property {
name: "urgency"
type: "qs::service::notifications::NotificationUrgency::Enum"
bindable: "bindableUrgency"
read: "default"
notify: "urgencyChanged"
index: 8
lineNumber: 93
isReadonly: true
}
Property {
name: "actions"
type: "QList<qs::service::notifications::NotificationAction*>"
read: "actions"
notify: "actionsChanged"
index: 9
lineNumber: 95
isReadonly: true
}
Property {
name: "hasActionIcons"
type: "bool"
bindable: "bindableHasActionIcons"
read: "default"
notify: "hasActionIconsChanged"
index: 10
lineNumber: 99
isReadonly: true
}
Property {
name: "resident"
type: "bool"
bindable: "bindableResident"
read: "default"
notify: "residentChanged"
index: 11
lineNumber: 101
isReadonly: true
}
Property {
name: "transient"
type: "bool"
bindable: "bindableTransient"
read: "default"
notify: "transientChanged"
index: 12
lineNumber: 103
isReadonly: true
}
Property {
name: "desktopEntry"
type: "QString"
bindable: "bindableDesktopEntry"
read: "default"
notify: "desktopEntryChanged"
index: 13
lineNumber: 105
isReadonly: true
}
Property {
name: "image"
type: "QString"
bindable: "bindableImage"
read: "default"
notify: "imageChanged"
index: 14
lineNumber: 109
isReadonly: true
}
Property {
name: "hasInlineReply"
type: "bool"
bindable: "bindableHasInlineReply"
read: "default"
notify: "hasInlineReplyChanged"
index: 15
lineNumber: 113
isReadonly: true
}
Property {
name: "inlineReplyPlaceholder"
type: "QString"
bindable: "bindableInlineReplyPlaceholder"
read: "default"
notify: "inlineReplyPlaceholderChanged"
index: 16
lineNumber: 115
isReadonly: true
}
Property {
name: "hints"
type: "QVariantMap"
bindable: "bindableHints"
read: "default"
notify: "hintsChanged"
index: 17
lineNumber: 118
isReadonly: true
}
Signal {
name: "closed"
lineNumber: 188
Parameter { name: "reason"; type: "qs::service::notifications::NotificationCloseReason::Enum" }
}
Signal { name: "trackedChanged"; lineNumber: 190 }
Signal { name: "expireTimeoutChanged"; lineNumber: 191 }
Signal { name: "appNameChanged"; lineNumber: 192 }
Signal { name: "appIconChanged"; lineNumber: 193 }
Signal { name: "summaryChanged"; lineNumber: 194 }
Signal { name: "bodyChanged"; lineNumber: 195 }
Signal { name: "urgencyChanged"; lineNumber: 196 }
Signal { name: "actionsChanged"; lineNumber: 197 }
Signal { name: "hasActionIconsChanged"; lineNumber: 198 }
Signal { name: "residentChanged"; lineNumber: 199 }
Signal { name: "transientChanged"; lineNumber: 200 }
Signal { name: "desktopEntryChanged"; lineNumber: 201 }
Signal { name: "imageChanged"; lineNumber: 202 }
Signal { name: "hasInlineReplyChanged"; lineNumber: 203 }
Signal { name: "inlineReplyPlaceholderChanged"; lineNumber: 204 }
Signal { name: "hintsChanged"; lineNumber: 205 }
Method { name: "expire"; lineNumber: 128 }
Method { name: "dismiss"; lineNumber: 131 }
Method {
name: "sendInlineReply"
lineNumber: 137
Parameter { name: "replyText"; type: "QString" }
}
}
Component {
file: "notification.hpp"
lineNumber: 241
name: "qs::service::notifications::NotificationAction"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Notifications/NotificationAction 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "identifier"
type: "QString"
read: "identifier"
index: 0
lineNumber: 247
isReadonly: true
isPropertyConstant: true
}
Property {
name: "text"
type: "QString"
read: "text"
notify: "textChanged"
index: 1
lineNumber: 249
isReadonly: true
}
Signal { name: "textChanged"; lineNumber: 268 }
Method { name: "invoke"; lineNumber: 261 }
}
Component {
file: "notification.hpp"
lineNumber: 39
name: "qs::service::notifications::NotificationCloseReason"
accessSemantics: "reference"
prototype: "QObject"
exports: [
"Quickshell.Services.Notifications/NotificationCloseReason 0.0"
]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 45
values: ["Expired", "Dismissed", "CloseRequested"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 56
Parameter { name: "value"; type: "qs::service::notifications::NotificationCloseReason::Enum" }
}
}
Component {
file: "qml.hpp"
lineNumber: 24
name: "qs::service::notifications::NotificationServerQml"
accessSemantics: "reference"
prototype: "PostReloadHook"
exports: ["Quickshell.Services.Notifications/NotificationServer 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "keepOnReload"
type: "bool"
read: "keepOnReload"
write: "setKeepOnReload"
notify: "keepOnReloadChanged"
index: 0
lineNumber: 31
}
Property {
name: "persistenceSupported"
type: "bool"
read: "persistenceSupported"
write: "setPersistenceSupported"
notify: "persistenceSupportedChanged"
index: 1
lineNumber: 34
}
Property {
name: "bodySupported"
type: "bool"
read: "bodySupported"
write: "setBodySupported"
notify: "bodySupportedChanged"
index: 2
lineNumber: 40
}
Property {
name: "bodyMarkupSupported"
type: "bool"
read: "bodyMarkupSupported"
write: "setBodyMarkupSupported"
notify: "bodyMarkupSupportedChanged"
index: 3
lineNumber: 47
}
Property {
name: "bodyHyperlinksSupported"
type: "bool"
read: "bodyHyperlinksSupported"
write: "setBodyHyperlinksSupported"
notify: "bodyHyperlinksSupportedChanged"
index: 4
lineNumber: 54
}
Property {
name: "bodyImagesSupported"
type: "bool"
read: "bodyImagesSupported"
write: "setBodyImagesSupported"
notify: "bodyImagesSupportedChanged"
index: 5
lineNumber: 61
}
Property {
name: "actionsSupported"
type: "bool"
read: "actionsSupported"
write: "setActionsSupported"
notify: "actionsSupportedChanged"
index: 6
lineNumber: 63
}
Property {
name: "actionIconsSupported"
type: "bool"
read: "actionIconsSupported"
write: "setActionIconsSupported"
notify: "actionIconsSupportedChanged"
index: 7
lineNumber: 65
}
Property {
name: "imageSupported"
type: "bool"
read: "imageSupported"
write: "setImageSupported"
notify: "imageSupportedChanged"
index: 8
lineNumber: 67
}
Property {
name: "inlineReplySupported"
type: "bool"
read: "inlineReplySupported"
write: "setInlineReplySupported"
notify: "inlineReplySupportedChanged"
index: 9
lineNumber: 69
}
Property {
name: "trackedNotifications"
type: "UntypedObjectModel"
isPointer: true
read: "trackedNotifications"
notify: "trackedNotificationsChanged"
index: 10
lineNumber: 72
isReadonly: true
}
Property {
name: "extraHints"
type: "QString"
isList: true
read: "extraHints"
write: "setExtraHints"
notify: "extraHintsChanged"
index: 11
lineNumber: 74
}
Signal {
name: "notification"
lineNumber: 120
Parameter {
name: "notification"
type: "qs::service::notifications::Notification"
isPointer: true
}
}
Signal { name: "keepOnReloadChanged"; lineNumber: 122 }
Signal { name: "persistenceSupportedChanged"; lineNumber: 123 }
Signal { name: "bodySupportedChanged"; lineNumber: 124 }
Signal { name: "bodyMarkupSupportedChanged"; lineNumber: 125 }
Signal { name: "bodyHyperlinksSupportedChanged"; lineNumber: 126 }
Signal { name: "bodyImagesSupportedChanged"; lineNumber: 127 }
Signal { name: "actionsSupportedChanged"; lineNumber: 128 }
Signal { name: "actionIconsSupportedChanged"; lineNumber: 129 }
Signal { name: "imageSupportedChanged"; lineNumber: 130 }
Signal { name: "inlineReplySupportedChanged"; lineNumber: 131 }
Signal { name: "extraHintsChanged"; lineNumber: 132 }
Signal { name: "trackedNotificationsChanged"; lineNumber: 133 }
}
Component {
file: "notification.hpp"
lineNumber: 21
name: "qs::service::notifications::NotificationUrgency"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Notifications/NotificationUrgency 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 27
values: ["Low", "Normal", "Critical"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 34
Parameter { name: "value"; type: "qs::service::notifications::NotificationUrgency::Enum" }
}
}
}
@@ -0,0 +1,9 @@
module Quickshell.Services.Pam
linktarget quickshell-service-pamplugin
optional plugin quickshell-service-pamplugin
classname Quickshell_Services_PamPlugin
typeinfo quickshell-service-pam.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Services/Pam/
depends QtQuick
@@ -0,0 +1,181 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "qml.hpp"
lineNumber: 20
name: "PamContext"
accessSemantics: "reference"
prototype: "QObject"
interfaces: ["QQmlParserStatus"]
exports: ["Quickshell.Services.Pam/PamContext 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "active"
type: "bool"
read: "isActive"
write: "setActive"
notify: "activeChanged"
index: 0
lineNumber: 31
}
Property {
name: "config"
type: "QString"
read: "config"
write: "setConfig"
notify: "configChanged"
index: 1
lineNumber: 37
}
Property {
name: "configDirectory"
type: "QString"
read: "configDirectory"
write: "setConfigDirectory"
notify: "configDirectoryChanged"
index: 2
lineNumber: 45
}
Property {
name: "user"
type: "QString"
read: "user"
write: "setUser"
notify: "userChanged"
index: 3
lineNumber: 49
}
Property {
name: "message"
type: "QString"
read: "message"
notify: "messageChanged"
index: 4
lineNumber: 51
isReadonly: true
}
Property {
name: "messageIsError"
type: "bool"
read: "messageIsError"
notify: "messageIsErrorChanged"
index: 5
lineNumber: 53
isReadonly: true
}
Property {
name: "responseRequired"
type: "bool"
read: "isResponseRequired"
notify: "responseRequiredChanged"
index: 6
lineNumber: 57
isReadonly: true
}
Property {
name: "responseVisible"
type: "bool"
read: "isResponseVisible"
notify: "responseVisibleChanged"
index: 7
lineNumber: 59
isReadonly: true
}
Signal {
name: "completed"
lineNumber: 101
Parameter { name: "result"; type: "PamResult::Enum" }
}
Signal {
name: "error"
lineNumber: 105
Parameter { name: "error"; type: "PamError::Enum" }
}
Signal { name: "pamMessage"; lineNumber: 109 }
Signal { name: "activeChanged"; lineNumber: 111 }
Signal { name: "configChanged"; lineNumber: 112 }
Signal { name: "configDirectoryChanged"; lineNumber: 113 }
Signal { name: "userChanged"; lineNumber: 114 }
Signal { name: "messageChanged"; lineNumber: 115 }
Signal { name: "messageIsErrorChanged"; lineNumber: 116 }
Signal { name: "responseRequiredChanged"; lineNumber: 117 }
Signal { name: "responseVisibleChanged"; lineNumber: 118 }
Method {
name: "onCompleted"
lineNumber: 121
Parameter { name: "result"; type: "PamResult::Enum" }
}
Method {
name: "onError"
lineNumber: 122
Parameter { name: "error"; type: "PamError::Enum" }
}
Method {
name: "onMessage"
lineNumber: 123
Parameter { name: "message"; type: "QString" }
Parameter { name: "isError"; type: "bool" }
Parameter { name: "responseRequired"; type: "bool" }
Parameter { name: "responseVisible"; type: "bool" }
}
Method { name: "start"; type: "bool"; lineNumber: 72 }
Method { name: "abort"; lineNumber: 75 }
Method {
name: "respond"
lineNumber: 80
Parameter { name: "response"; type: "QString" }
}
}
Component {
file: "conversation.hpp"
lineNumber: 41
name: "PamError"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pam/PamError 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 47
values: ["StartFailed", "TryAuthFailed", "InternalError"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 58
Parameter { name: "value"; type: "PamError::Enum" }
}
}
Component {
file: "conversation.hpp"
lineNumber: 18
name: "PamResult"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pam/PamResult 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 24
values: ["Success", "Failed", "Error", "MaxTries"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 36
Parameter { name: "value"; type: "PamResult::Enum" }
}
}
}
@@ -0,0 +1,10 @@
module Quickshell.Services.Pipewire
linktarget quickshell-service-pipewireplugin
optional plugin quickshell-service-pipewireplugin
classname Quickshell_Services_PipewirePlugin
typeinfo quickshell-service-pipewire.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Services/Pipewire/
depends Quickshell
depends QtQuick
@@ -0,0 +1,646 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "qml.hpp"
lineNumber: 56
name: "qs::service::pipewire::Pipewire"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pipewire/Pipewire 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "nodes"
type: "UntypedObjectModel"
isPointer: true
read: "nodes"
index: 0
lineNumber: 67
isReadonly: true
isPropertyConstant: true
}
Property {
name: "links"
type: "UntypedObjectModel"
isPointer: true
read: "links"
index: 1
lineNumber: 79
isReadonly: true
isPropertyConstant: true
}
Property {
name: "linkGroups"
type: "UntypedObjectModel"
isPointer: true
read: "linkGroups"
index: 2
lineNumber: 87
isReadonly: true
isPropertyConstant: true
}
Property {
name: "defaultAudioSink"
type: "qs::service::pipewire::PwNodeIface"
isPointer: true
read: "defaultAudioSink"
notify: "defaultAudioSinkChanged"
index: 3
lineNumber: 97
isReadonly: true
}
Property {
name: "defaultAudioSource"
type: "qs::service::pipewire::PwNodeIface"
isPointer: true
read: "defaultAudioSource"
notify: "defaultAudioSourceChanged"
index: 4
lineNumber: 107
isReadonly: true
}
Property {
name: "preferredDefaultAudioSink"
type: "qs::service::pipewire::PwNodeIface"
isPointer: true
read: "defaultConfiguredAudioSink"
write: "setDefaultConfiguredAudioSink"
notify: "defaultConfiguredAudioSinkChanged"
index: 5
lineNumber: 114
}
Property {
name: "preferredDefaultAudioSource"
type: "qs::service::pipewire::PwNodeIface"
isPointer: true
read: "defaultConfiguredAudioSource"
write: "setDefaultConfiguredAudioSource"
notify: "defaultConfiguredAudioSourceChanged"
index: 6
lineNumber: 121
}
Property {
name: "ready"
type: "bool"
read: "isReady"
notify: "readyChanged"
index: 7
lineNumber: 128
isReadonly: true
}
Signal { name: "defaultAudioSinkChanged"; lineNumber: 152 }
Signal { name: "defaultAudioSourceChanged"; lineNumber: 153 }
Signal { name: "defaultConfiguredAudioSinkChanged"; lineNumber: 155 }
Signal { name: "defaultConfiguredAudioSourceChanged"; lineNumber: 156 }
Signal { name: "readyChanged"; lineNumber: 158 }
Method {
name: "onNodeAdded"
lineNumber: 161
Parameter { name: "node"; type: "PwNode"; isPointer: true }
}
Method {
name: "onNodeRemoved"
lineNumber: 162
Parameter { name: "object"; type: "QObject"; isPointer: true }
}
Method {
name: "onLinkAdded"
lineNumber: 163
Parameter { name: "link"; type: "PwLink"; isPointer: true }
}
Method {
name: "onLinkRemoved"
lineNumber: 164
Parameter { name: "object"; type: "QObject"; isPointer: true }
}
Method {
name: "onLinkGroupAdded"
lineNumber: 165
Parameter { name: "group"; type: "PwLinkGroup"; isPointer: true }
}
Method {
name: "onLinkGroupRemoved"
lineNumber: 166
Parameter { name: "object"; type: "QObject"; isPointer: true }
}
}
Component {
file: "node.hpp"
lineNumber: 27
name: "qs::service::pipewire::PwAudioChannel"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pipewire/PwAudioChannel 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
lineNumber: 33
values: [
"Unknown",
"NA",
"Mono",
"FrontCenter",
"FrontLeft",
"FrontRight",
"FrontLeftCenter",
"FrontRightCenter",
"FrontLeftWide",
"FrontRightWide",
"FrontCenterHigh",
"FrontLeftHigh",
"FrontRightHigh",
"LowFrequencyEffects",
"LowFrequencyEffects2",
"LowFrequencyEffectsLeft",
"LowFrequencyEffectsRight",
"SideLeft",
"SideRight",
"RearCenter",
"RearLeft",
"RearRight",
"RearLeftCenter",
"RearRightCenter",
"TopCenter",
"TopFrontCenter",
"TopFrontLeft",
"TopFrontRight",
"TopFrontLeftCenter",
"TopFrontRightCenter",
"TopSideLeft",
"TopSideRight",
"TopRearCenter",
"TopRearLeft",
"TopRearRight",
"BottomCenter",
"BottomLeftCenter",
"BottomRightCenter",
"AuxRangeStart",
"AuxRangeEnd",
"CustomRangeStart"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 89
Parameter { name: "value"; type: "qs::service::pipewire::PwAudioChannel::Enum" }
}
}
Component {
file: "qml.hpp"
lineNumber: 388
name: "qs::service::pipewire::PwLinkGroupIface"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pipewire/PwLinkGroup 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "target"
type: "qs::service::pipewire::PwNodeIface"
isPointer: true
read: "target"
index: 0
lineNumber: 393
isReadonly: true
isPropertyConstant: true
}
Property {
name: "source"
type: "qs::service::pipewire::PwNodeIface"
isPointer: true
read: "source"
index: 1
lineNumber: 395
isReadonly: true
isPropertyConstant: true
}
Property {
name: "state"
type: "qs::service::pipewire::PwLinkState::Enum"
read: "state"
notify: "stateChanged"
index: 2
lineNumber: 399
isReadonly: true
}
Signal { name: "stateChanged"; lineNumber: 420 }
}
Component {
file: "qml.hpp"
lineNumber: 350
name: "qs::service::pipewire::PwLinkIface"
accessSemantics: "reference"
prototype: "qs::service::pipewire::PwObjectIface"
exports: ["Quickshell.Services.Pipewire/PwLink 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "id"
type: "uint"
read: "id"
index: 0
lineNumber: 356
isReadonly: true
isPropertyConstant: true
}
Property {
name: "target"
type: "qs::service::pipewire::PwNodeIface"
isPointer: true
read: "target"
index: 1
lineNumber: 358
isReadonly: true
isPropertyConstant: true
}
Property {
name: "source"
type: "qs::service::pipewire::PwNodeIface"
isPointer: true
read: "source"
index: 2
lineNumber: 360
isReadonly: true
isPropertyConstant: true
}
Property {
name: "state"
type: "PwLinkState::Enum"
read: "state"
notify: "stateChanged"
index: 3
lineNumber: 364
isReadonly: true
}
Signal { name: "stateChanged"; lineNumber: 380 }
}
Component {
file: "link.hpp"
lineNumber: 18
name: "qs::service::pipewire::PwLinkState"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pipewire/PwLinkState 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "qint8"
lineNumber: 24
values: [
"Error",
"Unlinked",
"Init",
"Negotiating",
"Allocating",
"Paused",
"Active"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 35
Parameter { name: "value"; type: "qs::service::pipewire::PwLinkState::Enum" }
}
}
Component {
file: "qml.hpp"
lineNumber: 220
name: "qs::service::pipewire::PwNodeAudioIface"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pipewire/PwNodeAudio 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "muted"
type: "bool"
read: "isMuted"
write: "setMuted"
notify: "mutedChanged"
index: 0
lineNumber: 226
}
Property {
name: "volume"
type: "float"
read: "averageVolume"
write: "setAverageVolume"
notify: "volumesChanged"
index: 1
lineNumber: 231
}
Property {
name: "channels"
type: "qs::service::pipewire::PwAudioChannel::Enum"
isList: true
read: "channels"
notify: "channelsChanged"
index: 2
lineNumber: 235
isReadonly: true
}
Property {
name: "volumes"
type: "float"
isList: true
read: "volumes"
write: "setVolumes"
notify: "volumesChanged"
index: 3
lineNumber: 241
}
Signal { name: "mutedChanged"; lineNumber: 261 }
Signal { name: "channelsChanged"; lineNumber: 262 }
Signal { name: "volumesChanged"; lineNumber: 263 }
}
Component {
file: "qml.hpp"
lineNumber: 270
name: "qs::service::pipewire::PwNodeIface"
accessSemantics: "reference"
prototype: "qs::service::pipewire::PwObjectIface"
exports: ["Quickshell.Services.Pipewire/PwNode 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "id"
type: "uint"
read: "id"
index: 0
lineNumber: 276
isReadonly: true
isPropertyConstant: true
}
Property {
name: "name"
type: "QString"
read: "name"
index: 1
lineNumber: 278
isReadonly: true
isPropertyConstant: true
}
Property {
name: "description"
type: "QString"
read: "description"
index: 2
lineNumber: 282
isReadonly: true
isPropertyConstant: true
}
Property {
name: "nickname"
type: "QString"
read: "nickname"
index: 3
lineNumber: 286
isReadonly: true
isPropertyConstant: true
}
Property {
name: "isSink"
type: "bool"
read: "isSink"
index: 4
lineNumber: 289
isReadonly: true
isPropertyConstant: true
}
Property {
name: "isStream"
type: "bool"
read: "isStream"
index: 5
lineNumber: 292
isReadonly: true
isPropertyConstant: true
}
Property {
name: "type"
type: "qs::service::pipewire::PwNodeType::Flags"
read: "type"
index: 6
lineNumber: 294
isReadonly: true
isPropertyConstant: true
}
Property {
name: "properties"
type: "QVariantMap"
read: "properties"
notify: "propertiesChanged"
index: 7
lineNumber: 307
isReadonly: true
}
Property {
name: "audio"
type: "qs::service::pipewire::PwNodeAudioIface"
isPointer: true
read: "audio"
index: 8
lineNumber: 312
isReadonly: true
isPropertyConstant: true
}
Property {
name: "ready"
type: "bool"
read: "isReady"
notify: "readyChanged"
index: 9
lineNumber: 317
isReadonly: true
}
Signal { name: "propertiesChanged"; lineNumber: 339 }
Signal { name: "readyChanged"; lineNumber: 340 }
}
Component {
file: "qml.hpp"
lineNumber: 175
name: "qs::service::pipewire::PwNodeLinkTracker"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pipewire/PwNodeLinkTracker 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "node"
type: "qs::service::pipewire::PwNodeIface"
isPointer: true
read: "node"
write: "setNode"
notify: "nodeChanged"
index: 0
lineNumber: 179
}
Property {
name: "linkGroups"
type: "qs::service::pipewire::PwLinkGroupIface"
isList: true
read: "linkGroups"
notify: "linkGroupsChanged"
index: 1
lineNumber: 184
isReadonly: true
}
Signal { name: "nodeChanged"; lineNumber: 197 }
Signal { name: "linkGroupsChanged"; lineNumber: 198 }
Method { name: "onNodeDestroyed"; lineNumber: 201 }
Method {
name: "onLinkGroupCreated"
lineNumber: 202
Parameter { name: "linkGroup"; type: "PwLinkGroup"; isPointer: true }
}
Method {
name: "onLinkGroupDestroyed"
lineNumber: 203
Parameter { name: "object"; type: "QObject"; isPointer: true }
}
}
Component {
file: "peak.hpp"
lineNumber: 21
name: "qs::service::pipewire::PwNodePeakMonitor"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pipewire/PwNodePeakMonitor 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "node"
type: "qs::service::pipewire::PwNodeIface"
isPointer: true
read: "node"
write: "setNode"
notify: "nodeChanged"
index: 0
lineNumber: 25
}
Property {
name: "enabled"
type: "bool"
read: "isEnabled"
write: "setEnabled"
notify: "enabledChanged"
index: 1
lineNumber: 27
}
Property {
name: "peaks"
type: "float"
isList: true
read: "peaks"
notify: "peaksChanged"
index: 2
lineNumber: 31
isReadonly: true
}
Property {
name: "peak"
type: "float"
read: "peak"
notify: "peakChanged"
index: 3
lineNumber: 33
isReadonly: true
}
Property {
name: "channels"
type: "qs::service::pipewire::PwAudioChannel::Enum"
isList: true
read: "channels"
notify: "channelsChanged"
index: 4
lineNumber: 35
isReadonly: true
}
Signal { name: "nodeChanged"; lineNumber: 55 }
Signal { name: "enabledChanged"; lineNumber: 56 }
Signal { name: "peaksChanged"; lineNumber: 57 }
Signal { name: "peakChanged"; lineNumber: 58 }
Signal { name: "channelsChanged"; lineNumber: 59 }
Method { name: "onNodeDestroyed"; lineNumber: 62 }
}
Component {
file: "node.hpp"
lineNumber: 93
name: "qs::service::pipewire::PwNodeType"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pipewire/PwNodeType 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Flag"
type: "quint8"
lineNumber: 99
values: [
"Untracked",
"Audio",
"Video",
"Stream",
"Source",
"Sink",
"AudioSink",
"AudioSource",
"AudioDuplex",
"AudioOutStream",
"AudioInStream",
"VideoSource",
"VideoSink"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 151
Parameter { name: "type"; type: "qs::service::pipewire::PwNodeType::Flags" }
}
}
Component {
file: "qml.hpp"
lineNumber: 33
name: "qs::service::pipewire::PwObjectIface"
accessSemantics: "reference"
prototype: "QObject"
Method { name: "onObjectDestroying"; lineNumber: 48 }
}
Component {
file: "qml.hpp"
lineNumber: 437
name: "qs::service::pipewire::PwObjectTracker"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Pipewire/PwObjectTracker 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "objects"
type: "QObjectList"
read: "objects"
write: "setObjects"
notify: "objectsChanged"
index: 0
lineNumber: 440
}
Signal { name: "objectsChanged"; lineNumber: 452 }
Method {
name: "objectDestroyed"
lineNumber: 455
Parameter { name: "object"; type: "QObject"; isPointer: true }
}
}
}
@@ -0,0 +1,9 @@
module Quickshell.Services.Polkit
linktarget quickshell-service-polkitplugin
optional plugin quickshell-service-polkitplugin
classname Quickshell_Services_PolkitPlugin
typeinfo quickshell-service-polkit.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Services/Polkit/
depends QtQuick
@@ -0,0 +1,251 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "flow.hpp"
lineNumber: 14
name: "qs::service::polkit::AuthFlow"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.Polkit/AuthFlow 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "message"
type: "QString"
read: "message"
index: 0
lineNumber: 24
isReadonly: true
isPropertyConstant: true
}
Property {
name: "iconName"
type: "QString"
read: "iconName"
index: 1
lineNumber: 31
isReadonly: true
isPropertyConstant: true
}
Property {
name: "actionId"
type: "QString"
read: "actionId"
index: 2
lineNumber: 36
isReadonly: true
isPropertyConstant: true
}
Property {
name: "cookie"
type: "QString"
read: "cookie"
index: 3
lineNumber: 41
isReadonly: true
isPropertyConstant: true
}
Property {
name: "identities"
type: "QList<Identity*>"
read: "identities"
index: 4
lineNumber: 48
isReadonly: true
isPropertyConstant: true
}
Property {
name: "selectedIdentity"
type: "Identity"
isPointer: true
bindable: "selectedIdentity"
read: "default"
write: "setSelectedIdentity"
notify: "selectedIdentityChanged"
index: 5
lineNumber: 53
}
Property {
name: "isResponseRequired"
type: "bool"
bindable: "isResponseRequired"
read: "default"
notify: "isResponseRequiredChanged"
index: 6
lineNumber: 57
isReadonly: true
}
Property {
name: "inputPrompt"
type: "QString"
bindable: "inputPrompt"
read: "default"
notify: "inputPromptChanged"
index: 7
lineNumber: 60
isReadonly: true
}
Property {
name: "responseVisible"
type: "bool"
bindable: "responseVisible"
read: "default"
notify: "responseVisibleChanged"
index: 8
lineNumber: 63
isReadonly: true
}
Property {
name: "supplementaryMessage"
type: "QString"
bindable: "supplementaryMessage"
read: "default"
notify: "supplementaryMessageChanged"
index: 9
lineNumber: 69
isReadonly: true
}
Property {
name: "supplementaryIsError"
type: "bool"
bindable: "supplementaryIsError"
read: "default"
notify: "supplementaryIsErrorChanged"
index: 10
lineNumber: 72
isReadonly: true
}
Property {
name: "isCompleted"
type: "bool"
bindable: "isCompleted"
read: "default"
notify: "isCompletedChanged"
index: 11
lineNumber: 75
isReadonly: true
}
Property {
name: "isSuccessful"
type: "bool"
bindable: "isSuccessful"
read: "default"
notify: "isSuccessfulChanged"
index: 12
lineNumber: 78
isReadonly: true
}
Property {
name: "isCancelled"
type: "bool"
bindable: "isCancelled"
read: "default"
notify: "isCancelledChanged"
index: 13
lineNumber: 81
isReadonly: true
}
Property {
name: "failed"
type: "bool"
bindable: "failed"
read: "default"
notify: "failedChanged"
index: 14
lineNumber: 84
isReadonly: true
}
Signal { name: "authenticationSucceeded"; lineNumber: 124 }
Signal { name: "authenticationFailed"; lineNumber: 135 }
Signal { name: "authenticationRequestCancelled"; lineNumber: 138 }
Signal { name: "selectedIdentityChanged"; lineNumber: 140 }
Signal { name: "isResponseRequiredChanged"; lineNumber: 141 }
Signal { name: "inputPromptChanged"; lineNumber: 142 }
Signal { name: "responseVisibleChanged"; lineNumber: 143 }
Signal { name: "supplementaryMessageChanged"; lineNumber: 144 }
Signal { name: "supplementaryIsErrorChanged"; lineNumber: 145 }
Signal { name: "isCompletedChanged"; lineNumber: 146 }
Signal { name: "isSuccessfulChanged"; lineNumber: 147 }
Signal { name: "isCancelledChanged"; lineNumber: 148 }
Signal { name: "failedChanged"; lineNumber: 149 }
Method {
name: "request"
lineNumber: 153
Parameter { name: "message"; type: "QString" }
Parameter { name: "echo"; type: "bool" }
}
Method {
name: "completed"
lineNumber: 154
Parameter { name: "gainedAuthorization"; type: "bool" }
}
Method {
name: "showError"
lineNumber: 155
Parameter { name: "message"; type: "QString" }
}
Method {
name: "showInfo"
lineNumber: 156
Parameter { name: "message"; type: "QString" }
}
Method {
name: "submit"
lineNumber: 95
Parameter { name: "value"; type: "QString" }
}
Method { name: "cancelAuthenticationRequest"; lineNumber: 97 }
}
Component {
file: "qml.hpp"
lineNumber: 25
name: "qs::service::polkit::PolkitAgent"
accessSemantics: "reference"
prototype: "QObject"
interfaces: ["QQmlParserStatus"]
exports: ["Quickshell.Services.Polkit/PolkitAgent 0.0"]
exportMetaObjectRevisions: [0]
Property { name: "path"; type: "QString"; read: "path"; write: "setPath"; index: 0; lineNumber: 36 }
Property {
name: "isRegistered"
type: "bool"
bindable: "isRegistered"
read: "default"
notify: "isRegisteredChanged"
index: 1
lineNumber: 39
isReadonly: true
}
Property {
name: "isActive"
type: "bool"
bindable: "isActive"
read: "default"
notify: "isActiveChanged"
index: 2
lineNumber: 45
isReadonly: true
}
Property {
name: "flow"
type: "AuthFlow"
isPointer: true
bindable: "flow"
read: "default"
notify: "flowChanged"
index: 3
lineNumber: 50
isReadonly: true
}
Signal { name: "authenticationRequestStarted"; lineNumber: 71 }
Signal { name: "isRegisteredChanged"; lineNumber: 73 }
Signal { name: "isActiveChanged"; lineNumber: 74 }
Signal { name: "flowChanged"; lineNumber: 75 }
}
}
@@ -0,0 +1,11 @@
module Quickshell.Services.SystemTray
linktarget quickshell-service-statusnotifierplugin
optional plugin quickshell-service-statusnotifierplugin
classname Quickshell_Services_SystemTrayPlugin
typeinfo quickshell-service-statusnotifier.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Services/SystemTray/
depends Quickshell
depends Quickshell.DBusMenu
depends QtQuick
@@ -0,0 +1,211 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "qml.hpp"
lineNumber: 16
name: "SystemTray"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.SystemTray/SystemTray 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "items"
type: "UntypedObjectModel"
isPointer: true
read: "items"
index: 0
lineNumber: 20
isReadonly: true
isPropertyConstant: true
}
Method {
name: "onItemRegistered"
lineNumber: 30
Parameter { name: "item"; type: "qs::service::sni::StatusNotifierItem"; isPointer: true }
}
Method {
name: "onItemUnregistered"
lineNumber: 31
Parameter { name: "item"; type: "qs::service::sni::StatusNotifierItem"; isPointer: true }
}
}
Component {
file: "item.hpp"
lineNumber: 43
name: "qs::service::sni::Category"
accessSemantics: "none"
exports: ["Quickshell.Services.SystemTray/Category 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 47
values: [
"Hardware",
"SystemServices",
"ApplicationStatus",
"Communications"
]
}
}
Component {
file: "item.hpp"
lineNumber: 26
name: "qs::service::sni::Status"
accessSemantics: "none"
exports: ["Quickshell.Services.SystemTray/Status 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 30
values: ["Passive", "Active", "NeedsAttention"]
}
}
Component {
file: "item.hpp"
lineNumber: 100
name: "qs::service::sni::StatusNotifierItem"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.SystemTray/SystemTrayItem 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "id"
type: "QString"
bindable: "bindableId"
read: "default"
notify: "idChanged"
index: 0
lineNumber: 105
isReadonly: true
}
Property {
name: "title"
type: "QString"
bindable: "bindableTitle"
read: "default"
notify: "titleChanged"
index: 1
lineNumber: 107
isReadonly: true
}
Property {
name: "status"
type: "qs::service::sni::Status::Enum"
bindable: "bindableStatus"
read: "default"
notify: "statusChanged"
index: 2
lineNumber: 108
isReadonly: true
}
Property {
name: "category"
type: "qs::service::sni::Category::Enum"
bindable: "bindableCategory"
read: "default"
notify: "categoryChanged"
index: 3
lineNumber: 109
isReadonly: true
}
Property {
name: "icon"
type: "QString"
bindable: "bindableIcon"
read: "default"
notify: "iconChanged"
index: 4
lineNumber: 111
isReadonly: true
}
Property {
name: "tooltipTitle"
type: "QString"
read: "tooltipTitle"
notify: "tooltipTitleChanged"
index: 5
lineNumber: 112
isReadonly: true
}
Property {
name: "tooltipDescription"
type: "QString"
read: "tooltipDescription"
notify: "tooltipDescriptionChanged"
index: 6
lineNumber: 113
isReadonly: true
}
Property {
name: "hasMenu"
type: "bool"
bindable: "bindableHasMenu"
read: "default"
notify: "hasMenuChanged"
index: 7
lineNumber: 115
isReadonly: true
}
Property {
name: "menu"
type: "qs::dbus::dbusmenu::DBusMenuHandle"
isPointer: true
read: "menuHandle"
notify: "hasMenuChanged"
index: 8
lineNumber: 119
isReadonly: true
}
Property {
name: "onlyMenu"
type: "bool"
bindable: "bindableOnlyMenu"
read: "default"
notify: "onlyMenuChanged"
index: 9
lineNumber: 121
isReadonly: true
}
Signal { name: "ready"; lineNumber: 155 }
Signal { name: "idChanged"; lineNumber: 157 }
Signal { name: "titleChanged"; lineNumber: 158 }
Signal { name: "iconChanged"; lineNumber: 159 }
Signal { name: "statusChanged"; lineNumber: 160 }
Signal { name: "categoryChanged"; lineNumber: 161 }
Signal { name: "tooltipTitleChanged"; lineNumber: 162 }
Signal { name: "tooltipDescriptionChanged"; lineNumber: 163 }
Signal { name: "hasMenuChanged"; lineNumber: 164 }
Signal { name: "onlyMenuChanged"; lineNumber: 165 }
Method { name: "onGetAllFinished"; lineNumber: 168 }
Method { name: "onGetAllFailed"; isMethodConstant: true; lineNumber: 169 }
Method { name: "activate"; lineNumber: 130 }
Method { name: "secondaryActivate"; lineNumber: 132 }
Method {
name: "scroll"
isMethodConstant: true
lineNumber: 134
Parameter { name: "delta"; type: "int" }
Parameter { name: "horizontal"; type: "bool" }
}
Method {
name: "display"
lineNumber: 136
Parameter { name: "parentWindow"; type: "QObject"; isPointer: true }
Parameter { name: "relativeX"; type: "int" }
Parameter { name: "relativeY"; type: "int" }
}
}
}
@@ -0,0 +1,9 @@
module Quickshell.Services.UPower
linktarget quickshell-service-upowerplugin
optional plugin quickshell-service-upowerplugin
classname Quickshell_Services_UPowerPlugin
typeinfo quickshell-service-upower.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Services/UPower/
depends Quickshell
@@ -0,0 +1,461 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "powerprofiles.hpp"
lineNumber: 42
name: "qs::service::upower::PerformanceDegradationReason"
accessSemantics: "reference"
prototype: "QObject"
exports: [
"Quickshell.Services.UPower/PerformanceDegradationReason 0.0"
]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 48
values: ["None", "LapDetected", "HighTemperature"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 60
Parameter { name: "reason"; type: "qs::service::upower::PerformanceDegradationReason::Enum" }
}
}
Component {
file: "powerprofiles.hpp"
lineNumber: 20
name: "qs::service::upower::PowerProfile"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.UPower/PowerProfile 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 26
values: ["PowerSaver", "Balanced", "Performance"]
}
Method {
name: "toString"
type: "QString"
lineNumber: 37
Parameter { name: "profile"; type: "qs::service::upower::PowerProfile::Enum" }
}
}
Component {
file: "powerprofiles.hpp"
lineNumber: 104
name: "qs::service::upower::PowerProfileHold"
accessSemantics: "value"
exports: ["Quickshell.Services.UPower/powerProfileHold 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "profile"
type: "qs::service::upower::PowerProfile::Enum"
index: 0
lineNumber: 107
isPropertyConstant: true
}
Property {
name: "applicationId"
type: "QString"
index: 1
lineNumber: 108
isPropertyConstant: true
}
Property { name: "reason"; type: "QString"; index: 2; lineNumber: 109; isPropertyConstant: true }
}
Component {
file: "powerprofiles.hpp"
lineNumber: 167
name: "qs::service::upower::PowerProfilesQml"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.UPower/PowerProfiles 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "profile"
type: "qs::service::upower::PowerProfile::Enum"
bindable: "bindableProfile"
read: "default"
write: "setProfile"
notify: "profileChanged"
index: 0
lineNumber: 176
}
Property {
name: "hasPerformanceProfile"
type: "bool"
bindable: "bindableHasPerformanceProfile"
read: "default"
notify: "hasPerformanceProfileChanged"
index: 1
lineNumber: 181
isReadonly: true
}
Property {
name: "degradationReason"
type: "qs::service::upower::PerformanceDegradationReason::Enum"
bindable: "bindableDegradationReason"
read: "default"
notify: "degradationReasonChanged"
index: 2
lineNumber: 184
isReadonly: true
}
Property {
name: "holds"
type: "qs::service::upower::PowerProfileHold"
isList: true
bindable: "bindableHolds"
read: "default"
notify: "holdsChanged"
index: 3
lineNumber: 200
isReadonly: true
}
Signal { name: "profileChanged"; lineNumber: 204 }
Signal { name: "hasPerformanceProfileChanged"; lineNumber: 205 }
Signal { name: "degradationReasonChanged"; lineNumber: 206 }
Signal { name: "holdsChanged"; lineNumber: 207 }
}
Component {
file: "device.hpp"
lineNumber: 115
name: "qs::service::upower::UPowerDevice"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.UPower/UPowerDevice 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "type"
type: "qs::service::upower::UPowerDeviceType::Enum"
bindable: "bindableType"
read: "default"
notify: "typeChanged"
index: 0
lineNumber: 119
isReadonly: true
}
Property {
name: "powerSupply"
type: "bool"
bindable: "bindablePowerSupply"
read: "default"
notify: "powerSupplyChanged"
index: 1
lineNumber: 121
isReadonly: true
}
Property {
name: "energy"
type: "double"
bindable: "bindableEnergy"
read: "default"
notify: "energyChanged"
index: 2
lineNumber: 123
isReadonly: true
}
Property {
name: "energyCapacity"
type: "double"
bindable: "bindableEnergyCapacity"
read: "default"
notify: "energyCapacityChanged"
index: 3
lineNumber: 125
isReadonly: true
}
Property {
name: "changeRate"
type: "double"
bindable: "bindableChangeRate"
read: "default"
notify: "changeRateChanged"
index: 4
lineNumber: 127
isReadonly: true
}
Property {
name: "timeToEmpty"
type: "double"
bindable: "bindableTimeToEmpty"
read: "default"
notify: "timeToEmptyChanged"
index: 5
lineNumber: 131
isReadonly: true
}
Property {
name: "timeToFull"
type: "double"
bindable: "bindableTimeToFull"
read: "default"
notify: "timeToFullChanged"
index: 6
lineNumber: 135
isReadonly: true
}
Property {
name: "percentage"
type: "double"
bindable: "bindablePercentage"
read: "default"
notify: "percentageChanged"
index: 7
lineNumber: 139
isReadonly: true
}
Property {
name: "isPresent"
type: "bool"
bindable: "bindableIsPresent"
read: "default"
notify: "isPresentChanged"
index: 8
lineNumber: 143
isReadonly: true
}
Property {
name: "state"
type: "qs::service::upower::UPowerDeviceState::Enum"
bindable: "bindableState"
read: "default"
notify: "stateChanged"
index: 9
lineNumber: 145
isReadonly: true
}
Property {
name: "healthPercentage"
type: "double"
bindable: "bindableHealthPercentage"
read: "default"
notify: "healthPercentageChanged"
index: 10
lineNumber: 147
isReadonly: true
}
Property {
name: "healthSupported"
type: "bool"
bindable: "bindableHealthSupported"
read: "default"
notify: "healthSupportedChanged"
index: 11
lineNumber: 148
isReadonly: true
}
Property {
name: "iconName"
type: "QString"
bindable: "bindableIconName"
read: "default"
notify: "iconNameChanged"
index: 12
lineNumber: 150
isReadonly: true
}
Property {
name: "isLaptopBattery"
type: "bool"
bindable: "bindableIsLaptopBattery"
read: "default"
notify: "isLaptopBatteryChanged"
index: 13
lineNumber: 154
isReadonly: true
}
Property {
name: "nativePath"
type: "QString"
bindable: "bindableNativePath"
read: "default"
notify: "nativePathChanged"
index: 14
lineNumber: 156
isReadonly: true
}
Property {
name: "model"
type: "QString"
bindable: "bindableModel"
read: "default"
notify: "modelChanged"
index: 15
lineNumber: 158
isReadonly: true
}
Property {
name: "ready"
type: "bool"
bindable: "bindableReady"
read: "default"
notify: "readyChanged"
index: 16
lineNumber: 162
isReadonly: true
}
Signal { name: "readyChanged"; lineNumber: 197 }
Signal { name: "typeChanged"; lineNumber: 199 }
Signal { name: "powerSupplyChanged"; lineNumber: 200 }
Signal { name: "energyChanged"; lineNumber: 201 }
Signal { name: "energyCapacityChanged"; lineNumber: 202 }
Signal { name: "changeRateChanged"; lineNumber: 203 }
Signal { name: "timeToEmptyChanged"; lineNumber: 204 }
Signal { name: "timeToFullChanged"; lineNumber: 205 }
Signal { name: "percentageChanged"; lineNumber: 206 }
Signal { name: "isPresentChanged"; lineNumber: 207 }
Signal { name: "stateChanged"; lineNumber: 208 }
Signal { name: "healthPercentageChanged"; lineNumber: 209 }
Signal { name: "healthSupportedChanged"; lineNumber: 210 }
Signal { name: "iconNameChanged"; lineNumber: 211 }
Signal { name: "isLaptopBatteryChanged"; lineNumber: 212 }
Signal { name: "nativePathChanged"; lineNumber: 213 }
Signal { name: "modelChanged"; lineNumber: 214 }
Method { name: "onGetAllFinished"; lineNumber: 217 }
}
Component {
file: "device.hpp"
lineNumber: 17
name: "qs::service::upower::UPowerDeviceState"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.UPower/UPowerDeviceState 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 23
values: [
"Unknown",
"Charging",
"Discharging",
"Empty",
"FullyCharged",
"PendingCharge",
"PendingDischarge"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 36
Parameter { name: "status"; type: "qs::service::upower::UPowerDeviceState::Enum" }
}
}
Component {
file: "device.hpp"
lineNumber: 41
name: "qs::service::upower::UPowerDeviceType"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.UPower/UPowerDeviceType 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 47
values: [
"Unknown",
"LinePower",
"Battery",
"Ups",
"Monitor",
"Mouse",
"Keyboard",
"Pda",
"Phone",
"MediaPlayer",
"Tablet",
"Computer",
"GamingInput",
"Pen",
"Touchpad",
"Modem",
"Network",
"Headset",
"Speakers",
"Headphones",
"Video",
"OtherAudio",
"RemoteControl",
"Printer",
"Scanner",
"Camera",
"Wearable",
"Toy",
"BluetoothGeneric"
]
}
Method {
name: "toString"
type: "QString"
lineNumber: 80
Parameter { name: "type"; type: "qs::service::upower::UPowerDeviceType::Enum" }
}
}
Component {
file: "core.hpp"
lineNumber: 65
name: "qs::service::upower::UPowerQml"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Services.UPower/UPower 0.0"]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "displayDevice"
type: "qs::service::upower::UPowerDevice"
isPointer: true
read: "displayDevice"
index: 0
lineNumber: 75
isReadonly: true
isPropertyConstant: true
}
Property {
name: "devices"
type: "UntypedObjectModel"
isPointer: true
read: "devices"
index: 1
lineNumber: 78
isReadonly: true
isPropertyConstant: true
}
Property {
name: "onBattery"
type: "bool"
bindable: "bindableOnBattery"
read: "default"
notify: "onBatteryChanged"
index: 2
lineNumber: 80
isReadonly: true
}
Signal { name: "onBatteryChanged"; lineNumber: 94 }
}
}
@@ -0,0 +1,9 @@
module Quickshell.Wayland._BackgroundEffect
linktarget quickshell-wayland-background-effectplugin
optional plugin quickshell-wayland-background-effectplugin
classname Quickshell_Wayland__BackgroundEffectPlugin
typeinfo quickshell-wayland-background-effect.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Wayland/_BackgroundEffect/
depends QtQuick
@@ -0,0 +1,40 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "qml.hpp"
lineNumber: 36
name: "qs::wayland::background_effect::BackgroundEffect"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Wayland._BackgroundEffect/BackgroundEffect 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
attachedType: "qs::wayland::background_effect::BackgroundEffect"
Property {
name: "blurRegion"
type: "PendingRegion"
isPointer: true
read: "blurRegion"
write: "setBlurRegion"
notify: "blurRegionChanged"
index: 0
lineNumber: 40
}
Signal { name: "blurRegionChanged"; lineNumber: 57 }
Method { name: "onWindowConnected"; lineNumber: 60 }
Method { name: "onWindowVisibleChanged"; lineNumber: 61 }
Method { name: "onWaylandWindowDestroyed"; lineNumber: 62 }
Method { name: "onWaylandSurfaceCreated"; lineNumber: 63 }
Method { name: "onWaylandSurfaceDestroyed"; lineNumber: 64 }
Method { name: "onProxyWindowDestroyed"; lineNumber: 65 }
Method { name: "onBlurRegionDestroyed"; lineNumber: 66 }
Method { name: "onWindowPolished"; lineNumber: 67 }
Method { name: "updateBlurRegion"; lineNumber: 68 }
}
}
@@ -0,0 +1,9 @@
module Quickshell.Wayland._IdleInhibitor
linktarget quickshell-wayland-idle-inhibitplugin
optional plugin quickshell-wayland-idle-inhibitplugin
classname Quickshell_Wayland__IdleInhibitorPlugin
typeinfo quickshell-wayland-idle-inhibit.qmltypes
depends QtQuick
prefer :/qt/qml/Quickshell/Wayland/_IdleInhibitor/
depends Quickshell
@@ -0,0 +1,45 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "inhibitor.hpp"
lineNumber: 27
name: "qs::wayland::idle_inhibit::IdleInhibitor"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Wayland._IdleInhibitor/IdleInhibitor 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "enabled"
type: "bool"
bindable: "bindableEnabled"
read: "default"
write: "default"
notify: "enabledChanged"
index: 0
lineNumber: 32
}
Property {
name: "window"
type: "QObject"
isPointer: true
read: "window"
write: "setWindow"
notify: "windowChanged"
index: 1
lineNumber: 37
}
Signal { name: "enabledChanged"; lineNumber: 51 }
Signal { name: "windowChanged"; lineNumber: 52 }
Method { name: "onWindowDestroyed"; lineNumber: 55 }
Method { name: "onWindowVisibilityChanged"; lineNumber: 56 }
Method { name: "onWaylandWindowDestroyed"; lineNumber: 57 }
Method { name: "onWaylandSurfaceCreated"; lineNumber: 58 }
Method { name: "onWaylandSurfaceDestroyed"; lineNumber: 59 }
}
}
@@ -0,0 +1,9 @@
module Quickshell.Wayland._IdleNotify
linktarget quickshell-wayland-idle-notifyplugin
optional plugin quickshell-wayland-idle-notifyplugin
classname Quickshell_Wayland__IdleNotifyPlugin
typeinfo quickshell-wayland-idle-notify.qmltypes
depends QtQuick
prefer :/qt/qml/Quickshell/Wayland/_IdleNotify/
depends Quickshell
@@ -0,0 +1,61 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "monitor.hpp"
lineNumber: 21
name: "qs::wayland::idle_notify::IdleMonitor"
accessSemantics: "reference"
prototype: "PostReloadHook"
exports: ["Quickshell.Wayland._IdleNotify/IdleMonitor 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "enabled"
type: "bool"
read: "isEnabled"
write: "setEnabled"
notify: "enabledChanged"
index: 0
lineNumber: 26
}
Property {
name: "timeout"
type: "double"
bindable: "bindableTimeout"
read: "default"
write: "default"
notify: "timeoutChanged"
index: 1
lineNumber: 30
}
Property {
name: "respectInhibitors"
type: "bool"
bindable: "bindableRespectInhibitors"
read: "default"
write: "default"
notify: "respectInhibitorsChanged"
index: 2
lineNumber: 33
}
Property {
name: "isIdle"
type: "bool"
bindable: "bindableIsIdle"
read: "default"
notify: "isIdleChanged"
index: 3
lineNumber: 36
isReadonly: true
}
Signal { name: "enabledChanged"; lineNumber: 54 }
Signal { name: "timeoutChanged"; lineNumber: 55 }
Signal { name: "respectInhibitorsChanged"; lineNumber: 56 }
Signal { name: "isIdleChanged"; lineNumber: 57 }
}
}
@@ -0,0 +1,8 @@
module Quickshell.Wayland._Screencopy
linktarget quickshell-wayland-screencopyplugin
optional plugin quickshell-wayland-screencopyplugin
classname Quickshell_Wayland__ScreencopyPlugin
typeinfo quickshell-wayland-screencopy.qmltypes
depends QtQuick
prefer :/qt/qml/Quickshell/Wayland/_Screencopy/
@@ -0,0 +1,90 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "view.hpp"
lineNumber: 17
name: "qs::wayland::screencopy::ScreencopyView"
accessSemantics: "reference"
defaultProperty: "data"
parentProperty: "parent"
prototype: "QQuickItem"
exports: ["Quickshell.Wayland._Screencopy/ScreencopyView 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "captureSource"
type: "QObject"
isPointer: true
read: "captureSource"
write: "setCaptureSource"
notify: "captureSourceChanged"
index: 0
lineNumber: 28
}
Property {
name: "paintCursor"
type: "bool"
read: "paintCursors"
write: "setPaintCursors"
notify: "paintCursorsChanged"
index: 1
lineNumber: 30
}
Property {
name: "live"
type: "bool"
read: "live"
write: "setLive"
notify: "liveChanged"
index: 2
lineNumber: 33
}
Property {
name: "hasContent"
type: "bool"
bindable: "bindableHasContent"
read: "default"
notify: "hasContentChanged"
index: 3
lineNumber: 36
isReadonly: true
}
Property {
name: "sourceSize"
type: "QSize"
bindable: "bindableSourceSize"
read: "default"
notify: "sourceSizeChanged"
index: 4
lineNumber: 38
isReadonly: true
}
Property {
name: "constraintSize"
type: "QSizeF"
bindable: "bindableConstraintSize"
read: "default"
write: "default"
notify: "constraintSizeChanged"
index: 5
lineNumber: 41
}
Signal { name: "stopped"; lineNumber: 67 }
Signal { name: "captureSourceChanged"; lineNumber: 69 }
Signal { name: "paintCursorsChanged"; lineNumber: 70 }
Signal { name: "liveChanged"; lineNumber: 71 }
Signal { name: "hasContentChanged"; lineNumber: 72 }
Signal { name: "sourceSizeChanged"; lineNumber: 73 }
Signal { name: "constraintSizeChanged"; lineNumber: 74 }
Method { name: "onCaptureSourceDestroyed"; lineNumber: 80 }
Method { name: "onFrameCaptured"; lineNumber: 81 }
Method { name: "destroyContextWithUpdate"; lineNumber: 82 }
Method { name: "onBuffersReady"; lineNumber: 83 }
Method { name: "captureFrame"; lineNumber: 50 }
}
}
@@ -0,0 +1,9 @@
module Quickshell.Wayland._ShortcutsInhibitor
linktarget quickshell-wayland-shortcuts-inhibitplugin
optional plugin quickshell-wayland-shortcuts-inhibitplugin
classname Quickshell_Wayland__ShortcutsInhibitorPlugin
typeinfo quickshell-wayland-shortcuts-inhibit.qmltypes
depends QtQuick
prefer :/qt/qml/Quickshell/Wayland/_ShortcutsInhibitor/
depends Quickshell
@@ -0,0 +1,61 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "inhibitor.hpp"
lineNumber: 26
name: "qs::wayland::shortcuts_inhibit::ShortcutInhibitor"
accessSemantics: "reference"
prototype: "QObject"
exports: [
"Quickshell.Wayland._ShortcutsInhibitor/ShortcutInhibitor 0.0"
]
exportMetaObjectRevisions: [0]
Property {
name: "enabled"
type: "bool"
bindable: "bindableEnabled"
read: "default"
write: "default"
notify: "enabledChanged"
index: 0
lineNumber: 31
}
Property {
name: "window"
type: "QObject"
isPointer: true
bindable: "bindableWindow"
read: "default"
write: "default"
notify: "windowChanged"
index: 1
lineNumber: 36
}
Property {
name: "active"
type: "bool"
bindable: "bindableActive"
read: "default"
notify: "activeChanged"
index: 2
lineNumber: 43
isReadonly: true
}
Signal { name: "enabledChanged"; lineNumber: 56 }
Signal { name: "windowChanged"; lineNumber: 57 }
Signal { name: "activeChanged"; lineNumber: 58 }
Signal { name: "cancelled"; lineNumber: 60 }
Method { name: "onWindowDestroyed"; lineNumber: 63 }
Method { name: "onWindowVisibilityChanged"; lineNumber: 64 }
Method { name: "onWaylandWindowDestroyed"; lineNumber: 65 }
Method { name: "onWaylandSurfaceCreated"; lineNumber: 66 }
Method { name: "onWaylandSurfaceDestroyed"; lineNumber: 67 }
Method { name: "onInhibitorActiveChanged"; lineNumber: 68 }
}
}
@@ -0,0 +1,11 @@
module Quickshell.Wayland._ToplevelManagement
linktarget quickshell-wayland-toplevel-managementplugin
optional plugin quickshell-wayland-toplevel-managementplugin
classname Quickshell_Wayland__ToplevelManagementPlugin
typeinfo quickshell-wayland-toplevel-management.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Wayland/_ToplevelManagement/
depends Quickshell
depends Quickshell.Wayland
depends QtQuick
@@ -0,0 +1,152 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "qml.hpp"
lineNumber: 24
name: "qs::wayland::toplevel::Toplevel"
accessSemantics: "reference"
prototype: "QObject"
exports: ["Quickshell.Wayland._ToplevelManagement/Toplevel 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Property {
name: "appId"
type: "QString"
read: "appId"
notify: "appIdChanged"
index: 0
lineNumber: 26
isReadonly: true
}
Property {
name: "title"
type: "QString"
read: "title"
notify: "titleChanged"
index: 1
lineNumber: 27
isReadonly: true
}
Property {
name: "parent"
type: "qs::wayland::toplevel::Toplevel"
isPointer: true
read: "parent"
notify: "parentChanged"
index: 2
lineNumber: 29
isReadonly: true
}
Property {
name: "activated"
type: "bool"
read: "activated"
notify: "activatedChanged"
index: 3
lineNumber: 33
isReadonly: true
}
Property {
name: "screens"
type: "QList<QuickshellScreenInfo*>"
read: "screens"
notify: "screensChanged"
index: 4
lineNumber: 38
isReadonly: true
}
Property {
name: "maximized"
type: "bool"
read: "maximized"
write: "setMaximized"
notify: "maximizedChanged"
index: 5
lineNumber: 43
}
Property {
name: "minimized"
type: "bool"
read: "minimized"
write: "setMinimized"
notify: "minimizedChanged"
index: 6
lineNumber: 48
}
Property {
name: "fullscreen"
type: "bool"
read: "fullscreen"
write: "setFullscreen"
notify: "fullscreenChanged"
index: 7
lineNumber: 54
}
Signal { name: "closed"; lineNumber: 97 }
Signal { name: "appIdChanged"; lineNumber: 98 }
Signal { name: "titleChanged"; lineNumber: 99 }
Signal { name: "parentChanged"; lineNumber: 100 }
Signal { name: "activatedChanged"; lineNumber: 101 }
Signal { name: "screensChanged"; lineNumber: 102 }
Signal { name: "maximizedChanged"; lineNumber: 103 }
Signal { name: "minimizedChanged"; lineNumber: 104 }
Signal { name: "fullscreenChanged"; lineNumber: 105 }
Method { name: "onClosed"; lineNumber: 108 }
Method { name: "onRectangleProxyConnected"; lineNumber: 109 }
Method { name: "onRectangleProxyDestroyed"; lineNumber: 110 }
Method { name: "activate"; lineNumber: 63 }
Method { name: "close"; lineNumber: 67 }
Method {
name: "fullscreenOn"
lineNumber: 71
Parameter { name: "screen"; type: "QuickshellScreenInfo"; isPointer: true }
}
Method {
name: "setRectangle"
lineNumber: 76
Parameter { name: "window"; type: "QObject"; isPointer: true }
Parameter { name: "rect"; type: "QRect" }
}
Method { name: "unsetRectangle"; lineNumber: 77 }
}
Component {
file: "qml.hpp"
lineNumber: 157
name: "qs::wayland::toplevel::ToplevelManagerQml"
accessSemantics: "reference"
prototype: "QObject"
exports: [
"Quickshell.Wayland._ToplevelManagement/ToplevelManager 0.0"
]
isCreatable: false
isSingleton: true
exportMetaObjectRevisions: [0]
Property {
name: "toplevels"
type: "UntypedObjectModel"
isPointer: true
read: "toplevels"
index: 0
lineNumber: 162
isReadonly: true
isPropertyConstant: true
}
Property {
name: "activeToplevel"
type: "qs::wayland::toplevel::Toplevel"
isPointer: true
read: "activeToplevel"
notify: "activeToplevelChanged"
index: 1
lineNumber: 167
isReadonly: true
}
Signal { name: "activeToplevelChanged"; lineNumber: 179 }
}
}
@@ -0,0 +1,10 @@
module Quickshell.Wayland._WlrLayerShell
linktarget quickshell-wayland-layershellplugin
optional plugin quickshell-wayland-layershellplugin
classname Quickshell_Wayland__WlrLayerShellPlugin
typeinfo quickshell-wayland-layershell.qmltypes
depends QtQuick
prefer :/qt/qml/Quickshell/Wayland/_WlrLayerShell/
depends Quickshell
depends Quickshell.Wayland
@@ -0,0 +1,139 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "wlr_layershell.hpp"
lineNumber: 47
name: "qs::wayland::layershell::WlrKeyboardFocus"
accessSemantics: "none"
exports: ["Quickshell.Wayland._WlrLayerShell/WlrKeyboardFocus 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 51
values: ["None", "Exclusive", "OnDemand"]
}
}
Component {
file: "wlr_layershell.hpp"
lineNumber: 26
name: "qs::wayland::layershell::WlrLayer"
accessSemantics: "none"
exports: ["Quickshell.Wayland._WlrLayerShell/WlrLayer 0.0"]
isCreatable: false
exportMetaObjectRevisions: [0]
Enum {
name: "Enum"
type: "quint8"
lineNumber: 30
values: ["Background", "Bottom", "Top", "Overlay"]
}
}
Component {
file: "wlr_layershell.hpp"
lineNumber: 97
name: "qs::wayland::layershell::WlrLayershell"
accessSemantics: "reference"
prototype: "ProxyWindowBase"
exports: ["Quickshell.Wayland._WlrLayerShell/WlrLayershell 0.0"]
exportMetaObjectRevisions: [0]
attachedType: "qs::wayland::layershell::WlrLayershell"
Property {
name: "layer"
type: "qs::wayland::layershell::WlrLayer::Enum"
read: "layer"
write: "setLayer"
notify: "layerChanged"
index: 0
lineNumber: 102
}
Property {
name: "namespace"
type: "QString"
read: "ns"
write: "setNamespace"
notify: "namespaceChanged"
index: 1
lineNumber: 106
}
Property {
name: "keyboardFocus"
type: "qs::wayland::layershell::WlrKeyboardFocus::Enum"
read: "keyboardFocus"
write: "setKeyboardFocus"
notify: "keyboardFocusChanged"
index: 2
lineNumber: 108
}
Property {
name: "anchors"
type: "Anchors"
read: "anchors"
write: "setAnchors"
notify: "anchorsChanged"
index: 3
lineNumber: 110
}
Property {
name: "exclusiveZone"
type: "int"
read: "exclusiveZone"
write: "setExclusiveZone"
notify: "exclusiveZoneChanged"
index: 4
lineNumber: 111
}
Property {
name: "exclusionMode"
type: "ExclusionMode::Enum"
read: "exclusionMode"
write: "setExclusionMode"
notify: "exclusionModeChanged"
index: 5
lineNumber: 112
}
Property {
name: "margins"
type: "Margins"
read: "margins"
write: "setMargins"
notify: "marginsChanged"
index: 6
lineNumber: 113
}
Property {
name: "aboveWindows"
type: "bool"
read: "aboveWindows"
write: "setAboveWindows"
notify: "layerChanged"
index: 7
lineNumber: 114
}
Property {
name: "focusable"
type: "bool"
read: "focusable"
write: "setFocusable"
notify: "keyboardFocusChanged"
index: 8
lineNumber: 115
}
Signal { name: "layerChanged"; lineNumber: 170 }
Signal { name: "namespaceChanged"; lineNumber: 171 }
Signal { name: "keyboardFocusChanged"; lineNumber: 172 }
Signal { name: "anchorsChanged"; lineNumber: 173 }
Signal { name: "exclusiveZoneChanged"; lineNumber: 174 }
Signal { name: "exclusionModeChanged"; lineNumber: 175 }
Signal { name: "marginsChanged"; lineNumber: 176 }
Method { name: "updateAutoExclusion"; lineNumber: 179 }
Method { name: "onBridgeDestroyed"; lineNumber: 180 }
}
}
@@ -0,0 +1,16 @@
module Quickshell.Wayland
linktarget quickshell-waylandplugin
optional plugin quickshell-waylandplugin
classname Quickshell_WaylandPlugin
typeinfo quickshell-wayland.qmltypes
import Quickshell.Wayland._WlrLayerShell
import Quickshell.Wayland._ToplevelManagement
import Quickshell.Wayland._Screencopy
import Quickshell.Wayland._BackgroundEffect
import Quickshell.Wayland._IdleInhibitor
import Quickshell.Wayland._IdleNotify
import Quickshell.Wayland._ShortcutsInhibitor
depends QtQuick
prefer :/qt/qml/Quickshell/Wayland/
depends Quickshell
@@ -0,0 +1,134 @@
import QtQuick.tooling 1.2
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by qmltyperegistrar.
Module {
Component {
file: "session_lock.hpp"
lineNumber: 56
name: "WlSessionLock"
accessSemantics: "reference"
defaultProperty: "surface"
prototype: "Reloadable"
exports: ["Quickshell.Wayland/WlSessionLock 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "locked"
type: "bool"
read: "isLocked"
write: "setLocked"
notify: "lockStateChanged"
index: 0
lineNumber: 63
}
Property {
name: "secure"
type: "bool"
read: "isSecure"
notify: "secureStateChanged"
index: 1
lineNumber: 67
isReadonly: true
}
Property {
name: "surface"
type: "QQmlComponent"
isPointer: true
read: "surfaceComponent"
write: "setSurfaceComponent"
notify: "surfaceComponentChanged"
index: 2
lineNumber: 69
}
Signal { name: "lockStateChanged"; lineNumber: 90 }
Signal { name: "secureStateChanged"; lineNumber: 91 }
Signal { name: "surfaceComponentChanged"; lineNumber: 92 }
Method { name: "unlock"; lineNumber: 95 }
Method { name: "onScreensChanged"; lineNumber: 96 }
}
Component {
file: "session_lock.hpp"
lineNumber: 114
name: "WlSessionLockSurface"
accessSemantics: "reference"
defaultProperty: "data"
prototype: "Reloadable"
exports: ["Quickshell.Wayland/WlSessionLockSurface 0.0"]
exportMetaObjectRevisions: [0]
Property {
name: "contentItem"
type: "QQuickItem"
isPointer: true
read: "contentItem"
index: 0
lineNumber: 117
isReadonly: true
}
Property {
name: "visible"
type: "bool"
read: "isVisible"
notify: "visibleChanged"
index: 1
lineNumber: 121
isReadonly: true
}
Property {
name: "width"
type: "int"
read: "width"
notify: "widthChanged"
index: 2
lineNumber: 122
isReadonly: true
}
Property {
name: "height"
type: "int"
read: "height"
notify: "heightChanged"
index: 3
lineNumber: 123
isReadonly: true
}
Property {
name: "screen"
type: "QuickshellScreenInfo"
isPointer: true
read: "screen"
notify: "screenChanged"
index: 4
lineNumber: 125
isReadonly: true
}
Property {
name: "color"
type: "QColor"
read: "color"
write: "setColor"
notify: "colorChanged"
index: 5
lineNumber: 142
}
Property {
name: "data"
type: "QObject"
isList: true
read: "data"
index: 6
lineNumber: 143
isReadonly: true
}
Signal { name: "visibleChanged"; lineNumber: 175 }
Signal { name: "widthChanged"; lineNumber: 176 }
Signal { name: "heightChanged"; lineNumber: 177 }
Signal { name: "screenChanged"; lineNumber: 178 }
Signal { name: "colorChanged"; lineNumber: 179 }
Method { name: "onScreenDestroyed"; lineNumber: 182 }
Method { name: "onWidthChanged"; lineNumber: 183 }
Method { name: "onHeightChanged"; lineNumber: 184 }
}
}
@@ -0,0 +1,92 @@
pragma ComponentBehavior: Bound
import QtQuick
///! Rectangle capable of clipping content inside its border.
/// > [!WARNING] This type requires at least Qt 6.7.
///
/// This is a specialized version of @@QtQuick.Rectangle that clips content
/// inside of its border, including rounded rectangles. It costs more than
/// @@QtQuick.Rectangle, so it should not be used unless you need to clip
/// items inside of it to the border.
Item {
id: root
/// If content should be displayed underneath the border.
///
/// Defaults to false, does nothing if the border is opaque.
property bool contentUnderBorder: false
/// If the content item should be resized to fit inside the border.
///
/// Defaults to `!contentUnderBorder`. Most useful when combined with
/// `anchors.fill: parent` on an item passed to the ClippingRectangle.
property bool contentInsideBorder: !root.contentUnderBorder
/// If the rectangle should be antialiased.
///
/// Defaults to true if any corner has a non-zero radius, otherwise false.
property /*bool*/alias antialiasing: rectangle.antialiasing
/// The background color of the rectangle, which goes under its content.
property /*color*/alias color: shader.backgroundColor
/// See @@QtQuick.Rectangle.border.
property clippingRectangleBorder border
/// Radius of all corners. Defaults to 0.
property /*real*/alias radius: rectangle.radius
/// Radius of the top left corner. Defaults to @@radius.
property /*real*/alias topLeftRadius: rectangle.topLeftRadius
/// Radius of the top right corner. Defaults to @@radius.
property /*real*/alias topRightRadius: rectangle.topRightRadius
/// Radius of the bottom left corner. Defaults to @@radius.
property /*real*/alias bottomLeftRadius: rectangle.bottomLeftRadius
/// Radius of the bottom right corner. Defaults to @@radius.
property /*real*/alias bottomRightRadius: rectangle.bottomRightRadius
/// Data of the ClippingRectangle's @@contentItem. (`list<QtObject>`).
///
/// See @@QtQuick.Item.data for details.
default property alias data: contentItem.data
/// Visual children of the ClippingRectangle's @@contentItem. (`list<Item>`).
///
/// See @@QtQuick.Item.children for details.
property alias children: contentItem.children
/// The item containing the rectangle's content.
/// There is usually no reason to use this directly.
readonly property alias contentItem: contentItem
Rectangle {
id: rectangle
anchors.fill: root
color: "#ffff0000"
border.color: "#ff00ff00"
border.pixelAligned: root.border.pixelAligned
border.width: root.border.width
layer.enabled: true
visible: false
}
Item {
id: contentItemContainer
anchors.fill: root
Item {
id: contentItem
anchors.fill: parent
anchors.margins: root.contentInsideBorder ? root.border.width : 0
}
}
ShaderEffectSource {
id: shaderSource
hideSource: true
sourceItem: contentItemContainer
}
ShaderEffect {
id: shader
anchors.fill: root
fragmentShader: `qrc:/Quickshell/Widgets/shaders/cliprect${root.contentUnderBorder ? "-ub" : ""}.frag.qsb`
property Rectangle rect: rectangle
property color backgroundColor: "white"
property color borderColor: root.border.color
property ShaderEffectSource content: shaderSource
}
}
@@ -0,0 +1,63 @@
import QtQuick
///! ClippingRectangle that handles sizes and positioning for a single visual child.
/// This component is useful for adding a clipping border or background rectangle to
/// a child item. If you don't need clipping, use @@WrapperRectangle.
///
/// > [!NOTE] ClippingWrapperRectangle is a @@MarginWrapperManager based component.
/// > See its documentation for information on how margins and sizes are calculated.
///
/// > [!WARNING] You should not set @@Item.x, @@Item.y, @@Item.width,
/// > @@Item.height or @@Item.anchors on the child item, as they are used
/// > by WrapperItem to position it. Instead set @@Item.implicitWidth and
/// > @@Item.implicitHeight.
ClippingWrapperRectangleInternal {
id: root
/// The default for @@topMargin, @@bottomMargin, @@leftMargin and @@rightMargin.
/// Defaults to 0.
property /*real*/alias margin: manager.margin
/// An extra margin applied in addition to @@topMargin, @@bottomMargin,
/// @@leftMargin, and @@rightMargin.
/// If @@contentInsideBorder is true, the rectangle's border width will be added
/// to this property. Defaults to 0.
property /*real*/alias extraMargin: manager.extraMargin
/// The requested top margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias topMargin: manager.topMargin
/// The requested bottom margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias bottomMargin: manager.bottomMargin
/// The requested left margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias leftMargin: manager.leftMargin
/// The requested right margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias rightMargin: manager.rightMargin
/// Determines if child item should be resized larger than its implicit size if
/// the parent is resized larger than its implicit size. Defaults to true.
property /*bool*/alias resizeChild: manager.resizeChild
/// Overrides the implicit width of the wrapper.
///
/// Defaults to the implicit width of the content item plus its left and right margin,
/// and may be reset by assigning `undefined`.
property /*real*/alias implicitWidth: manager.implicitWidth
/// Overrides the implicit height of the wrapper.
///
/// Defaults to the implicit width of the content item plus its top and bottom margin,
/// and may be reset by assigning `undefined`.
property /*real*/alias implicitHeight: manager.implicitHeight
/// See @@WrapperManager.child for details.
property alias child: manager.child
border.width: 0
__implicitWidthInternal: root.contentItem.implicitWidth + (root.contentInsideBorder ? root.border.width * 2 : 0)
__implicitHeightInternal: root.contentItem.implicitHeight + (root.contentInsideBorder ? root.border.width * 2 : 0)
MarginWrapperManager { id: manager }
}
@@ -0,0 +1,7 @@
import QtQuick
ClippingRectangle {
id: root
property alias __implicitWidthInternal: root.implicitWidth
property alias __implicitHeightInternal: root.implicitHeight
}
@@ -0,0 +1,67 @@
import QtQuick
///! Image component for displaying widget/icon style images.
/// This is a specialization of @@QtQuick.Image configured for icon-style images,
/// designed to make it easier to use correctly. If you need more control, use
/// @@QtQuick.Image directly.
///
/// The image's aspect raito is assumed to be 1:1. If it is not 1:1, padding
/// will be added to make it 1:1. This is currently applied before the actual
/// aspect ratio of the image is taken into account, and may change in a future
/// release.
///
/// You should use it for:
/// - Icons for custom buttons
/// - Status indicator icons
/// - System tray icons
/// - Things similar to the above.
///
/// Do not use it for:
/// - Big images
/// - Images that change size frequently
/// - Anything that doesn't feel like an icon.
///
/// > [!INFO] More information about many of these properties can be found in
/// > the documentation for @@QtQuick.Image.
Item {
id: root
/// URL of the image. Defaults to an empty string.
/// See @@QtQuick.Image.source.
property /*string*/alias source: image.source
/// If the image should be loaded asynchronously. Defaults to false.
/// See @@QtQuick.Image.asynchronous.
property /*bool*/alias asynchronous: image.asynchronous
/// The load status of the image. See @@QtQuick.Image.status.
property alias status: image.status
/// If the image should be mipmap filtered. Defaults to false.
/// See @@QtQuick.Image.mipmap.
///
/// Try enabling this if your image is significantly scaled down
/// and looks bad because of it.
property /*bool*/alias mipmap: image.mipmap
/// The @@QtQuick.Image backing this object.
///
/// This is useful if you need to access more functionality than
/// exposed by IconImage.
property /*Image*/alias backer: image
/// The suggested size of the image. This is used as a default
/// for @@QtQuick.Item.implicitWidth and @@QtQuick.Item.implicitHeight.
property real implicitSize: 0
/// The actual size the image will be displayed at.
readonly property real actualSize: Math.min(root.width, root.height)
implicitWidth: root.implicitSize
implicitHeight: root.implicitSize
Image {
id: image
anchors.fill: parent
fillMode: Image.PreserveAspectFit
sourceSize.width: root.actualSize
sourceSize.height: root.actualSize
}
}
@@ -0,0 +1,72 @@
import QtQuick
///! Item that handles sizes and positioning for a single visual child.
/// This component is useful when you need to wrap a single component in
/// an item, or give a single component a margin. See [QtQuick.Layouts]
/// for positioning multiple items.
///
/// > [!NOTE] WrapperItem is a @@MarginWrapperManager based component.
/// > See its documentation for information on how margins and sizes are calculated.
///
/// ### Example: Adding a margin to an item
/// The snippet below adds a 10px margin to all sides of the @@QtQuick.Text item.
///
/// ```qml
/// WrapperItem {
/// margin: 10
///
/// @@QtQuick.Text { text: "Hello!" }
/// }
/// ```
///
/// > [!NOTE] The child item can be specified by writing it inline in the wrapper,
/// > as in the example above, or by using the @@child property. See
/// > @@WrapperManager.child for details.
///
/// > [!WARNING] You should not set @@Item.x, @@Item.y, @@Item.width,
/// > @@Item.height or @@Item.anchors on the child item, as they are used
/// > by WrapperItem to position it. Instead set @@Item.implicitWidth and
/// > @@Item.implicitHeight.
///
/// [QtQuick.Layouts]: https://doc.qt.io/qt-6/qtquicklayouts-index.html
Item {
/// The default for @@topMargin, @@bottomMargin, @@leftMargin and @@rightMargin.
/// Defaults to 0.
property /*real*/alias margin: manager.margin
/// An extra margin applied in addition to @@topMargin, @@bottomMargin,
/// @@leftMargin, and @@rightMargin. Defaults to 0.
property /*real*/alias extraMargin: manager.extraMargin
/// The requested top margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias topMargin: manager.topMargin
/// The requested bottom margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias bottomMargin: manager.bottomMargin
/// The requested left margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias leftMargin: manager.leftMargin
/// The requested right margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias rightMargin: manager.rightMargin
/// Determines if child item should be resized larger than its implicit size if
/// the parent is resized larger than its implicit size. Defaults to true.
property /*bool*/alias resizeChild: manager.resizeChild
/// Overrides the implicit width of the wrapper.
///
/// Defaults to the implicit width of the content item plus its left and right margin,
/// and may be reset by assigning `undefined`.
property /*real*/alias implicitWidth: manager.implicitWidth
/// Overrides the implicit height of the wrapper.
///
/// Defaults to the implicit width of the content item plus its top and bottom margin,
/// and may be reset by assigning `undefined`.
property /*real*/alias implicitHeight: manager.implicitHeight
/// See @@WrapperManager.child for details.
property /*Item*/alias child: manager.child
MarginWrapperManager { id: manager }
}
@@ -0,0 +1,60 @@
import QtQuick
///! MouseArea wrapper item.
/// This component is useful for wrapping a single component in
/// a mouse area. It works the same as @@WrapperItem, but with a @@QtQuick.MouseArea.
///
/// > [!NOTE] WrapperMouseArea is a @@MarginWrapperManager based component.
/// > See its documentation for information on how margins and sizes are calculated.
///
/// > [!NOTE] The child item can be specified by writing it inline in the wrapper,
/// > as in the example above, or by using the @@child property. See
/// > @@WrapperManager.child for details.
///
/// > [!WARNING] You should not set @@Item.x, @@Item.y, @@Item.width,
/// > @@Item.height or @@Item.anchors on the child item, as they are used
/// > by WrapperItem to position it. Instead set @@Item.implicitWidth and
/// > @@Item.implicitHeight.
///
/// [QtQuick.Layouts]: https://doc.qt.io/qt-6/qtquicklayouts-index.html
MouseArea {
/// The default for @@topMargin, @@bottomMargin, @@leftMargin and @@rightMargin.
/// Defaults to 0.
property /*real*/alias margin: manager.margin
/// An extra margin applied in addition to @@topMargin, @@bottomMargin,
/// @@leftMargin, and @@rightMargin. Defaults to 0.
property /*real*/alias extraMargin: manager.extraMargin
/// The requested top margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias topMargin: manager.topMargin
/// The requested bottom margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias bottomMargin: manager.bottomMargin
/// The requested left margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias leftMargin: manager.leftMargin
/// The requested right margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias rightMargin: manager.rightMargin
/// Determines if child item should be resized larger than its implicit size if
/// the parent is resized larger than its implicit size. Defaults to true.
property /*bool*/alias resizeChild: manager.resizeChild
/// Overrides the implicit width of the wrapper.
///
/// Defaults to the implicit width of the content item plus its left and right margin,
/// and may be reset by assigning `undefined`.
property /*real*/alias implicitWidth: manager.implicitWidth
/// Overrides the implicit height of the wrapper.
///
/// Defaults to the implicit width of the content item plus its top and bottom margin,
/// and may be reset by assigning `undefined`.
property /*real*/alias implicitHeight: manager.implicitHeight
/// See @@WrapperManager.child for details.
property /*Item*/alias child: manager.child
MarginWrapperManager { id: manager }
}
@@ -0,0 +1,71 @@
import QtQuick
///! Rectangle that handles sizes and positioning for a single visual child.
/// This component is useful for adding a border or background rectangle to
/// a child item. If you need to clip the child item to the rectangle's
/// border, see @@ClippingWrapperRectangle.
///
/// > [!NOTE] WrapperRectangle is a @@MarginWrapperManager based component.
/// > See its documentation for information on how margins and sizes are calculated.
///
/// > [!WARNING] You should not set @@Item.x, @@Item.y, @@Item.width,
/// > @@Item.height or @@Item.anchors on the child item, as they are used
/// > by WrapperItem to position it. Instead set @@Item.implicitWidth and
/// > @@Item.implicitHeight.
Rectangle {
id: root
/// If true (default), the rectangle's border width will be added
/// to @@extraMargin.
property bool contentInsideBorder: true
/// The default for @@topMargin, @@bottomMargin, @@leftMargin and @@rightMargin.
/// Defaults to 0.
property /*real*/alias margin: manager.margin
/// An extra margin applied in addition to @@topMargin, @@bottomMargin,
/// @@leftMargin, and @@rightMargin.
/// If @@contentInsideBorder is true, the rectangle's border width will be added
/// to this property. Defaults to 0.
property real extraMargin: 0
/// The requested top margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias topMargin: manager.topMargin
/// The requested bottom margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias bottomMargin: manager.bottomMargin
/// The requested left margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias leftMargin: manager.leftMargin
/// The requested right margin of the content item, not counting @@extraMargin.
///
/// Defaults to @@margin, and may be reset by assigning `undefined`.
property /*real*/alias rightMargin: manager.rightMargin
/// Determines if child item should be resized larger than its implicit size if
/// the parent is resized larger than its implicit size. Defaults to true.
property /*bool*/alias resizeChild: manager.resizeChild
/// Overrides the implicit width of the wrapper.
///
/// Defaults to the implicit width of the content item plus its left and right margin,
/// and may be reset by assigning `undefined`.
property /*real*/alias implicitWidth: manager.implicitWidth
/// Overrides the implicit height of the wrapper.
///
/// Defaults to the implicit width of the content item plus its top and bottom margin,
/// and may be reset by assigning `undefined`.
property /*real*/alias implicitHeight: manager.implicitHeight
/// See @@WrapperManager.child for details.
property alias child: manager.child
// Reading the border property implicitly sets border width to 1.
// Setting it to 0 here means the user will also have to set border.width
// even if they just want 1, but it prevents adding unexpected padding
// and works around QTBUG-137166 otherwise.
border.width: 0
MarginWrapperManager {
id: manager
extraMargin: (root.contentInsideBorder ? root.border.width : 0) + root.extraMargin
}
}
@@ -0,0 +1,15 @@
module Quickshell.Widgets
linktarget quickshell-widgetsplugin
optional plugin quickshell-widgetsplugin
classname Quickshell_WidgetsPlugin
typeinfo quickshell-widgets.qmltypes
prefer :/qt/qml/Quickshell/Widgets/
IconImage 0.0 IconImage.qml
ClippingRectangle 0.0 ClippingRectangle.qml
WrapperItem 0.0 WrapperItem.qml
WrapperMouseArea 0.0 WrapperMouseArea.qml
WrapperRectangle 0.0 WrapperRectangle.qml
ClippingWrapperRectangle 0.0 ClippingWrapperRectangle.qml
ClippingWrapperRectangleInternal 0.0 ClippingWrapperRectangleInternal.qml
depends QtQuick

Some files were not shown because too many files have changed in this diff Show More