Author SHA1 Message Date
alvinlollo c97c63d375 Add markdown statuses
Check Packages / check-packages (push) Failing after 3s
Syntax Check / syntax-check (push) Failing after 4s
2026-09-14 21:04:46 +10:00
alvinlollo 0a61f54119 Fix script syntax 2026-09-14 21:04:31 +10:00
alvinlollo af7856e331 Make gitea actions run on push 2026-09-14 21:04:14 +10:00
alvinlollo 568c64d40b Fix gitea workflows
Syntax Check / syntax-check (push) Failing after 24s
2026-09-14 17:21:38 +10:00
alvinlollo c126b5ce18 Retry syntax-check with native host runner
Syntax Check / syntax-check (push) Failing after 47s
2026-09-14 16:18:38 +10:00
alvinlollo be184841b4 Retry syntax-check with host execution mode
Syntax Check / syntax-check (push) Failing after 1s
2026-09-14 16:15:03 +10:00
alvinlollo 0bd92a3393 Retry syntax-check with Docker-based runner
Syntax Check / syntax-check (push) Failing after 3s
2026-09-14 16:12:06 +10:00
alvinlollo 1d918e8971 Fix syntax-check: use ubuntu-latest without container for linting
Syntax Check / syntax-check (push) Failing after 2s
2026-09-14 15:58:39 +10:00
alvinlollo 08e114611d Fix checkout: install git+node in Arch container before checkout
Syntax Check / syntax-check (push) Failing after 22s
2026-09-14 15:53:41 +10:00
alvinlollo 65770d9d43 Fix syntax-check: remove commit count gate, use pacman for Arch
Syntax Check / syntax-check (push) Failing after 3s
2026-09-14 15:52:27 +10:00
alvinlollo cf4dfb6f95 Change Runner os to archlinux
Syntax Check (Every 2 Commits) / syntax-check (push) Skipped
2026-09-14 15:45:40 +10:00
alvinlollo 726d5997c3 Add syntax checking for every 2 commits
Syntax Check (Every 2 Commits) / syntax-check (push) Skipped
2026-09-14 12:33:17 +10:00
alvinlollo a62c954a87 Add monthly iso build workflow that can be triggered manually 2026-09-14 11:43:11 +10:00
alvinlollo e0e3609496 Add package verification workflow 2026-09-14 11:42:47 +10:00
alvinlollo c3597ce723 Add dotfiles file structure 2026-09-14 11:36:12 +10:00
alvinlollo 5bb5a413c2 Add missing aur packages not in packages.x86_64 2026-09-14 11:34:52 +10:00
alvinlollo ac497c0f92 Add end-4 hyprland dependecies post-install 2026-09-14 11:34:15 +10:00
alvinlollo 89544407d8 Add zsh config 2026-09-14 11:26:32 +10:00
alvinlollo 03270a1384 Add starfish for fish 2026-09-14 11:26:15 +10:00
alvinlollo dc15394417 Add end-4 dotfiles config 2026-09-14 11:25:38 +10:00
alvinlollo 208564537f Add fish config 2026-09-14 11:25:01 +10:00
alvinlollo 0ff9424868 Add Bat config 2026-09-14 11:24:54 +10:00
alvinlollo 66620a1ff9 Add Lazyvim config 2026-09-14 11:24:16 +10:00
alvinlollo f662dcf150 Update Packages 2026-09-14 07:26:19 +10:00
alvinlollo 6aee44b390 Add CachyOS keyrings and AUR packages 2026-09-13 22:57:38 +10:00
alvinlollo 4aa9a121ea Add Australian Locales 2026-09-13 22:56:32 +10:00
alvinlollo cf6f3c53d3 Add soft custom branding 2026-09-13 22:31:37 +10:00
alvinlollo a33855e51a Add Packages and Clamav config 2026-09-13 22:19:09 +10:00
alvinlollo d30336c943 Add to packages.x86_64 use sort -u -o packages.x86_64 packages.x86_64 2026-09-13 21:17:14 +10:00
alvinlollo fb1a75d30b Add packages.x86_64 use sort -u -o packages.x86_64 packages.x86_64 2026-09-13 21:14:49 +10:00
alvinlollo fbfea24414 Add README.md guide to make a Arch Linux ISO 2026-09-13 19:50:02 +10:00
alvinlollo 5ed4adbe45 Copied default archiso releng configuration 2026-09-13 19:47:10 +10:00
alvinlollo 035dade293 first commit 2026-09-13 19:46:09 +10:00
181 changed files with 1631 additions and 20969 deletions
+39 -530
View File
@@ -1,14 +1,10 @@
name: Automated Arch ISO Build
name: Scheduled ArchISO Build
on:
schedule:
- cron: "0 0 1 * *" # Runs monthly on the 1st day of the month
workflow_dispatch: # Allows manual triggers (multiple times a month)
concurrency:
group: iso-build
cancel-in-progress: false # Never kill a build that is mid-flight
jobs:
build:
runs-on: archlinux
@@ -19,567 +15,80 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup local AUR repo
run: |
set -euo pipefail
shopt -s nullglob
mkdir -p /tmp/localrepo
cp localrepo/*.pkg.tar.zst localrepo/local-aur.db* localrepo/local-aur.files* /tmp/localrepo/
sed -i 's|file:///home/alvin/AlvinArch/localrepo|file:///tmp/localrepo|' pacman.conf
# The medium needs its own copy: the ISO's /etc/pacman.conf points
# [local-aur] at file:///opt/localrepo, which pacstrap reads at
# install time to resolve packages that are not in the official repos
# (built during the ISO build and harvested there by
# airootfs/root/customize_airootfs.sh).
mkdir -p airootfs/opt/localrepo
shipped=(localrepo/*.pkg.tar.zst localrepo/local-aur.db* localrepo/local-aur.files*)
if (( ${#shipped[@]} > 0 )); then
cp -L "${shipped[@]}" airootfs/opt/localrepo/
fi
echo "airootfs/opt/localrepo: $(ls airootfs/opt/localrepo | wc -l) file(s)"
- name: Install archiso and dependencies
run: |
set -euo pipefail
# Install with a *private* config instead of /etc/pacman.conf.
# The host config is shared mutable state: the tests workflow
# rewrites it and jobs overlap on this runner (runs 132 and 133
# ran concurrently), so writing it here could corrupt a concurrent
# tests run. It also carries [cachyos] and [chaotic-aur] leftovers
# from tests.yaml, and syncing those two repos means extra DNS
# lookups against a gateway that intermittently drops UDP/53 —
# that is what failed run 131 at this very step. The build only
# needs archiso/jq from extra; mkarchiso reads the *profile's*
# pacman.conf for everything that goes into the ISO.
BUILD_CONF=$(mktemp)
trap 'rm -f "$BUILD_CONF"' EXIT
cat > "$BUILD_CONF" << 'STOCKCONF'
[options]
DisableSandbox
HoldPkg = pacman glibc
Architecture = auto
CheckSpace
ParallelDownloads = 5
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
STOCKCONF
sed -i 's/^ //' "$BUILD_CONF"
# Warm the resolver cache for the mirrors we are about to query.
# systemd-resolved serves later lookups from cache, so a gateway
# UDP/53 burst cannot hit them again. Failures here are not fatal —
# the retry loop below is the real safety net.
for host in mirror.aarnet.edu.au gsl-syd.mm.fcix.net au.arch.niranjan.co; do
for try in 1 2 3 4 5; do
if getent hosts "$host" >/dev/null 2>&1; then
break
fi
echo " ⏳ DNS for $host failed (try $try/5), retrying in $(( try * 3 ))s..."
sleep $(( try * 3 ))
done
done
# The gateway drops DNS queries in bursts; one burst must not fail
# the whole job, so retry with backoff before giving up.
synced=0
for try in 1 2 3 4 5; do
if pacman --config "$BUILD_CONF" -Syu --noconfirm --needed archiso jq; then
synced=1
break
fi
echo " ⚠️ pacman -Syu failed (attempt $try/5), retrying in $(( try * 15 ))s..." >&2
sleep $(( try * 15 ))
done
if [ "$synced" -ne 1 ]; then
echo "❌ pacman -Syu failed after 5 attempts — giving up" >&2
exit 1
fi
- name: Ensure /dev/fd symlinks exist for mkinitcpio and procsub
run: |
set -euo pipefail
# mkinitcpio's preset step pipes through /dev/stdin and bash process
# substitution (< <(...)) uses /dev/fd; both break if these symlinks
# are missing (they are normally created once at boot by mkinitcpio's
# init). Two places need them, so cover both:
# 1. the executor's own /dev: mkarchiso reads /dev/stdin on the host
# (machine-id, version, pkglist) and the workflow's own scripts use
# process substitution here. A no-op if the links already exist.
ln -sfn /proc/self/fd /dev/fd
ln -sfn /proc/self/fd/0 /dev/stdin
ln -sfn /proc/self/fd/1 /dev/stdout
ln -sfn /proc/self/fd/2 /dev/stderr
# 2. the chroot's /dev: devtmpfs is single-instance, so mounting it
# here yields the same tree that pacstrap/arch-chroot expose as
# <chroot>/dev. When the executor's /dev is itself devtmpfs (1)
# already fixed that tree; this pass is what makes it work when
# the executor's /dev is a plain tmpfs or directory instead.
d="$(mktemp -d)"
trap 'umount "$d" 2>/dev/null || true; rmdir "$d" 2>/dev/null || true' EXIT
mount -t devtmpfs devtmpfs "$d"
ln -sfn /proc/self/fd "$d/fd"
ln -sfn /proc/self/fd/0 "$d/stdin"
ln -sfn /proc/self/fd/1 "$d/stdout"
ln -sfn /proc/self/fd/2 "$d/stderr"
ls -l "$d/fd" "$d/stdin" "$d/stdout" "$d/stderr"
umount "$d"
rmdir "$d"
trap - EXIT
pacman -Syu --noconfirm archiso jq
- name: Build Arch ISO
run: |
set -euo pipefail
# Pin one timestamp for the whole job: mkarchiso derives the ISO label,
# volume UUID, file mtimes, and ext4 hash seed from SOURCE_DATE_EPOCH.
# Exporting it explicitly makes every timestamp-derived value traceable
# (and lets later steps log the same value via $GITHUB_ENV).
SOURCE_DATE_EPOCH="$(date -u +%s)"
export SOURCE_DATE_EPOCH
echo "SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH" >> "$GITHUB_ENV"
echo "Building with SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH"
# Clean up immediately even if this step is interrupted (cancel/exit):
# unmount leftovers first, then remove the multi-GB work dir.
trap 'umount -R "$PWD/work" 2>/dev/null || true; rm -rf "$PWD/work"' EXIT HUP INT TERM
rm -rf "$PWD/work"
# Always start from an empty out dir so stale ISOs are never re-uploaded
rm -rf "$PWD/out"
mkdir -p "$PWD/out"
mkarchiso -v -w "$PWD/work" -o "$PWD/out" -- "$PWD"
- name: Verify ISO search metadata
run: |
set -euo pipefail
shopt -s nullglob
isos=(out/*.iso)
if (( ${#isos[@]} != 1 )); then
echo "❌ Expected exactly 1 ISO in out/, found ${#isos[@]}" >&2
exit 1
fi
iso=${isos[0]}
# blkid exits non-zero when a field is missing; keep going so the
# explicit guard below can report a useful error.
vol_uuid=$(blkid -o value -s UUID "$iso" || true)
vol_label=$(blkid -o value -s LABEL "$iso" || true)
if [ -z "$vol_uuid" ]; then
echo "❌ blkid found no UUID for $iso — volume date chain broken?" >&2
exit 1
fi
echo "Volume UUID: $vol_uuid"
echo "Volume label: ${vol_label:-<none>}"
echo "SOURCE_DATE_EPOCH: ${SOURCE_DATE_EPOCH:-<unset>}"
fail() {
echo "❌ $1" >&2
echo " If you changed boot configs (efiboot/, syslinux/, grub/) on purpose," >&2
echo " update this 'Verify ISO search metadata' step to match." >&2
exit 1
}
# 1) /boot/<uuid>.uuid (the archisosearchfilename fallback key) must
# exist inside the ISO and its stem must equal the volume UUID.
uuid_refs=0
while IFS= read -r member; do
[ -z "$member" ] && continue
member=${member#/}
stem=$(basename "$member" .uuid)
if [ "$stem" != "$vol_uuid" ]; then
fail "$member: stem '$stem' != volume UUID '$vol_uuid'"
fi
echo " ✅ $member matches volume UUID"
uuid_refs=$((uuid_refs + 1))
done < <(bsdtar -tf "$iso" | grep -E '(^|/)boot/[0-9A-Za-z-]+\.uuid$' || true)
if (( uuid_refs == 0 )); then
fail "no /boot/<uuid>.uuid file found inside the ISO"
fi
# 2) Every archisosearchuuid= in shipped boot configs must equal the
# volume UUID; every %ARCHISO% placeholder must have been substituted.
search_refs=0
while IFS= read -r member; do
[ -z "$member" ] && continue
member=${member#/}
if ! content=$(bsdtar -xOf "$iso" "$member" 2>/dev/null); then
fail "could not extract $member from the ISO"
fi
if printf '%s\n' "$content" | grep -q '%ARCHISO'; then
fail "$member contains an unsubstituted %ARCHISO% placeholder"
fi
while IFS= read -r val; do
[ -z "$val" ] && continue
search_refs=$((search_refs + 1))
if [ "$val" != "$vol_uuid" ]; then
fail "$member: archisosearchuuid=$val != volume UUID '$vol_uuid'"
fi
echo " ✅ $member: archisosearchuuid=$val matches volume UUID"
done < <(printf '%s\n' "$content" | grep -o 'archisosearchuuid=[^[:space:]]*' | cut -d= -f2- || true)
done < <(bsdtar -tf "$iso" | grep -E '(^|/)(loader/entries/.*\.conf|boot/.*\.(cfg|conf))$' || true)
if (( search_refs == 0 )); then
fail "no archisosearchuuid= references found in shipped boot configs (params removed without updating this check?)"
fi
echo "✅ ISO search metadata consistent: $uuid_refs uuid file(s), $search_refs search reference(s)"
# Replace 'releng' with your custom profile directory if needed
mkarchiso -v -w work -o out/ releng
- name: Generate Unique Dynamic Tag
id: tag
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GITEA_API: http://192.168.1.168:3000/api/v1
SERVER_URL: ${{ github.server_url }}
REPOSITORY: ${{ github.repository }}
run: |
set -euo pipefail
test -n "$GITEA_TOKEN"
# Pre-flight: confirm the internal Gitea API is reachable so failures are clear
if ! curl -sfS -o /dev/null "$GITEA_API/version"; then
echo "❌ Cannot reach Gitea API at $GITEA_API" >&2
exit 1
fi
BASE_DATE=$(date -u +'%Y.%m.%d')
REVISION=1
TAG_NAME="iso-${BASE_DATE}-r${REVISION}"
# Check if the tag already exists via Gitea API, increment revision loop if it does
while curl -sf -o /dev/null -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$REPOSITORY/releases/tags/$TAG_NAME"; do
REVISION=$((REVISION + 1))
TAG_NAME="iso-${BASE_DATE}-r${REVISION}"
while curl -s -o /dev/null -w "%{http_code}" -H "Authorization: token $GITEA_TOKEN" \
"$SERVER_URL/api/v1/repos/$REPOSITORY/releases/tags/$TAG_NAME" | grep -q "200"; do
REVISION=$((REVISION + 1))
TAG_NAME="iso-${BASE_DATE}-r${REVISION}"
done
echo "tag_name=${TAG_NAME}" >> "$GITHUB_OUTPUT"
echo "release_name=Arch Linux ISO (${BASE_DATE} Rev ${REVISION})" >> "$GITHUB_OUTPUT"
echo "tag_name=${TAG_NAME}" >> $GITHUB_OUTPUT
echo "release_name=Arch Linux ISO (${BASE_DATE} Rev ${REVISION})" >> $GITHUB_OUTPUT
- name: Create Release and Upload ISO
id: release
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
# Use internal Gitea URL to bypass traefik proxy timeout on large uploads
GITEA_API: http://192.168.1.168:3000/api/v1
SERVER_URL: ${{ github.server_url }}
REPOSITORY: ${{ github.repository }}
TAG_NAME: ${{ steps.tag.outputs.tag_name }}
RELEASE_NAME: ${{ steps.tag.outputs.release_name }}
run: |
set -eu
shopt -s nullglob
tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
if [ -z "$GITEA_TOKEN" ]; then
echo "❌ GITEA_TOKEN is empty" >&2
exit 1
fi
if [ -z "$TAG_NAME" ]; then
echo "❌ TAG_NAME is empty" >&2
exit 1
fi
if [ -z "$RELEASE_NAME" ]; then
echo "❌ RELEASE_NAME is empty" >&2
exit 1
fi
# Create the release via Gitea API
RELEASE_ID=$(curl -s -X POST \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
"$SERVER_URL/api/v1/repos/$REPOSITORY/releases" \
-d "{\"tag_name\": \"$TAG_NAME\", \"name\": \"$RELEASE_NAME\"}" \
| jq -r '.id')
# Pre-flight: confirm the internal Gitea API is reachable so failures are clear
if ! curl -sfS -o /dev/null "$GITEA_API/version"; then
echo "❌ Cannot reach Gitea API at $GITEA_API" >&2
exit 1
fi
echo "Created release ID: $RELEASE_ID"
# Collect the ISOs produced by the build and record SHA-256
isos=(out/*.iso)
if (( ${#isos[@]} == 0 )); then
echo "❌ No ISO found in out/ — nothing to upload, aborting." >&2
exit 1
fi
sha256sums=()
for iso in "${isos[@]}"; do
fname=$(basename "$iso")
size=$(stat -c %s "$iso")
# Sanity check: a real ISO is multi-GB; anything tiny is the wrong file
if (( size < 100000000 )); then
echo "❌ '$iso' is only $size bytes — refusing to upload (not an ISO)." >&2
exit 1
fi
sha=$(sha256sum "$iso" | awk '{print $1}')
if [ -z "$sha" ]; then
echo "❌ Failed to compute SHA-256 for '$iso'" >&2
exit 1
fi
echo " ✅ $fname: $(( size / 1024 / 1024 )) MiB, sha256=$sha"
sha256sums+=("$sha")
done
# Build the release body with SHA-256 checksums
printf -v body 'Arch Linux live ISO %s\n\nChecksums (SHA-256):\n' "$RELEASE_NAME"
for i in "${!isos[@]}"; do
# Release body: markdown backticks are literal (printf format below)
# shellcheck disable=SC2016
printf -v line -- '- `%s`: sha256 `%s`\n' "$(basename "${isos[$i]}")" "${sha256sums[$i]}"
body+="$line"
done
# Create the release (curl result written to a file, checked with if)
payload=$(jq -nc --arg tag "$TAG_NAME" --arg name "$RELEASE_NAME" --arg body "$body" \
'{tag_name:$tag,name:$name,body:$body}')
if ! curl -sf -X POST \
# Upload each ISO as a release asset
for iso in out/*.iso; do
echo "Uploading $iso..."
curl -s -X POST \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
"$GITEA_API/repos/$REPOSITORY/releases" \
-d "$payload" -o "$tmpdir/release.json"; then
echo "❌ Failed to create release $TAG_NAME" >&2
exit 1
fi
if ! RELEASE_ID=$(jq -er '.id' "$tmpdir/release.json"); then
echo "❌ Release response contained no id" >&2
exit 1
fi
echo "release_id=${RELEASE_ID}" >> "$GITHUB_OUTPUT"
echo " ✅ Created release $TAG_NAME (ID: $RELEASE_ID)"
# Upload each ISO as a release asset, up to 3 attempts per file
MAX_ATTEMPTS=3
for i in "${!isos[@]}"; do
iso=${isos[$i]}
fname=$(basename "$iso")
size=$(stat -c %s "$iso")
echo "Uploading $fname ($(( size / 1024 / 1024 )) MiB) to release $TAG_NAME..."
uploaded=0
attempt=1
while [ "$attempt" -le "$MAX_ATTEMPTS" ]; do
# Fresh output file each attempt: curl does not truncate -o on
# transport failure, so a stale body must not be misreported.
rm -f "$tmpdir/upload.json"
# A previous attempt may have saved the asset but lost the
# response; Gitea rejects duplicate names, so only after the
# first attempt check for and remove same-name leftovers
if [ "$attempt" -gt 1 ]; then
if curl -sf -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID/assets" \
-o "$tmpdir/assets.json"; then
asset_ids=$(jq -r --arg name "$fname" \
'.[] | select(.name == $name) | .id' "$tmpdir/assets.json")
while read -r asset_id; do
if [ -n "$asset_id" ]; then
echo " ↻ Removing leftover asset id=$asset_id from a previous attempt"
if ! curl -sf -X DELETE -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID/assets/$asset_id" \
-o /dev/null; then
echo " ⚠️ Could not remove leftover asset id=$asset_id (continuing)" >&2
fi
fi
done <<< "$asset_ids"
fi
fi
# Capture HTTP status explicitly: `-f` would swallow the Gitea
# error body (e.g. attachment size-limit messages) and leave the
# failure reason unknown.
if http_code=$(curl -sS -X POST --max-time 600 \
-H "Authorization: token $GITEA_TOKEN" \
-F "attachment=@$iso" \
"$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID/assets" \
-o "$tmpdir/upload.json" -w '%{http_code}'); then
if [ "${http_code:0:1}" = "2" ] \
&& download_url=$(jq -er '.browser_download_url' "$tmpdir/upload.json"); then
echo " ✅ Uploaded $fname (attempt $attempt/$MAX_ATTEMPTS): $download_url"
uploaded=1
break
fi
echo " ⚠️ Upload of $fname: HTTP $http_code (attempt $attempt/$MAX_ATTEMPTS)" >&2
echo " Response: $(head -c 2000 "$tmpdir/upload.json" 2>/dev/null)" >&2
else
rc=$?
echo " ⚠️ Upload of $fname failed (attempt $attempt/$MAX_ATTEMPTS): curl exit $rc, HTTP ${http_code:-000}" >&2
if [ -s "$tmpdir/upload.json" ]; then
echo " Response: $(head -c 2000 "$tmpdir/upload.json")" >&2
fi
fi
if [ "$attempt" -lt "$MAX_ATTEMPTS" ]; then
sleep $(( attempt * 10 ))
fi
attempt=$(( attempt + 1 ))
done
if [ "$uploaded" -ne 1 ]; then
echo "❌ Failed to upload $fname after $MAX_ATTEMPTS attempts — aborting." >&2
exit 1
fi
-F "attachment=@$iso" \
"$SERVER_URL/api/v1/repos/$REPOSITORY/releases/$RELEASE_ID/assets"
done
echo "✅ All ISOs uploaded to release $TAG_NAME"
exit 0
echo "Release $TAG_NAME created and ISOs uploaded."
- name: Verify uploaded ISO checksums
if: success()
- name: Keep only latest 3 releases
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
# Internal origin bypasses traefik (and its Anubis bot wall) — the
# same host the upload step already uses.
GITEA_API: http://192.168.1.168:3000/api/v1
GITEA_ORIGIN: http://192.168.1.168:3000
REPOSITORY: ${{ github.repository }}
TAG_NAME: ${{ steps.tag.outputs.tag_name }}
RELEASE_ID: ${{ steps.release.outputs.release_id }}
run: |
set -euo pipefail
shopt -s nullglob
tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
for var in GITEA_TOKEN TAG_NAME RELEASE_ID; do
if [ -z "${!var:-}" ]; then
echo "❌ $var is empty" >&2
exit 1
fi
done
case "$RELEASE_ID" in
''|*[!0-9]*) echo "❌ RELEASE_ID is not numeric: $RELEASE_ID" >&2; exit 1 ;;
esac
# fail_verify <reason...>: job fails but the release is kept — used
# for transport/API errors where the upload itself may be fine.
fail_verify() {
echo "❌ $1" >&2
echo " Release $TAG_NAME (ID $RELEASE_ID) left in place (not proven corrupt)." >&2
exit 1
}
# abort_release <reason...>: the asset is provably wrong — delete the
# release so a corrupt asset can never be published, then fail.
abort_release() {
echo "❌ $1" >&2
echo "Deleting release $TAG_NAME (ID $RELEASE_ID) so the bad upload cannot be used..." >&2
if ! curl -sf -X DELETE -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID" -o /dev/null; then
echo "⚠️ Could not delete release $RELEASE_ID — delete it manually!" >&2
fi
exit 1
}
isos=(out/*.iso)
if (( ${#isos[@]} == 0 )); then
echo "❌ No ISO in out/ to verify" >&2
exit 1
fi
# Recompute local checksums
declare -A local_sha local_size
for iso in "${isos[@]}"; do
fname=$(basename "$iso")
local_sha["$fname"]=$(sha256sum "$iso" | awk '{print $1}')
local_size["$fname"]=$(stat -c %s "$iso")
if [ -z "${local_sha[$fname]}" ]; then
echo "❌ Failed to compute SHA-256 for '$iso'" >&2
exit 1
fi
done
# List the release's assets as uploaded (API error = transient, no delete)
if ! curl -sf -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID/assets" \
-o "$tmpdir/assets.json"; then
fail_verify "Failed to list assets of release $RELEASE_ID (API/transport error)"
fi
for iso in "${isos[@]}"; do
fname=$(basename "$iso")
api_size=$(jq -er --arg name "$fname" \
'.[] | select(.name == $name) | .size' "$tmpdir/assets.json" 2>/dev/null) \
|| abort_release "Asset '$fname' missing from release $RELEASE_ID"
if [ "$api_size" != "${local_size[$fname]}" ]; then
abort_release "Asset '$fname' size mismatch: server=$api_size local=${local_size[$fname]}"
fi
# Download from the internal origin (traefik/Anubis bypassed).
# iso_name contains a space ("Alvin archlinux"), so the filename
# must be percent-encoded or curl rejects the URL outright.
enc_fname=$(jq -rn --arg v "$fname" '$v|@uri')
url="$GITEA_ORIGIN/$REPOSITORY/releases/download/$TAG_NAME/$enc_fname"
downloaded=0
for attempt in 1 2 3; do
# Try header auth, then ?token=, then anonymous (public repo).
if curl -sfL --max-time 600 -H "Authorization: token $GITEA_TOKEN" \
"$url" -o "$tmpdir/$fname"; then
downloaded=1
elif curl -sfL --max-time 600 "$url?token=$GITEA_TOKEN" \
-o "$tmpdir/$fname"; then
downloaded=1
elif curl -sfL --max-time 600 "$url" -o "$tmpdir/$fname"; then
downloaded=1
fi
[ "$downloaded" -eq 1 ] && break
echo " ⚠️ Download of $fname failed (attempt $attempt/3)" >&2
[ "$attempt" -lt 3 ] && sleep $(( attempt * 10 ))
done
if [ "$downloaded" -ne 1 ]; then
fail_verify "Could not download asset '$fname' back from release $RELEASE_ID (auth/transport error, not proven corrupt)"
fi
actual=$(sha256sum "$tmpdir/$fname" | awk '{print $1}')
expected=${local_sha[$fname]}
if [ "$actual" != "$expected" ]; then
abort_release "SHA-256 mismatch for '$fname': server=$actual local=$expected"
fi
echo " ✅ $fname: size and SHA-256 match"
rm -f "$tmpdir/$fname"
done
echo "✅ All uploaded assets verified against local ISO checksums"
exit 0
- name: Keep only latest 2 releases
if: success()
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GITEA_API: http://192.168.1.168:3000/api/v1
SERVER_URL: ${{ github.server_url }}
REPOSITORY: ${{ github.repository }}
run: |
set -euo pipefail
test -n "$GITEA_TOKEN"
# Fetch all releases
releases=$(curl -s -H "Authorization: token $GITEA_TOKEN" \
"$SERVER_URL/api/v1/repos/$REPOSITORY/releases")
echo "Pruning old releases in $REPOSITORY..."
readarray -t ids < <(curl -sf -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$REPOSITORY/releases" \
| jq -er 'sort_by(.created_at) | .[].id')
to_delete=$(( ${#ids[@]} - 2 ))
if (( to_delete > 0 )); then
for ((i = 0; i < to_delete; i++)); do
id=${ids[$i]}
# Sort by creation date and delete old ones, keeping only the 3 newest releases
echo "$releases" | jq -r 'sort_by(.created_at) | .[].id' | head -n -3 | while read -r id; do
if [ -n "$id" ]; then
echo "Deleting old release ID: $id"
curl -sf -X DELETE -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$REPOSITORY/releases/$id"
done
fi
- name: Cleanup mkarchiso mounts and workdirs
if: always() # Runs on success, failure, or cancellation
run: |
set -eu
# Steps run as root (pacman is used directly); fall back to sudo if not
if [ "$(id -u)" -eq 0 ]; then
PRIV=""
else
PRIV="sudo"
fi
# Unmount any leftover loop devices or bind mounts in the work directory
$PRIV umount -R "$PWD/work" 2>/dev/null || true
# Clean up loop devices if any remain attached to the work dir
$PRIV losetup -D || true
# Remove working directories with proper permissions
$PRIV rm -rf "$PWD/work"
- name: Remove built ISO
if: always()
run: |
set -eu
rm -rf "$PWD/out"
curl -s -X DELETE -H "Authorization: token $GITEA_TOKEN" \
"$SERVER_URL/api/v1/repos/$REPOSITORY/releases/$id"
fi
done
+129
View File
@@ -0,0 +1,129 @@
name: Check Packages
on:
push:
pull_request:
workflow_dispatch:
jobs:
check-packages:
runs-on: archlinux
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Install prerequisites
run: |
pacman -Syu --noconfirm --needed pacman pacman-contrib curl gnupg
- name: Set up official repos (extra, multilib)
run: |
printf '%s\n' \
'[options]' \
'Architecture = auto' \
'SigLevel = Required DatabaseOptional' \
'LocalFileSigLevel = Optional' \
'' \
'[core]' \
'Include = /etc/pacman.d/mirrorlist' \
'' \
'[extra]' \
'Include = /etc/pacman.d/mirrorlist' \
'' \
'[multilib]' \
'Include = /etc/pacman.d/mirrorlist' \
> /etc/pacman.conf
# Generate a basic mirrorlist
curl -fsSL "https://archlinux.org/mirrorlist/all/status/" \
| sed 's/^#Server/Server/' | head -20 > /etc/pacman.d/mirrorlist
pacman -Syu --noconfirm
- name: Set up CachyOS repo
run: |
# Import CachyOS keyring
curl -fsSL https://mirror.cachyos.org/cachyos-keyring.pkg.tar.zst \
-o /tmp/cachyos-keyring.pkg.tar.zst
pacman -U --noconfirm /tmp/cachyos-keyring.pkg.tar.zst || true
# Add CachyOS mirrorlist
printf '%s\n' \
'Server = https://mirror.cachyos.org/$repo/$arch' \
> /etc/pacman.d/cachyos-mirrorlist
# Add CachyOS repo to pacman.conf
printf '\n[cachyos]\nSigLevel = Optional TrustAll\nInclude = /etc/pacman.d/cachyos-mirrorlist\n' \
>> /etc/pacman.conf
pacman -Syu --noconfirm
- name: Set up chaotic-aur repo
run: |
# Import chaotic-aur keyring
pacman-key --recv-key FBA220DFC880C036 --keyserver keyserver.ubuntu.com
pacman-key --lsign-key FBA220DFC880C036 || true
# Add chaotic-aur mirrorlist
printf '%s\n' \
'Server = https://chaotic.archlinux.org/$repo/$arch' \
> /etc/pacman.d/chaotic-mirrorlist
# Add chaotic-aur repo to pacman.conf
printf '\n[chaotic-aur]\nSigLevel = Optional TrustAll\nInclude = /etc/pacman.d/chaotic-mirrorlist\n' \
>> /etc/pacman.conf
pacman -Syu --noconfirm
- name: Check all packages
run: |
echo "═══════════════════════════════════════════════════════════════"
echo " Checking packages.x86_64 against repos"
echo " Allowed repos: cachyos, extra, multilib, chaotic-aur"
echo "═══════════════════════════════════════════════════════════════"
ALLOWED_REPOS="^(cachyos|extra|multilib|chaotic-aur)$"
MISSING=()
FOUND=0
TOTAL=0
while IFS= read -r pkg; do
# Skip empty lines and comments
[[ -z "$pkg" || "$pkg" =~ ^# ]] && continue
TOTAL=$((TOTAL + 1))
# Query pacman for the package's repository
repo=$(pacman -Si "$pkg" 2>/dev/null | grep "^Repository" | awk '{print $3}')
if [[ -z "$repo" ]]; then
echo "❌ MISSING: $pkg"
MISSING+=("$pkg")
elif [[ "$repo" =~ $ALLOWED_REPOS ]]; then
FOUND=$((FOUND + 1))
else
echo "⚠️ WRONG REPO: $pkg (found in: $repo)"
MISSING+=("$pkg")
fi
done < packages.x86_64
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " Results: $FOUND / $TOTAL packages found in allowed repos"
echo "═══════════════════════════════════════════════════════════════"
if [[ ${#MISSING[@]} -gt 0 ]]; then
echo ""
echo "⚠️ ${#MISSING[@]} package(s) NOT in allowed repos:"
for p in "${MISSING[@]}"; do
echo " • $p"
done
echo ""
echo "These packages must be in:"
echo " • cachyos, extra, multilib, or chaotic-aur"
echo " • OR pre-built in localrepo/"
echo " • OR added to build-end4-deps.sh"
exit 1
else
echo ""
echo "✅ All packages verified successfully!"
fi
-26
View File
@@ -1,26 +0,0 @@
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
+136
View File
@@ -0,0 +1,136 @@
name: Syntax Check
on:
push:
branches:
- "**"
jobs:
syntax-check:
runs-on: archlinux
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install linting tools
run: |
set -e
pacman -Syu --noconfirm --needed shellcheck python-yamllint
- name: Lint shell scripts with ShellCheck
run: |
echo "═══════════════════════════════════════════════════════════════"
echo " Running ShellCheck on all .sh files"
echo "═══════════════════════════════════════════════════════════════"
SH_FILES=$(find . -name '*.sh' -not -path './.git/*')
if [ -z "$SH_FILES" ]; then
echo "No shell scripts found."
exit 0
fi
FAILED=0
for f in $SH_FILES; do
echo ""
echo "── Checking: $f"
if shellcheck -x -s bash "$f"; then
echo " ✅ $f passed"
else
echo " ❌ $f failed"
FAILED=1
fi
done
if [ "$FAILED" -ne 0 ]; then
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ❌ One or more shell scripts have syntax issues"
echo "═══════════════════════════════════════════════════════════════"
exit 1
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ✅ All shell scripts passed ShellCheck"
echo "═══════════════════════════════════════════════════════════════"
- name: Lint YAML files with yamllint
run: |
echo "═══════════════════════════════════════════════════════════════"
echo " Running yamllint on all YAML files"
echo "═══════════════════════════════════════════════════════════════"
YAML_FILES=$(find . -name '*.yml' -o -name '*.yaml' | grep -v '.git/')
if [ -z "$YAML_FILES" ]; then
echo "No YAML files found."
exit 0
fi
FAILED=0
for f in $YAML_FILES; do
echo ""
echo "── Checking: $f"
if yamllint -d relaxed "$f"; then
echo " ✅ $f passed"
else
echo " ❌ $f failed"
FAILED=1
fi
done
if [ "$FAILED" -ne 0 ]; then
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ❌ One or more YAML files have syntax issues"
echo "═══════════════════════════════════════════════════════════════"
exit 1
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ✅ All YAML files passed yamllint"
echo "═══════════════════════════════════════════════════════════════"
- name: Validate packages.x86_64 syntax
run: |
echo "═══════════════════════════════════════════════════════════════"
echo " Validating packages.x86_64 format"
echo "═══════════════════════════════════════════════════════════════"
if [ ! -f packages.x86_64 ]; then
echo "packages.x86_64 not found, skipping."
exit 0
fi
FAILED=0
LINENUM=0
while IFS= read -r line; do
LINENUM=$((LINENUM + 1))
# Skip empty lines and comments
[[ -z "$line" || "$line" =~ ^# ]] && continue
# Check for invalid characters
if [[ ! "$line" =~ ^[a-zA-Z0-9._@+\-]+$ ]]; then
echo "❌ Line $LINENUM: invalid package name format: '$line'"
FAILED=1
fi
# Check for trailing whitespace
if [[ "$line" =~ [[:space:]]$ ]]; then
echo "⚠️ Line $LINENUM: trailing whitespace: '$line'"
FAILED=1
fi
done < packages.x86_64
if [ "$FAILED" -ne 0 ]; then
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ❌ packages.x86_64 has syntax issues"
echo "═══════════════════════════════════════════════════════════════"
exit 1
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ✅ packages.x86_64 syntax is valid"
echo "═══════════════════════════════════════════════════════════════"
-342
View File
@@ -1,342 +0,0 @@
name: Tests
on:
push:
pull_request:
workflow_dispatch:
jobs:
tests:
runs-on: archlinux
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Reset pacman.conf to stock
run: |
cat > /etc/pacman.conf << 'STOCKCONF'
[options]
DisableSandbox
HoldPkg = pacman glibc
Architecture = auto
CheckSpace
ParallelDownloads = 5
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
STOCKCONF
sed -i 's/^ //' /etc/pacman.conf
# Remove stale sync databases for custom repos
rm -f /var/lib/pacman/sync/cachyos* /var/lib/pacman/sync/chaotic*
- name: Install prerequisites
run: |
# The gateway intermittently drops UDP/53 (it failed build run 131
# at the equivalent step); retry with backoff instead of dying on
# the first bad DNS burst.
synced=0
for try in 1 2 3 4 5; do
if pacman -Syu --noconfirm --needed shellcheck yamllint; then
synced=1
break
fi
echo "⚠️ pacman -Syu failed (attempt $try/5), retrying in $(( try * 15 ))s..." >&2
sleep $(( try * 15 ))
done
if [ "$synced" -ne 1 ]; then
echo "❌ pacman -Syu failed after 5 attempts — giving up" >&2
exit 1
fi
- name: Set up CachyOS repo
run: |
pacman-key --recv-keys F3B607488DB35A47 --keyserver keyserver.ubuntu.com
pacman-key --lsign-key F3B607488DB35A47
pacman -U --noconfirm \
'https://mirror.cachyos.org/repo/x86_64/cachyos/cachyos-keyring-20240331-1-any.pkg.tar.zst' \
'https://mirror.cachyos.org/repo/x86_64/cachyos/cachyos-mirrorlist-27-1-any.pkg.tar.zst'
# Fix the mirrorlist URL (pacnew has wrong format)
printf '%s\n' 'Server = https://mirror.cachyos.org/repo/$arch/$repo' \
> /etc/pacman.d/cachyos-mirrorlist
printf '\n[cachyos]\nInclude = /etc/pacman.d/cachyos-mirrorlist\n' \
>> /etc/pacman.conf
# Retry: gateway drops UDP/53 in bursts (see run 131)
synced=0
for try in 1 2 3 4 5; do
if pacman -Syu --noconfirm --needed; then
synced=1
break
fi
echo "⚠️ pacman -Syu failed (attempt $try/5), retrying in $(( try * 15 ))s..." >&2
sleep $(( try * 15 ))
done
if [ "$synced" -ne 1 ]; then
echo "❌ pacman -Syu failed after 5 attempts — giving up" >&2
exit 1
fi
- name: Set up chaotic-aur repo
run: |
pacman -U --noconfirm \
'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-keyring.pkg.tar.zst' \
'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-mirrorlist.pkg.tar.zst'
printf '\n[chaotic-aur]\nInclude = /etc/pacman.d/chaotic-mirrorlist\n' \
>> /etc/pacman.conf
# Retry: gateway drops UDP/53 in bursts (see run 131)
synced=0
for try in 1 2 3 4 5; do
if pacman -Syu --noconfirm --needed; then
synced=1
break
fi
echo "⚠️ pacman -Syu failed (attempt $try/5), retrying in $(( try * 15 ))s..." >&2
sleep $(( try * 15 ))
done
if [ "$synced" -ne 1 ]; then
echo "❌ pacman -Syu failed after 5 attempts — giving up" >&2
exit 1
fi
- name: Lint shell scripts with ShellCheck
run: |
echo "═══════════════════════════════════════════════════════════════"
echo " Running ShellCheck on all .sh files"
echo "═══════════════════════════════════════════════════════════════"
SH_FILES=$(find . -name '*.sh' -not -path './.git/*')
if [ -z "$SH_FILES" ]; then
echo "No shell scripts found."
exit 0
fi
FAILED=0
while IFS= read -r f; do
echo ""
echo "── Checking: $f"
if shellcheck -x -s bash "$f"; then
echo " ✅ $f passed"
else
echo " ❌ $f failed"
FAILED=1
fi
done <<< "$SH_FILES"
if [ "$FAILED" -ne 0 ]; then
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ❌ One or more shell scripts have syntax issues"
echo "═══════════════════════════════════════════════════════════════"
exit 1
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ✅ All shell scripts passed ShellCheck"
echo "═══════════════════════════════════════════════════════════════"
- name: Lint YAML files with yamllint
run: |
echo "═══════════════════════════════════════════════════════════════"
echo " Running yamllint on all YAML files"
echo "═══════════════════════════════════════════════════════════════"
YAML_FILES=$(find . -not -path './.git/*' \( -name '*.yml' -o -name '*.yaml' \))
if [ -z "$YAML_FILES" ]; then
echo "No YAML files found."
exit 0
fi
FAILED=0
while IFS= read -r f; do
echo ""
echo "── Checking: $f"
if yamllint -d "{extends: relaxed, rules: {document-start: disable, line-length: disable, new-line-at-end-of-file: disable}}" "$f"; then
echo " ✅ $f passed"
else
echo " ❌ $f failed"
FAILED=1
fi
done <<< "$YAML_FILES"
if [ "$FAILED" -ne 0 ]; then
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ❌ One or more YAML files have syntax issues"
echo "═══════════════════════════════════════════════════════════════"
exit 1
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ✅ All YAML files passed yamllint"
echo "═══════════════════════════════════════════════════════════════"
- name: Validate packages.x86_64 syntax
run: |
echo "═══════════════════════════════════════════════════════════════"
echo " Validating packages.x86_64 format"
echo "═══════════════════════════════════════════════════════════════"
if [ ! -f packages.x86_64 ]; then
echo "packages.x86_64 not found, skipping."
exit 0
fi
FAILED=0
LINENUM=0
while IFS= read -r line; do
LINENUM=$((LINENUM + 1))
# Skip empty lines and comments
[[ -z "$line" || "$line" =~ ^# ]] && continue
# Check for invalid characters
if [[ ! "$line" =~ ^[a-zA-Z0-9._@+\-]+$ ]]; then
echo "❌ Line $LINENUM: invalid package name format: '$line'"
FAILED=1
fi
# Check for trailing whitespace
if [[ "$line" =~ [[:space:]]$ ]]; then
echo "⚠️ Line $LINENUM: trailing whitespace: '$line'"
FAILED=1
fi
done < packages.x86_64
if [ "$FAILED" -ne 0 ]; then
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ❌ packages.x86_64 has syntax issues"
echo "═══════════════════════════════════════════════════════════════"
exit 1
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ✅ packages.x86_64 syntax is valid"
echo "═══════════════════════════════════════════════════════════════"
- name: Check all packages
run: |
echo "═══════════════════════════════════════════════════════════════"
echo " Checking packages.x86_64 against repos"
echo " Allowed repos: cachyos, extra, multilib, chaotic-aur"
echo " Also accepted: localrepo/ pre-built packages"
echo " Also accepted: packages listed in build-end4-deps.sh"
echo "═══════════════════════════════════════════════════════════════"
ALLOWED_REPOS="^(core|extra|multilib|cachyos|chaotic-aur)$"
MISSING=()
FOUND=0
TOTAL=0
while IFS= read -r pkg; do
# Skip empty lines and comments
[[ -z "$pkg" || "$pkg" =~ ^# ]] && continue
TOTAL=$((TOTAL + 1))
# 1) Check allowed repos via pacman
repos=$(pacman -Si "$pkg" 2>/dev/null | grep "^Repository" | awk '{print $3}' | tr -d '\r')
MATCHED=0
for repo in $repos; do
if [[ "$repo" =~ $ALLOWED_REPOS ]]; then
MATCHED=1
FOUND=$((FOUND + 1))
break
fi
done
# 2) Check localrepo/ for a pre-built .pkg.tar.zst
if [[ $MATCHED -eq 0 ]] && compgen -G "localrepo/${pkg}-*.pkg.tar.zst" > /dev/null 2>&1; then
MATCHED=1
FOUND=$((FOUND + 1))
echo "📦 LOCAL: $pkg (pre-built in localrepo/)"
fi
# 3) Check build-end4-deps.sh for the package name
if [[ $MATCHED -eq 0 ]] && grep -qxF "${pkg}" localrepo/build-end4-deps.sh 2>/dev/null; then
MATCHED=1
FOUND=$((FOUND + 1))
echo "📦 BUILD: $pkg (listed in build-end4-deps.sh)"
fi
if [[ $MATCHED -eq 0 ]]; then
if [[ -z "$repos" ]]; then
echo "❌ MISSING: $pkg"
else
echo "⚠️ WRONG REPO: $pkg (found in: $repos)"
fi
MISSING+=("$pkg")
fi
done < packages.x86_64
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " Results: $FOUND / $TOTAL packages found in allowed repos"
echo "═══════════════════════════════════════════════════════════════"
if [[ ${#MISSING[@]} -gt 0 ]]; then
echo ""
echo "⚠️ ${#MISSING[@]} package(s) NOT in allowed repos:"
for p in "${MISSING[@]}"; do
echo " • $p"
done
echo ""
echo "These packages must be in:"
echo " • cachyos, extra, multilib, or chaotic-aur"
echo " • OR pre-built in localrepo/"
echo " • OR added to build-end4-deps.sh"
exit 1
else
echo ""
echo "✅ All packages verified successfully!"
fi
- name: Check for conflicting packages
run: |
echo "═══════════════════════════════════════════════════════════════"
echo " Checking for conflicting packages in packages.x86_64"
echo "═══════════════════════════════════════════════════════════════"
# Sync databases first so pacman knows what exists
sudo pacman -Sy --noconfirm
# Collect only packages that exist in the official repositories
PKGS=()
while IFS= read -r pkg; do
[[ -z "$pkg" || "$pkg" =~ ^# ]] && continue
# Check if the package exists in official repos
if pacman -Si "$pkg" >/dev/null 2>&1; then
PKGS+=("$pkg")
else
echo "⚠️ Skipping AUR/missing package: $pkg"
fi
done < packages.x86_64
# Run conflict check only if we have official packages to test
if [ ${#PKGS[@]} -eq 0 ]; then
echo "✅ No official packages to check."
elif CONFLICTS=$(pacman -Sp --needed "${PKGS[@]}" 2>&1); then
echo "✅ No package conflicts detected among official packages"
else
echo "------- Pacman Output -------"
echo "$CONFLICTS"
echo "-----------------------------"
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo " ❌ Conflicting packages found — fix packages.x86_64"
echo "═══════════════════════════════════════════════════════════════"
exit 1
fi
-11
View File
@@ -1,11 +0,0 @@
# Multi-GB mkarchiso output (see AGENTS.md build command)
work/
out/
# In-image copy of localrepo/ — populated by localrepo/update.sh and
# .gitea/workflows/build-iso.yaml, shipped as /opt/localrepo on the ISO
airootfs/opt/localrepo/
# Build stamp staged by profiledef.sh at ISO build time (see AGENTS.md);
# consumed by customize_airootfs.sh, never committed
airootfs/root/.iso-build-stamp
-115
View File
@@ -1,115 +0,0 @@
# AGENTS.md
Arch Linux ISO profile (archiso). Builds a live ISO with Hyprland desktop, end-4 dots-hyprland, and curated packages. Hosted on Gitea.
## Build & Test Commands
```bash
# Build the ISO (repo root IS the profile directory)
sudo mkarchiso -v -w work -o out/ .
# Build AUR deps for end-4 (run locally before ISO build if localrepo/ is stale)
./localrepo/build-end4-deps.sh # build all
./localrepo/build-end4-deps.sh --quick # skip large AUR pkgs
# Refresh localrepo DB after adding/moving .pkg.tar.zst files
./localrepo/update.sh # re-indexes existing packages
./localrepo/update.sh pkg1.pkg.tar.zst # add files, then re-index
```
`update.sh` also refreshes `airootfs/opt/localrepo/` (the copy that ships on the
ISO), so run it after touching `localrepo/` before building.
## CI Checks (must pass before merge)
- **ShellCheck**: all `.sh` files checked with `shellcheck -x -s bash`
- **yamllint**: all `.yml`/`.yaml` files (relaxed config)
- **packages.x86_64 syntax**: one package per line, no trailing whitespace, `[a-zA-Z0-9._@+\-]+` only
- **Package repo check**: every package in `packages.x86_64` must be resolvable via `pacman -Si` in allowed repos (`cachyos`, `extra`, `multilib`, `chaotic-aur`), OR have a pre-built `.pkg.tar.zst` in `localrepo/`, OR appear in `localrepo/build-end4-deps.sh`
## Package Management
**Three sources** contribute packages to the ISO:
1. **`packages.x86_64`** — main list, installed by mkarchiso. Must be in an allowed repo.
2. **`localrepo/*.pkg.tar.zst`** — pre-built AUR packages. The `local-aur` repo is configured in `pacman.conf` and picked up by mkarchiso automatically.
3. **`build-end4-deps.sh`** — builds end-4 AUR deps at build time.
There is a **fourth source**: `customize_airootfs.sh` runs end-4's own
`./setup install-deps` inside the image (as a throwaway `ii-builder` account),
which resolves and compiles everything the dotfiles need (quickshell, MicroTeX,
theming, fonts, ...). Those packages are installed in the live system, land in
`pkglist.x86_64.txt`, and are harvested into `/opt/localrepo` so pacstrap can
install them into the target without the network.
**Important**: `localrepo/update.sh` auto-appends new package names to `packages.x86_64`. If you remove a package from `packages.x86_64` that exists in `localrepo/`, it will be re-added on the next `update.sh` run.
## Key Files
| File | Purpose |
|------|---------|
| `packages.x86_64` | Live ISO package list (~402 packages) |
| `profiledef.sh` | ISO metadata, compression, boot modes, build-stamp staging |
| `pacman.conf` | Repos: cachyos → core → extra → multilib → chaotic-aur → local-aur |
| `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/.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, optional sshd (default on), end-4 dotfiles (`--skip-alldeps`), boot |
| `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/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
- 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` 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 **image** ships its own `[local-aur]` at `file:///opt/localrepo` (see `.live-pacman.conf`). It holds `localrepo/` (copied by CI/`update.sh`) plus everything `install-deps` built. pacstrap runs without `-P`, so the target keeps the stock `/etc/pacman.conf`; `alvin-install` strips `[local-aur]` from it anyway as a safety net, because `/opt/localrepo` exists only on the medium.
- `alvin-install` runs end-4 with `--skip-alldeps` — dependencies must come from the ISO. It feeds `yes i` to end-4's failure prompt: inside the installer chroot the medium's `/run` is bind-mounted in, so end-4's `systemctl --machine=…@.host --user enable … --now` lines can never work (and `--now` would start services on the live medium). `install_end4_dots` re-applies the enable-only part (bluetooth, ydotool, i2c module) outside the chroot and reports every step end-4 had to skip. If the end-4 step reports "incomplete", check that `hyprctl`/`quickshell`/the venv were resolvable (harvest) before re-running anything.
- `/etc/skel/.cache/uv` + `/etc/skel/.local/share/uv/python` are pre-warmed by the build (~460 MB: CPython 3.12 and the pinned wheel cache) so end-4's `uv venv`/`uv pip install` at install time needs no 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`.
- `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).
- **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.
- `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` 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).
+911 -321
View File
File diff suppressed because it is too large Load Diff
+32
View File
@@ -0,0 +1,32 @@
-----BEGIN CERTIFICATE-----
MIIFhTCCA22gAwIBAgIJBJPyuFHF1b7RMA0GCSqGSIb3DQEBDQUAMF8xDjAMBgNV
BAsTBUFyYm9yMQ4wDAYDVQQKEwVDaXNjbzE9MDsGA1UEAxM0Q2lzY28gU29mdHdh
cmUgSWRlbnRpdHkgUm9vdCBDQSBSU0EgNDA5NiBTSEE1MTIgMjA5OTAgFw0yNDAx
MjQxODQ1MjVaGA8yMDk5MDEyNDE4NDUyNVowXzEOMAwGA1UECxMFQXJib3IxDjAM
BgNVBAoTBUNpc2NvMT0wOwYDVQQDEzRDaXNjbyBTb2Z0d2FyZSBJZGVudGl0eSBS
b290IENBIFJTQSA0MDk2IFNIQTUxMiAyMDk5MIICIjANBgkqhkiG9w0BAQEFAAOC
Ag8AMIICCgKCAgEA14hoPbzqZxPr8Wqpq2H+tOib+DkQP80mUP6zAw3uu+eNygd+
jOBCenO6B7sp1sqCRT8QBQWQxNHVeVfMQN1vjMrqEMNh/eflVtOGy32UbkuQrVzj
2H+G1PtjeMQKa26LD8XPDUIOpj9rzPdjKFFfz13tm21gNIiVSTI34T5BS5BNEQj1
b+VQg+0kbANCOOTiTh+H/gxhpXRv8F3VNUrrPxA7a3WF5jhZZoPBns1LuBDW0fQ0
av6q/uEWtfxMdSNsAxYWVhO90Nx4khOISA1Fs1h1klGsee5XZkLKdUWedZQzbUz1
f7VPRxX+ddcK0Js2VPvxemMf2WaTbkrEi62y/cOaxqDs2xDTWEXrgOYYEfQ+RoeY
pbzBCaErqZvCeOgrnXFSHSyyd9+dTOxJuypBH+AWKtmkQMQQ7RQJSkGvrP9NgRxD
MXb1U4kpVn7kEEhv6telV9E8R635Zm4h/H9FQyc2LrLOuL5UPewMMWt8HqPbs2Xc
n1kTLvpEDciDJDRvu4XuBsjgQMA0rlt5BHAmZdGO5Dq4+ARWAYrzN9+M0dK+0phT
T9OOHItIL6wXcIiYLZBJlHfiemCByIcBBEYaRwdt3VP9tTl0F370StI2t1RMDPgt
xHcsYqN09QG/tWzwr/yNckFhVs/+UGQWslv2/W6eiKge5REUFuxT6i7V6oUCAwEA
AaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
FLd8Wz4X/JJ6Oi/+znsT0DTPuju8MA0GCSqGSIb3DQEBDQUAA4ICAQCZEut7iqp8
39u7CHD8zMrvOMmUKtJ7G1MrhkJfdyek8g7ArG74bgcxM3ptwDusdFgKh/mmCj/m
FU6TNjsufZ9hAyOE16ZtGflkOrRlihPQThDdGCxQjRsLVQa9S0IDkM1v1ZqvIMEc
PJOj3rhvkIJVjpHc0AZQP/TnaT/7dKD1wFOSNYwzdvE2HKVNA8XbeS9TNpHqYPvE
2gX6vQ7Pdn9DIF6YOmOuBobmaD1G7WbDz5Kvz5e3FdkzR+K3sGW4Qsr3OLt25dQS
H+x7X06fihUxhEgRJJp2cPKABSKVR2hoyzKNEbzgtV25gH7lr+EHA6CQYltkVpyM
4v1+PdX1EGY0+rAO+NsRwa6ndFteofJLh9PbvxHp0jGWnT1KF4lhmEyyka9JKbqT
yiyGzDsw/YA9NxiAsp/Ex8aYXX1/SeM/kb6dp7tytsHewwflns1jfGqRVyrXQ41x
CmmSioBvtZiry8BJTa8xIUWEsBL1pTl2RZrPDAw/qD10K2XJfh5HYFSkIppoIO+9
0wN8TYcXbyY+JnU/g32AvkmA3o8lotK6nbwuf7MAFdtPHMA4F8mPM3jADc1uGu9O
YweaA1c+P5KEOyr325cgsT04x4oeyvP3c3XMLpDpSgbzhfc9WyLYCf3R3jHlst1A
KaDwBk2xoE3knxihYjbcRfjaaYdUkWY4mg==
-----END CERTIFICATE-----
+2 -3
View File
@@ -1,8 +1,7 @@
To install Arch Linux, follow the installation guide,
or run alvin-install for an automated setup.
To install Arch Linux follow the installation guide:
https://wiki.archlinux.org/title/Installation_guide
For Wi-Fi, run nmtui to configure a wireless network.
For Wi-Fi, authenticate to the wireless network using the iwctl utility.
For mobile broadband (WWAN) modems, connect with the mmcli utility.
Ethernet, WLAN and WWAN interfaces using DHCP should work automatically.
@@ -1,10 +0,0 @@
[Trigger]
Type = Package
Operation = Install
Operation = Upgrade
Target = *
[Action]
Description = Ensuring /dev/stdin exists...
When = PreTransaction
Exec = /usr/bin/sh -c "[ -e /dev/stdin ] || ln -sf /proc/self/fd/0 /dev/stdin; [ -e /dev/stdout ] || ln -sf /proc/self/fd/1 /dev/stdout; [ -e /dev/stderr ] || ln -sf /proc/self/fd/2 /dev/stderr"
+1 -1
View File
@@ -23,7 +23,7 @@ if status is-interactive
alias celar "printf '\033[2J\033[3J\033[1;1H'"
alias claer "printf '\033[2J\033[3J\033[1;1H'"
alias pamcan pacman
alias q 'qs -c end4-pC'
alias q 'qs -c ii'
if test "$TERM" != "linux"
alias ls 'eza --icons'
end
@@ -1,677 +0,0 @@
{
"appearance": {
"extraBackgroundTint": true,
"fakeScreenRounding": 0,
"fonts": {
"expressive": "Space Grotesk",
"iconNerd": "JetBrains Mono NF",
"main": "Google Sans Flex",
"monospace": "JetBrains Mono NF",
"numbers": "Google Sans Flex",
"reading": "Readex Pro",
"title": "Google Sans Flex"
},
"palette": {
"accentColor": "",
"type": "scheme-tonal-spot"
},
"transparency": {
"automatic": true,
"backgroundTransparency": 0.11,
"contentTransparency": 0.57,
"enable": false
},
"wallpaperTheming": {
"enableAppsAndShell": true,
"enableQtApps": true,
"enableTerminal": true,
"terminalGenerationProps": {
"forceDarkMode": false,
"harmonizeThreshold": 100,
"harmony": 0.5,
"termFgBoost": 0.35
}
}
},
"apps": {
"bluetooth": "kcmshell6 kcm_bluetooth",
"changePassword": "kitty -1 --hold=yes fish -i -c 'passwd'",
"manageUser": "kcmshell6 kcm_users",
"network": "kcmshell6 kcm_networkmanagement",
"networkEthernet": "kcmshell6 kcm_networkmanagement",
"taskManager": "plasma-systemmonitor --page-name Processes",
"terminal": "kitty -1",
"update": "kitty -1 --hold=yes fish -i -c 'pkexec pacman -Syu'",
"volumeMixer": "~/.config/hypr/hyprland/scripts/launch_first_available.sh \"pavucontrol-qt\" \"pavucontrol\""
},
"background": {
"blurRadius": 32,
"centeredWallpaper": false,
"centeredWallpaperColor": "primaryContainer",
"centeredWallpaperOnlyWhenLocked": false,
"centeredWallpaperShape": "Cookie7Sided",
"centeredWallpaperSize": 400,
"enableWallpaperPreview": false,
"hideWhenFullscreen": true,
"lockWall": "",
"parallax": {
"autoVertical": false,
"enableSidebar": true,
"enableWorkspace": true,
"vertical": false,
"widgetsFactor": 1.2,
"workspaceZoom": 1.07
},
"screenList": [],
"showBlur": true,
"showGrid": true,
"showSnapLines": true,
"splitRatio": "25",
"splitSide": "right",
"thumbnailPath": "",
"wallpaperAnimation": "random",
"wallpaperPath": "/home/alvin/Pictures/Wallpapers/Dynamic-Wallpapers/Dark/japan-street-Dark.png",
"widgets": {
"blurRadius": 32,
"blurWidgets": false,
"calendar": {
"enable": true,
"placementStrategy": "free",
"sizeMode": "2x2",
"x": 1596,
"y": 744,
"z": 4
},
"clock": {
"color": "",
"cookie": {
"aiStyling": false,
"constantlyRotate": false,
"dateInClock": true,
"dateStyle": "bubble",
"dialNumberStyle": "full",
"hourHandStyle": "hollow",
"hourMarks": false,
"minuteHandStyle": "medium",
"secondHandStyle": "line",
"sides": 12,
"timeIndicators": true,
"useSineCookie": false
},
"digital": {
"adaptiveAlignment": true,
"animateChange": true,
"font": {
"family": "Google Sans Flex",
"roundness": 1.1290989771359807,
"size": 129.49608904933814,
"weight": 595.725165314564,
"width": 99.44532190132371
},
"showDate": true,
"vertical": false
},
"enable": true,
"pixel": {
"orientation": "vertical"
},
"placementStrategy": "leastBusy",
"quote": {
"enable": true,
"followClock": false,
"text": "Kawaī neko o zenbu tabe chaimasu."
},
"showOnlyWhenLocked": false,
"style": "digital",
"styleLocked": "cookie",
"x": 1423,
"y": 383,
"z": 3
},
"customImage": {
"enable": true,
"path": "",
"placementStrategy": "free",
"shape": "Cookie4Sided",
"size": 200,
"x": 400,
"y": 100,
"z": 0
},
"customText": {
"alignment": "center",
"color": "",
"content": "Hello world",
"enable": true,
"fontFamily": "Caveat",
"fontSize": 72,
"placementStrategy": "free",
"shadow": true,
"x": 400,
"y": 300,
"z": 0
},
"images": {
"enable": false,
"placementStrategy": "free",
"x": 400,
"y": 100,
"z": 0
},
"media": {
"backgroundShape": "Cookie4Sided",
"enable": true,
"placementStrategy": "free",
"showControls": true,
"showLyrics": false,
"showTitles": true,
"sizeMode": "1x3",
"x": 744,
"y": 876,
"z": 1
},
"notes": {
"enable": false,
"placementStrategy": "free",
"x": 400,
"y": 100,
"z": 0
},
"resources": {
"enable": false,
"placementStrategy": "free",
"vertical": false,
"x": 400,
"y": 100,
"z": 0
},
"shadow": true,
"sticker": {
"enable": false,
"items": [],
"outlineColor": "#ffffff",
"outlineWidth": 8,
"path": "",
"placementStrategy": "free",
"rotation": 0,
"size": 200,
"x": 400,
"y": 100,
"z": 0
},
"timers": {
"enable": false,
"placementStrategy": "free",
"vertical": false,
"x": 400,
"y": 100,
"z": 0
},
"todo": {
"enable": false,
"placementStrategy": "free",
"x": 400,
"y": 100,
"z": 0
},
"userCard": {
"enable": false,
"placementStrategy": "free",
"sizeMode": "1x2",
"x": 400,
"y": 100,
"z": 0
},
"visualizer": {
"colorSource": "theme",
"enable": true,
"height": 343,
"placementStrategy": "free",
"ringSize": 380,
"sensitivity": 1.65,
"style": "mirror",
"x": 0,
"y": 0,
"z": -1000
},
"weather": {
"enable": false,
"expanded": false,
"placementStrategy": "mostBusy",
"sizeMode": "1x3",
"x": 400,
"y": 100,
"z": 0
},
"worldClock": {
"clockCount": 4,
"enable": false,
"placementStrategy": "free",
"sizeMode": "2x2",
"timezones": [
"Australia/Sydney",
"Asia/Tokyo",
"Europe/London",
"America/New_York"
],
"x": 400,
"y": 100,
"z": 0
}
},
"widgetsLocked": false
},
"bar": {
"autoHide": {
"enable": false,
"hoverRegionWidth": 2,
"pushWindows": false,
"showWhenPressingSuper": {
"delay": 140,
"enable": true
}
},
"borderless": "transparent",
"bottom": false,
"centerOnlyReserveFrame": false,
"cornerStyle": 3,
"divider": {
"spacing": 20,
"style": "rect"
},
"dynamicIsland": {
"leftWidget": "clockWidget",
"rightWidget": "systemIcons",
"showMediaControls": false,
"visualizerStyle": "wave"
},
"floatStyleShadow": true,
"followFrameColor": false,
"frameColor": "secondaryContainer",
"frameThickness": 4,
"groupColor": "layer1",
"indicators": {
"notifications": {
"showUnreadCount": true
}
},
"layouts": {
"leftLayout": [
"leftSidebarButton",
"activeWindow",
"resources"
],
"middleLayout": [
"media",
"clockWidget",
"workspaces",
"utilButtons",
"weatherBar",
"batteryIndicator"
],
"rightLayout": [
"sysTray",
"updatesCount",
"bluetooth",
"systemIcons"
]
},
"media": {
"alwaysVisible": false,
"maxWidth": 280,
"minWidth": 100,
"onlyTitle": false,
"preferredPlayer": "",
"showLyrics": false
},
"resources": {
"alwaysShowCpu": true,
"alwaysShowCpuTemp": true,
"alwaysShowDisk": false,
"alwaysShowRam": true,
"alwaysShowSwap": false,
"cpuWarningThreshold": 90,
"memoryWarningThreshold": 95,
"showValue": true,
"style": "outline",
"swapWarningThreshold": 85
},
"screenList": [],
"showBackground": true,
"showFrame": false,
"tooltips": {
"clickToShow": false,
"enable": true
},
"topLeftIcon": "spark",
"utilButtons": {
"isRecording": false,
"showColorPicker": false,
"showDarkModeToggle": false,
"showKeyboardToggle": true,
"showMicToggle": true,
"showPerformanceProfileToggle": true,
"showScreenRecord": false,
"showScreenSnip": false,
"showWallpaperToggle": false
},
"verbose": true,
"vertical": false,
"workspaces": {
"alwaysShowNumbers": true,
"indicatorStyle": "dot",
"monochromeIcons": true,
"numberMap": [],
"showAppIcons": true,
"showNumberDelay": 200,
"shown": 10,
"useNerdFont": false
}
},
"calendar": {
"locale": "en-GB"
},
"conflictKiller": {
"autoKillNotificationDaemons": true,
"autoKillTrays": true
},
"crosshair": {
"code": "0;P;d;1;0l;10;0o;2;1b;0"
},
"custom": {
"colorizeIcon": true,
"distroIcon": "google-gemini-symbolic"
},
"dock": {
"enable": true,
"height": 60,
"hoverRegionHeight": 2,
"hoverToReveal": true,
"ignoredAppRegexes": [],
"monochromeIcons": false,
"pinnedApps": [
"org.kde.dolphin",
"zen"
],
"pinnedOnStartup": false,
"showAppsButton": true,
"showBackground": true,
"showMedia": true,
"showPinButton": true
},
"hacks": {
"arbitraryRaceConditionDelay": 20
},
"hyprland": {
"animations": {
"animation": "normal",
"enable": true
},
"decoration": {
"activeOpacity": 1,
"blur": {
"enabled": false,
"passes": 3,
"size": 1
},
"inactiveOpacity": 0.95,
"rounding": 22,
"shadow": {
"enabled": true,
"range": 4
}
},
"general": {
"borderColor": {
"activeOpacity": 0.47,
"activeRole": "layer0Border",
"enable": false,
"inactiveOpacity": 0.2,
"inactiveRole": "layer0Border"
},
"borderSize": 1,
"gapsIn": 2,
"gapsOut": 5
},
"idle": {
"lock": 300,
"screenOff": 600,
"suspend": 10800
}
},
"interactions": {
"deadPixelWorkaround": {
"enable": false
},
"scrolling": {
"fasterTouchpadScroll": false,
"mouseScrollDeltaThreshold": 120,
"mouseScrollFactor": 120,
"touchpadScrollFactor": 450
}
},
"launcher": {
"pinnedApps": [
"org.kde.dolphin",
"kitty",
"cmake-gui"
]
},
"light": {
"antiFlashbang": {
"enable": false
},
"night": {
"automatic": false,
"colorTemperature": 5559,
"from": "19:00",
"to": "06:30"
}
},
"lock": {
"blur": {
"enable": false,
"extraZoom": 1.1,
"radius": 100,
"size": 20
},
"centerClock": true,
"launchOnStartup": false,
"materialShapeChars": true,
"security": {
"requirePasswordToPower": true,
"unlockKeyring": true
},
"showLockedText": true,
"showMedia": true,
"showToolbars": true,
"showWidgets": false,
"useHyprlock": false
},
"media": {
"filterDuplicatePlayers": true
},
"notifications": {
"position": "top_right",
"timeout": 7000
},
"osd": {
"timeout": 3000
},
"osk": {
"layout": "qwerty_full",
"pinnedOnStartup": false
},
"overlay": {
"clickthroughOpacity": 0.8,
"darkenScreen": false,
"floatingImage": {
"imageSource": "https://media.tenor.com/H5U5bJzj3oAAAAAi/kukuru.gif",
"scale": 0.5
},
"openingZoomAnimation": true
},
"overview": {
"centerIcons": true,
"columns": 5,
"enable": true,
"orderBottomUp": false,
"orderRightLeft": false,
"rows": 2,
"scale": 0.18,
"style": "default"
},
"panelFamily": "ii",
"policies": {
"ai": 1,
"weeb": 1
},
"profile": {
"avatarPath": "/home/alvin/Sync_Documents/",
"avatarPicture": "/home/alvin/Sync_Documents/Alvin logo original.png",
"descriptionText": "::uptime::",
"displayName": "",
"onlinePresets": true
},
"regionSelector": {
"annotation": {
"useSatty": false
},
"circle": {
"padding": 10,
"strokeWidth": 6
},
"rect": {
"showAimLines": true
},
"targetRegions": {
"content": true,
"contentRegionOpacity": 0.8,
"layers": true,
"opacity": 0.3,
"selectionPadding": 5,
"showLabel": false,
"windows": true
}
},
"resources": {
"historyLength": 60,
"updateInterval": 3100
},
"settings": {
"borderColor": "layer0Border",
"borderSize": 1,
"collapsedSections": [],
"style": "default"
},
"sidebar": {
"ai": {
"textFadeIn": false
},
"banner": true,
"bannerImage": "",
"booru": {
"allowNsfw": true,
"defaultProvider": "yandere",
"limit": 20,
"zerochan": {
"username": "theodorer61"
}
},
"bottomGroup": false,
"cornerOpen": {
"bottom": true,
"bottomLeftAction": "sidebarLeftOpen",
"bottomRightAction": "sidebarRightOpen",
"clickless": false,
"clicklessCornerEnd": true,
"clicklessCornerVerticalOffset": 1,
"cornerRegionHeight": 5,
"cornerRegionWidth": 250,
"enable": true,
"valueScroll": true,
"visualize": false
},
"keepRightSidebarLoaded": false,
"media": {
"artColors": false,
"artShape": "Oval",
"blurredBackground": false,
"enable": true,
"shapeArt": false,
"showLyrics": true
},
"mediaPlayer": false,
"quickSliders": {
"enable": true,
"showBrightness": true,
"showMic": true,
"showVolume": true
},
"quickToggles": {
"android": {
"columns": 6,
"toggles": [
{
"size": 2,
"type": "network"
},
{
"size": 2,
"type": "bluetooth"
},
{
"size": 2,
"type": "audio"
},
{
"size": 1,
"type": "idleInhibitor"
},
{
"size": 2,
"type": "mic"
},
{
"size": 1,
"type": "nightLight"
},
{
"size": 2,
"type": "powerProfile"
}
]
},
"style": "android"
},
"translator": {
"delay": 300,
"enable": true
}
},
"tray": {
"filterPassive": true,
"invertPinnedItems": true,
"monochromeIcons": false,
"pinnedItems": [
"Fcitx"
],
"showItemId": false
},
"wallpaperSelector": {
"changeInterval": 0,
"closeAfterSelection": true,
"columns": 4,
"liveWallpapersPath": "",
"showBlurBackground": false,
"showHomePath": true,
"showSearchbar": true,
"sortMode": "time",
"useSystemFileDialog": false,
"userPath": "/home/alvin/Pictures/Wallpapers/"
},
"windows": {
"centerTitle": true,
"showTitlebar": true
}
}
@@ -1,676 +0,0 @@
{
"appearance": {
"extraBackgroundTint": true,
"fakeScreenRounding": 0,
"fonts": {
"expressive": "Space Grotesk",
"iconNerd": "JetBrains Mono NF",
"main": "Google Sans Flex",
"monospace": "JetBrains Mono NF",
"numbers": "Google Sans Flex",
"reading": "Readex Pro",
"title": "Google Sans Flex"
},
"palette": {
"accentColor": "",
"type": "scheme-tonal-spot"
},
"transparency": {
"automatic": true,
"backgroundTransparency": 0.11,
"contentTransparency": 0.57,
"enable": false
},
"wallpaperTheming": {
"enableAppsAndShell": true,
"enableQtApps": true,
"enableTerminal": true,
"terminalGenerationProps": {
"forceDarkMode": false,
"harmonizeThreshold": 100,
"harmony": 0.5,
"termFgBoost": 0.35
}
}
},
"apps": {
"bluetooth": "kcmshell6 kcm_bluetooth",
"changePassword": "kitty -1 --hold=yes fish -i -c 'passwd'",
"manageUser": "kcmshell6 kcm_users",
"network": "kcmshell6 kcm_networkmanagement",
"networkEthernet": "kcmshell6 kcm_networkmanagement",
"taskManager": "plasma-systemmonitor --page-name Processes",
"terminal": "kitty -1",
"update": "kitty -1 --hold=yes fish -i -c 'pkexec pacman -Syu'",
"volumeMixer": "~/.config/hypr/hyprland/scripts/launch_first_available.sh \"pavucontrol-qt\" \"pavucontrol\""
},
"background": {
"blurRadius": 32,
"centeredWallpaper": false,
"centeredWallpaperColor": "primaryContainer",
"centeredWallpaperOnlyWhenLocked": false,
"centeredWallpaperShape": "Cookie7Sided",
"centeredWallpaperSize": 400,
"enableWallpaperPreview": false,
"hideWhenFullscreen": true,
"lockWall": "",
"parallax": {
"autoVertical": false,
"enableSidebar": true,
"enableWorkspace": true,
"vertical": false,
"widgetsFactor": 1.2,
"workspaceZoom": 1.07
},
"screenList": [],
"showBlur": true,
"showGrid": true,
"showSnapLines": true,
"splitRatio": "25",
"splitSide": "right",
"thumbnailPath": "",
"wallpaperAnimation": "random",
"wallpaperPath": "/home/alvin/Pictures/Wallpapers/Dynamic-Wallpapers/Dark/japan-street-Dark.png",
"widgets": {
"blurRadius": 32,
"blurWidgets": false,
"calendar": {
"enable": true,
"placementStrategy": "free",
"sizeMode": "2x2",
"x": 1596,
"y": 744,
"z": 4
},
"clock": {
"color": "",
"cookie": {
"aiStyling": false,
"constantlyRotate": false,
"dateInClock": true,
"dateStyle": "bubble",
"dialNumberStyle": "full",
"hourHandStyle": "hollow",
"hourMarks": false,
"minuteHandStyle": "medium",
"secondHandStyle": "line",
"sides": 12,
"timeIndicators": true,
"useSineCookie": false
},
"digital": {
"adaptiveAlignment": true,
"animateChange": true,
"font": {
"family": "Google Sans Flex",
"roundness": 1.1290989771359807,
"size": 129.49608904933814,
"weight": 350,
"width": 99.44532190132371
},
"showDate": true,
"vertical": false
},
"enable": true,
"pixel": {
"orientation": "vertical"
},
"placementStrategy": "leastBusy",
"quote": {
"enable": true,
"followClock": false,
"text": "Kawaī neko o zenbu tabe chaimasu."
},
"showOnlyWhenLocked": false,
"style": "digital",
"styleLocked": "cookie",
"x": 1423,
"y": 383,
"z": 3
},
"customImage": {
"enable": true,
"path": "",
"placementStrategy": "free",
"shape": "Cookie4Sided",
"size": 200,
"x": 400,
"y": 100,
"z": 0
},
"customText": {
"alignment": "center",
"color": "",
"content": "Hello world",
"enable": true,
"fontFamily": "Caveat",
"fontSize": 72,
"placementStrategy": "free",
"shadow": true,
"x": 400,
"y": 300,
"z": 0
},
"images": {
"enable": false,
"placementStrategy": "free",
"x": 400,
"y": 100,
"z": 0
},
"media": {
"backgroundShape": "Cookie4Sided",
"enable": true,
"placementStrategy": "free",
"showControls": true,
"showLyrics": false,
"showTitles": true,
"sizeMode": "1x3",
"x": 744,
"y": 876,
"z": 1
},
"notes": {
"enable": false,
"placementStrategy": "free",
"x": 400,
"y": 100,
"z": 0
},
"resources": {
"enable": false,
"placementStrategy": "free",
"vertical": false,
"x": 400,
"y": 100,
"z": 0
},
"shadow": true,
"sticker": {
"enable": false,
"items": [],
"outlineColor": "#ffffff",
"outlineWidth": 8,
"path": "",
"placementStrategy": "free",
"rotation": 0,
"size": 200,
"x": 400,
"y": 100,
"z": 0
},
"timers": {
"enable": false,
"placementStrategy": "free",
"vertical": false,
"x": 400,
"y": 100,
"z": 0
},
"todo": {
"enable": false,
"placementStrategy": "free",
"x": 400,
"y": 100,
"z": 0
},
"userCard": {
"enable": false,
"placementStrategy": "free",
"sizeMode": "1x2",
"x": 400,
"y": 100,
"z": 0
},
"visualizer": {
"colorSource": "theme",
"enable": true,
"height": 342,
"placementStrategy": "free",
"ringSize": 380,
"sensitivity": 1.65,
"style": "mirror",
"x": 0,
"y": 0,
"z": -1000
},
"weather": {
"enable": false,
"expanded": false,
"placementStrategy": "mostBusy",
"sizeMode": "1x3",
"x": 400,
"y": 100,
"z": 0
},
"worldClock": {
"clockCount": 4,
"enable": false,
"placementStrategy": "free",
"sizeMode": "2x2",
"timezones": [
"Australia/Sydney",
"Asia/Tokyo",
"Europe/London",
"America/New_York"
],
"x": 400,
"y": 100,
"z": 0
}
},
"widgetsLocked": false
},
"bar": {
"autoHide": {
"enable": false,
"hoverRegionWidth": 2,
"pushWindows": false,
"showWhenPressingSuper": {
"delay": 140,
"enable": true
}
},
"borderless": "transparent",
"bottom": false,
"centerOnlyReserveFrame": false,
"cornerStyle": 3,
"divider": {
"spacing": 20,
"style": "rect"
},
"dynamicIsland": {
"leftWidget": "clockWidget",
"rightWidget": "systemIcons",
"showMediaControls": false,
"visualizerStyle": "wave"
},
"floatStyleShadow": true,
"followFrameColor": false,
"frameColor": "secondaryContainer",
"frameThickness": 4,
"groupColor": "layer1",
"indicators": {
"notifications": {
"showUnreadCount": true
}
},
"layouts": {
"leftLayout": [
"leftSidebarButton",
"activeWindow",
"resources"
],
"middleLayout": [
"media",
"clockWidget",
"workspaces",
"utilButtons",
"weatherBar"
],
"rightLayout": [
"sysTray",
"updatesCount",
"bluetooth",
"systemIcons"
]
},
"media": {
"alwaysVisible": false,
"maxWidth": 280,
"minWidth": 100,
"onlyTitle": false,
"preferredPlayer": "",
"showLyrics": false
},
"resources": {
"alwaysShowCpu": true,
"alwaysShowCpuTemp": true,
"alwaysShowDisk": false,
"alwaysShowRam": true,
"alwaysShowSwap": false,
"cpuWarningThreshold": 90,
"memoryWarningThreshold": 95,
"showValue": true,
"style": "outline",
"swapWarningThreshold": 85
},
"screenList": [],
"showBackground": true,
"showFrame": false,
"tooltips": {
"clickToShow": false,
"enable": true
},
"topLeftIcon": "spark",
"utilButtons": {
"isRecording": false,
"showColorPicker": false,
"showDarkModeToggle": false,
"showKeyboardToggle": false,
"showMicToggle": true,
"showPerformanceProfileToggle": true,
"showScreenRecord": false,
"showScreenSnip": false,
"showWallpaperToggle": false
},
"verbose": true,
"vertical": false,
"workspaces": {
"alwaysShowNumbers": true,
"indicatorStyle": "dot",
"monochromeIcons": true,
"numberMap": [],
"showAppIcons": true,
"showNumberDelay": 200,
"shown": 10,
"useNerdFont": false
}
},
"calendar": {
"locale": "en-GB"
},
"conflictKiller": {
"autoKillNotificationDaemons": true,
"autoKillTrays": true
},
"crosshair": {
"code": "0;P;d;1;0l;10;0o;2;1b;0"
},
"custom": {
"colorizeIcon": true,
"distroIcon": "google-gemini-symbolic"
},
"dock": {
"enable": true,
"height": 60,
"hoverRegionHeight": 2,
"hoverToReveal": true,
"ignoredAppRegexes": [],
"monochromeIcons": false,
"pinnedApps": [
"org.kde.dolphin",
"zen"
],
"pinnedOnStartup": false,
"showAppsButton": true,
"showBackground": true,
"showMedia": true,
"showPinButton": true
},
"hacks": {
"arbitraryRaceConditionDelay": 20
},
"hyprland": {
"animations": {
"animation": "normal",
"enable": true
},
"decoration": {
"activeOpacity": 1,
"blur": {
"enabled": false,
"passes": 3,
"size": 1
},
"inactiveOpacity": 0.95,
"rounding": 22,
"shadow": {
"enabled": true,
"range": 4
}
},
"general": {
"borderColor": {
"activeOpacity": 0.47,
"activeRole": "layer0Border",
"enable": false,
"inactiveOpacity": 0.2,
"inactiveRole": "layer0Border"
},
"borderSize": 1,
"gapsIn": 2,
"gapsOut": 5
},
"idle": {
"lock": 300,
"screenOff": 600,
"suspend": 10800
}
},
"interactions": {
"deadPixelWorkaround": {
"enable": false
},
"scrolling": {
"fasterTouchpadScroll": false,
"mouseScrollDeltaThreshold": 120,
"mouseScrollFactor": 120,
"touchpadScrollFactor": 450
}
},
"launcher": {
"pinnedApps": [
"org.kde.dolphin",
"kitty",
"cmake-gui"
]
},
"light": {
"antiFlashbang": {
"enable": false
},
"night": {
"automatic": false,
"colorTemperature": 5559,
"from": "19:00",
"to": "06:30"
}
},
"lock": {
"blur": {
"enable": false,
"extraZoom": 1.1,
"radius": 100,
"size": 20
},
"centerClock": true,
"launchOnStartup": false,
"materialShapeChars": true,
"security": {
"requirePasswordToPower": true,
"unlockKeyring": true
},
"showLockedText": true,
"showMedia": true,
"showToolbars": true,
"showWidgets": false,
"useHyprlock": false
},
"media": {
"filterDuplicatePlayers": true
},
"notifications": {
"position": "top_right",
"timeout": 7000
},
"osd": {
"timeout": 3000
},
"osk": {
"layout": "qwerty_full",
"pinnedOnStartup": false
},
"overlay": {
"clickthroughOpacity": 0.8,
"darkenScreen": false,
"floatingImage": {
"imageSource": "https://media.tenor.com/H5U5bJzj3oAAAAAi/kukuru.gif",
"scale": 0.5
},
"openingZoomAnimation": true
},
"overview": {
"centerIcons": true,
"columns": 5,
"enable": true,
"orderBottomUp": false,
"orderRightLeft": false,
"rows": 2,
"scale": 0.18,
"style": "default"
},
"panelFamily": "ii",
"policies": {
"ai": 1,
"weeb": 1
},
"profile": {
"avatarPath": "",
"avatarPicture": "",
"descriptionText": "::uptime::",
"displayName": "",
"onlinePresets": false
},
"regionSelector": {
"annotation": {
"useSatty": false
},
"circle": {
"padding": 10,
"strokeWidth": 6
},
"rect": {
"showAimLines": true
},
"targetRegions": {
"content": true,
"contentRegionOpacity": 0.8,
"layers": true,
"opacity": 0.3,
"selectionPadding": 5,
"showLabel": false,
"windows": true
}
},
"resources": {
"historyLength": 60,
"updateInterval": 3100
},
"settings": {
"borderColor": "layer0Border",
"borderSize": 1,
"collapsedSections": [],
"style": "default"
},
"sidebar": {
"ai": {
"textFadeIn": false
},
"banner": true,
"bannerImage": "",
"booru": {
"allowNsfw": true,
"defaultProvider": "yandere",
"limit": 20,
"zerochan": {
"username": "theodorer61"
}
},
"bottomGroup": false,
"cornerOpen": {
"bottom": true,
"bottomLeftAction": "sidebarLeftOpen",
"bottomRightAction": "sidebarRightOpen",
"clickless": false,
"clicklessCornerEnd": true,
"clicklessCornerVerticalOffset": 1,
"cornerRegionHeight": 5,
"cornerRegionWidth": 250,
"enable": true,
"valueScroll": true,
"visualize": false
},
"keepRightSidebarLoaded": false,
"media": {
"artColors": false,
"artShape": "Oval",
"blurredBackground": false,
"enable": true,
"shapeArt": false,
"showLyrics": true
},
"mediaPlayer": false,
"quickSliders": {
"enable": true,
"showBrightness": true,
"showMic": true,
"showVolume": true
},
"quickToggles": {
"android": {
"columns": 6,
"toggles": [
{
"size": 2,
"type": "network"
},
{
"size": 2,
"type": "bluetooth"
},
{
"size": 2,
"type": "audio"
},
{
"size": 1,
"type": "idleInhibitor"
},
{
"size": 2,
"type": "mic"
},
{
"size": 1,
"type": "nightLight"
},
{
"size": 2,
"type": "powerProfile"
}
]
},
"style": "android"
},
"translator": {
"delay": 300,
"enable": true
}
},
"tray": {
"filterPassive": true,
"invertPinnedItems": true,
"monochromeIcons": false,
"pinnedItems": [
"Fcitx"
],
"showItemId": false
},
"wallpaperSelector": {
"changeInterval": 0,
"closeAfterSelection": true,
"columns": 4,
"liveWallpapersPath": "",
"showBlurBackground": false,
"showHomePath": true,
"showSearchbar": true,
"sortMode": "time",
"useSystemFileDialog": false,
"userPath": "/home/alvin/Pictures/Wallpapers/"
},
"windows": {
"centerTitle": true,
"showTitlebar": true
}
}
+186
View File
@@ -0,0 +1,186 @@
# If you come from bash, you might have to change your $PATH.
export PATH=$HOME/bin:/usr/local/bin:$PATH
export PATH="$HOME/.local/bin:$PATH"
export WAYLAND_DISPLAY=$WAYLAND_DISPLAY
export XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR
# Homebrew (If installed)
if [[ -f "/home/linusbrew/.linuxbrew/bin/brew" ]]; then
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv zsh)"
fi
# Ghostty (If exists)
if [ -n "${GHOSTTY_RESOURCES_DIR}" ]; then
builtin source "${GHOSTTY_RESOURCES_DIR}/shell-integration/bash/ghostty.bash"
fi
# Path to your oh-my-zsh installation.
export ZSH=~/.oh-my-zsh
# Set the name of the theme to load. If you set this to "random"
# It'll load a random theme each time that oh-my-zsh is loaded.
# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes
ZSH_THEME="gnzh"
# Set the list of themes to load
# Setting this variable when ZSH_THEME=random
# cause zsh to load the theme from this variable instead of
# looking in ~/.oh-my-zsh/themes/
# An empty array has no effect
# ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )
# Uncomment the following line to use case-sensitive completion.
CASE_SENSITIVE="true"
#Zsh autocorrect
unsetopt correct_all
# Uncomment the following line to use hyphen-insensitive completion. Case
# sensitive completion must be off. _ and - will be interchangeable.
# HYPHEN_INSENSITIVE="true"
# Uncomment the following line to disable bi-weekly auto-update checks.
# DISABLE_AUTO_UPDATE="true"
# Uncomment the following line to change how often auto-update (in days) is used.
# export UPDATE_ZSH_DAYS=13
# Uncomment the following line to disable colours in ls.
# DISABLE_LS_COLORS="true"
# Uncomment the following line to disable auto-setting the terminal title.
# DISABLE_AUTO_TITLE="true"
# Uncomment the following line to enable command auto-correction.
# ENABLE_CORRECTION="true"
# Uncomment the following line to display red dots whilst waiting for completion.
# COMPLETION_WAITING_DOTS="true"
# Uncomment the following line if you want to disable marking untracked files
# under VCS as dirty. This makes repository status checks for large repositories
# much, much faster.
# DISABLE_UNTRACKED_FILES_DIRTY="true"
# Uncomment the following line if you want to change the command execution time
# stamp shown in the history command output.
# The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd"
# HIST_STAMPS="mm/dd/yyyy"
# Uncomment the following to use another custom folder than $ZSH/custom?
# ZSH_CUSTOM=/path/to/new-custom-folder
# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(
git
zsh-history-substring-search
zsh-autosuggestions
zsh-autocomplete
# zsh-eza
fzf-zsh-plugin
zsh-syntax-highlighting
)
source $ZSH/oh-my-zsh.sh
# User configuration
# export MANPATH="/usr/local/man:$MANPATH"
# You may need to set your language environment manually
# export LANG=en_US.UTF-8
# Preferred editor for local and remote sessions
if [[ -n $SSH_CONNECTION ]]; then
export EDITOR='vim'
else
export EDITOR='nvim'
fi
# Compilation flags
# export ARCHFLAGS="-arch x86_64"
# ssh
# export SSH_KEY_PATH="~/.ssh/rsa_id"
update () {
# Update arch based systems with yay AUR helper
if command -v pacman >/dev/null && command -v yay >/dev/null; then
echo "✅ 'pacman' and 'yay' found. Updating."
sudo pacman -Syu --noconfirm
yay -Syu --sudoloop --save --answerclean None --answerdiff None --noconfirm
elif command -v pacman >/dev/null; then
echo "✅ 'pacman' found. Updating."
sudo pacman -Syu --noconfirm
fi
if command -v paru >/dev/null; then
echo "✅ 'flatpak' found. Updating."
paru -Syu
fi
# Update on debian based systems
if command -v apt >/dev/null; then
echo "✅ 'apt' found. Updating."
sudo apt update && sudo apt full-upgrade -y
fi
# Update Hyprland
if command -v hyprpm >/dev/null; then
echo "✅ 'hyprpm' found. Updating."
hyprpm reload && sleep 2
hyprpm update
fi
# Update Flatpak
if command -v flatpak >/dev/null; then
echo "✅ 'flatpak' found. Updating."
flatpak update -y
fi
# Update npm
if command -v npm >/dev/null; then
echo "✅ 'npm' found. Updating."
sudo npm install -g npm-check-updates
fi
omz update
}
# Sudo last command with control + u
zle -N sudo-last-command-execute
sudo-last-command-execute() {
zle -U $'sudo !!\n'
}
# Bind the widget to Alt+S
bindkey '^[S' sudo-last-command-execute
# Ydotool
if [[ -f "/tmp/.ydotool_socket" ]]; then
export YDOTOOL_SOCKET=/tmp/.ydotool_socket
fi
# Haven android ssh client
precmd() { print -Pn '\e]133;D;%?\a\e]133;A\a' }
preexec() { print -Pn '\e]133;B\a\e]133;C\a' }
# Set personal aliases, overriding those provided by oh-my-zsh libs,
# plugins, and themes. Aliases can be placed here, though oh-my-zsh
# users are encouraged to define aliases within the ZSH_CUSTOM folder.
# For a full list of active aliases, run `alias`.
#
# Example aliases
# alias zshconfig="mate ~/.zshrc"
# alias ohmyzsh="mate ~/.oh-my-zsh"
alias lzd="lazydocker"
alias edit="nvim"
alias rpi="pkexec /usr/bin/rpi-imager"
@@ -0,0 +1,22 @@
[Match]
Type=ether
# Exclude virtual Ethernet interfaces
Kind=!*
[Link]
RequiredForOnline=routable
[Network]
DHCP=yes
MulticastDNS=yes
# systemd-networkd does not set per-interface-type default route metrics
# https://github.com/systemd/systemd/issues/17698
# Explicitly set route metric, so that Ethernet is preferred over Wi-Fi and Wi-Fi is preferred over mobile broadband.
# Use values from NetworkManager. From nm_device_get_route_metric_default in
# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/src/core/devices/nm-device.c
[DHCPv4]
RouteMetric=100
[IPv6AcceptRA]
RouteMetric=100
@@ -0,0 +1,20 @@
[Match]
Type=wlan
[Link]
RequiredForOnline=routable
[Network]
DHCP=yes
MulticastDNS=yes
# systemd-networkd does not set per-interface-type default route metrics
# https://github.com/systemd/systemd/issues/17698
# Explicitly set route metric, so that Ethernet is preferred over Wi-Fi and Wi-Fi is preferred over mobile broadband.
# Use values from NetworkManager. From nm_device_get_route_metric_default in
# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/src/core/devices/nm-device.c
[DHCPv4]
RouteMetric=600
[IPv6AcceptRA]
RouteMetric=600
@@ -0,0 +1,19 @@
[Match]
Type=wwan
[Link]
RequiredForOnline=routable
[Network]
DHCP=yes
# systemd-networkd does not set per-interface-type default route metrics
# https://github.com/systemd/systemd/issues/17698
# Explicitly set route metric, so that Ethernet is preferred over Wi-Fi and Wi-Fi is preferred over mobile broadband.
# Use values from NetworkManager. From nm_device_get_route_metric_default in
# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/src/core/devices/nm-device.c
[DHCPv4]
RouteMetric=700
[IPv6AcceptRA]
RouteMetric=700
@@ -1 +0,0 @@
/usr/lib/systemd/system/NetworkManager.service
@@ -0,0 +1 @@
/usr/lib/systemd/system/systemd-networkd.service
@@ -0,0 +1 @@
/usr/lib/systemd/system/systemd-resolved.service
+1 -10
View File
@@ -48,13 +48,4 @@ Include = /etc/pacman.d/cachyos-mirrorlist
[chaotic-aur]
SigLevel = Required DatabaseOptional
Include = /etc/pacman.d/chaotic-mirrorlist
[local-aur]
# Ships on the medium only: packages built at ISO build time (end-4
# dependencies, plus localrepo/). Keeps pacstrap from needing the network for
# anything that is not in the official repos. alvin-install strips this whole
# section from the target system's pacman.conf, because /opt/localrepo exists
# only on the live medium.
SigLevel = Optional TrustAll
Server = file:///opt/localrepo
Include = /etc/pacman.d/chaotic-mirrorlist
-297
View File
@@ -1,19 +1,6 @@
#!/usr/bin/env bash
set -euo pipefail
# The chroot's /dev is the kernel's single shared devtmpfs, which only gets the
# fd/stdin/stdout/stderr symlinks at boot (from mkinitcpio's init). If the
# runner environment lacks them, process substitution (< <(...)) and upstream
# tools (pacman-key) fail with "… /dev/fd/63: No such file or directory".
# Self-heal here; the CI build-iso workflow does the same before pacstrap so
# that mkinitcpio's hook (which pipes through /dev/stdin) works too.
for _link in "fd:/proc/self/fd" "stdin:/proc/self/fd/0" \
"stdout:/proc/self/fd/1" "stderr:/proc/self/fd/2"; do
[[ -e "/dev/${_link%%:*}" || -L "/dev/${_link%%:*}" ]] ||
ln -sfn "${_link#*:}" "/dev/${_link%%:*}"
done
unset _link
# Populate the keyring in the built root from the keyring bundles
# (/usr/share/pacman/keyrings, incl. the copied cachyos keyring).
# This mirrors the guide; it runs inside the image you are making.
@@ -27,17 +14,6 @@ pacman-key --populate archlinux cachyos chaotic
install -m 0644 /root/.live-pacman.conf /etc/pacman.conf
rm -f /root/.live-pacman.conf
# Build stamp staged by profiledef.sh (absent for non-git, non-CI builds):
# 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
install -m 0644 /root/.iso-build-stamp /etc/alvin-build-stamp
cat /etc/alvin-build-stamp >> /etc/motd
rm -f /root/.iso-build-stamp
fi
# ============================================================================
# Pre-install dotfile dependencies into /etc/skel so new users get them
# instantly on first login (no network required).
@@ -81,279 +57,6 @@ if [[ ! -d "${NVIM_DATA}/lazy/lazy.nvim" ]]; then
https://github.com/folke/lazy.nvim.git "${NVIM_DATA}/lazy/lazy.nvim"
fi
# ── end-4 dots-hyprland, staged for alvin-install (avoids a clone at install) ─
DOTS_REPO="/opt/dots-hyprland"
if [[ ! -d "${DOTS_REPO}/.git" ]]; then
echo "[customize] Cloning end-4 dots-hyprland..."
git clone --depth=1 https://github.com/end-4/dots-hyprland.git "${DOTS_REPO}"
git -C "${DOTS_REPO}" submodule update --init --depth=1
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 ──────────────────
# 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
# qsConfig (patched just below). The repo has no submodules.
if [[ ! -d "${SKEL}/.config/quickshell/end4-pC" ]]; then
echo "[customize] Cloning end4-pC quickshell config into skel..."
git clone --depth=1 https://github.com/pctrade/end4-pC.git \
"${SKEL}/.config/quickshell/end4-pC"
fi
# ── Default quickshell config: ii -> end4-pC ─────────────────────────────────
# alvin-install copies this staged repo onto the target and runs `./setup
# install`, whose rsync writes hypr/hyprland/variables.lua into the user's
# home - so patching the staged copy is what sets qsConfig on the installed
# system. Re-running is a no-op; anything other than ii/end4-pC aborts.
VARIABLES_LUA="${DOTS_REPO}/dots/.config/hypr/hyprland/variables.lua"
if grep -Fq 'hl.env("qsConfig", "ii")' "${VARIABLES_LUA}"; then
echo "[customize] Setting qsConfig to end4-pC..."
sed -i 's|hl\.env("qsConfig", "ii")|hl.env("qsConfig", "end4-pC")|' "${VARIABLES_LUA}"
fi
if ! grep -Fq 'hl.env("qsConfig", "end4-pC")' "${VARIABLES_LUA}"; then
echo "[customize] qsConfig is neither ii nor end4-pC in ${VARIABLES_LUA}" >&2
exit 1
fi
# ============================================================================
# Pre-install end-4 dependencies into the image (network heavy, once per ISO)
# ============================================================================
# ./setup install-deps resolves and *builds* every AUR/source dependency the
# dotfiles need (quickshell, MicroTeX, theming, fonts, ...). Doing it here lets
# alvin-install run its end-4 step with --skip-alldeps, so an install only
# copies files - no AUR clones, no makepkg, no dependency resolution.
#
# The script refuses to run as root, hence the throwaway builder account.
# ============================================================================
BUILD_USER="ii-builder"
if ! id -u "${BUILD_USER}" &>/dev/null; then
useradd -m -u 1500 "${BUILD_USER}"
fi
echo "${BUILD_USER} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/99-ii-builder
chmod 440 /etc/sudoers.d/99-ii-builder
# makepkg writes src/, pkg/ and *.pkg.tar.zst into the PKGBUILD directories,
# so the tree must be owned by the account that runs it.
chown -R "${BUILD_USER}:${BUILD_USER}" "${DOTS_REPO}"
# -f: never prompt (ask=false); -s: skip "pacman -Syu";
# --skip-plasmaintg: optional Firefox widget that pulls 410 pkgs / 526 MiB of
# KDE packages onto a non-KDE system;
# stdin: answer end-4's x() failure prompt with "e", so a failed command
# aborts the build instead of blocking forever without a TTY.
# shellcheck disable=SC2024 # the redirect is meant for the child, not sudo
if ! sudo -u "${BUILD_USER}" env HOME="/home/${BUILD_USER}" \
GIT_TERMINAL_PROMPT=0 \
bash -c "cd ${DOTS_REPO} && ./setup install-deps -f -s --skip-plasmaintg" \
< <(yes e); then
echo "[customize] end-4 ./setup install-deps failed" >&2
exit 1
fi
# ── Harvest the packages install-deps just built into the in-image local repo ─
# The live /etc/pacman.conf points [local-aur] at /opt/localrepo; without the
# harvested copies pacstrap cannot resolve these packages at install time and
# would silently drop them from the target system.
mkdir -p /opt/localrepo
shopt -s nullglob
# <name> <version> from a package's embedded .PKGINFO (update.sh does the same)
pkg_meta() {
tar -xOf "$1" .PKGINFO 2>/dev/null |
awk -F' = ' '/^pkgname = /{n=$2} /^pkgver = /{v=$2} END{print n, v}'
}
mapfile -d '' -t built_pkgs < <(
find "${DOTS_REPO}" "/home/${BUILD_USER}/.cache/yay" \
-name '*.pkg.tar.zst' -print0 2>/dev/null
)
declare -A built_file=() built_ver=()
for p in "${built_pkgs[@]}"; do
read -r n v < <(pkg_meta "$p")
[[ -n "${n:-}" && -n "${v:-}" ]] || continue
built_file["$n"]="$p"
built_ver["$n"]="$v"
done
# One entry per package name, and the entry must be the version the image
# actually installed - a stale copy with the same name but another version
# would let pacstrap install something else than what was tested.
for existing in /opt/localrepo/*.pkg.tar.zst; do
[[ -e "$existing" ]] || continue
read -r n v < <(pkg_meta "$existing")
[[ -n "${n:-}" ]] || continue
if [[ -n "${built_ver[$n]:-}" ]]; then
echo "[customize] Replacing localrepo ${n} ${v} with built ${built_ver[$n]}"
rm -f "$existing"
fi
done
if ((${#built_file[@]} > 0)); then
echo "[customize] Harvesting ${#built_file[@]} package(s) into /opt/localrepo"
cp -f -- "${built_file[@]}" /opt/localrepo/
# makepkg -Afsi leaves its archives next to the PKGBUILD. They are already
# harvested (and installed in this image); keeping them in the dots tree
# would ship a second copy inside /opt/dots-hyprland, which alvin-install
# copies to ~/.dots-hyprland on every installed system.
find "${DOTS_REPO}" -type f -name '*.pkg.tar.zst' -delete
fi
# Rebuild the repo database (CI/update.sh ship a pre-built one alongside the
# packages) and refresh the live system's copy of it. No network needed: the
# remote repos were synced during pacstrap.
local_pkgs=(/opt/localrepo/*.pkg.tar.zst)
if ((${#local_pkgs[@]} > 0)); then
echo "[customize] Rebuilding local-aur db (${#local_pkgs[@]} packages)..."
repo-add -R /opt/localrepo/local-aur.db.tar.gz "${local_pkgs[@]}"
mkdir -p /var/lib/pacman/sync
cp -fL /opt/localrepo/local-aur.db /var/lib/pacman/sync/local-aur.db
if [[ -f /opt/localrepo/local-aur.files ]]; then
cp -fL /opt/localrepo/local-aur.files /var/lib/pacman/sync/local-aur.files
fi
fi
# ── makepkg leftovers + throwaway account do not belong in the ISO ──────────
if [[ -d "${DOTS_REPO}/sdata/dist-arch" ]]; then
find "${DOTS_REPO}/sdata/dist-arch" -mindepth 2 -maxdepth 2 -type d \
\( -name src -o -name pkg \) -prune -exec rm -rf {} +
fi
rm -f /etc/sudoers.d/99-ii-builder
# Processes still running as BUILD_USER make userdel exit 8 and abort the
# build. end-4's ./setup is the usual source: sudo_init_keepalive forks
# `(sleep 60; sudo true) &` and its EXIT trap kills only the subshell,
# orphaning the sleep child for up to a minute. Mirrors shadow's
# user_busy_processes(): match real/effective/saved uid AND require the
# process to live inside this build chroot - the runner shares our PID
# namespace, and a host process could carry the same uid.
#
# mkarchiso runs this script via arch-chroot, which mounts proc *before*
# `unshare --fork --pid`: /proc entry numbers belong to the outer pid
# namespace, while kill(2) resolves pids in our (nested) namespace. Use the
# last NSpid field - the pid in our own namespace - for signalling; keep the
# /proc entry number for logging, since that is what userdel reports.
nspid_fields() {
awk -F'\t' '/^NSpid:/{ $1=""; sub(/^ +/, ""); print; exit }' "$1"
}
builder_procs() {
local uid broot st p key real eff saved kpid cmd
local -a nsf self_nsf=()
uid=$(id -u "${BUILD_USER}") || return 0
broot=$(stat -Lc '%d:%i' /)
read -r -a self_nsf < <(nspid_fields /proc/self/status)
for st in /proc/[0-9]*/status; do
[[ -r "$st" ]] || continue
real=""; eff=""; saved=""
while read -r key real eff saved _; do
[[ $key == "Uid:" ]] && break
done < "$st" || continue
[[ $real == "$uid" || $eff == "$uid" || $saved == "$uid" ]] || continue
p=${st#/proc/}; p=${p%/status}
# Stat of /proc/<pid>/root needs CAP_SYS_PTRACE (or same-uid): exactly
# what shadow's userdel uses, so a process we cannot see here is one
# userdel cannot flag either. Compare by device+inode; skip on failure.
[[ $(stat -Lc '%d:%i' "/proc/$p/root" 2>/dev/null) == "$broot" ]] || continue
# NSpid chain length must equal ours, i.e. the process must live in our
# pid namespace - only then is its last field killable from here.
nsf=()
read -r -a nsf < <(nspid_fields "/proc/$p/status") || continue
if ((${#nsf[@]} > 0 && ${#nsf[@]} == ${#self_nsf[@]})); then
kpid=${nsf[${#nsf[@]} - 1]}
else
kpid="-"
fi
cmd=$(tr '\0' ' ' < "/proc/$p/cmdline" 2>/dev/null)
printf '%s\t%s\t%s\n' "$p" "$kpid" "$cmd"
done
return 0
}
sweep_builder_procs() {
local sig=$1 p kpid cmd kerr
local -a pids=()
while IFS=$'\t' read -r p kpid cmd; do
[[ -n $p ]] || continue
if [[ -z $kpid || $kpid == "-" ]]; then
echo "[customize] ${BUILD_USER} process outside our pid namespace (cannot signal): pid $p: $cmd"
continue
fi
echo "[customize] ${BUILD_USER} process ($sig): pid $p: $cmd"
pids+=("$kpid")
done < <(builder_procs)
if ((${#pids[@]} > 0)); then
# Surface signal failures (they used to be swallowed, hiding a
# pid-namespace mismatch as a silent no-op sweep).
if ! kerr=$(kill -"$sig" "${pids[@]}" 2>&1); then
[[ -n $kerr ]] && printf '[customize] kill -%s: %s\n' "$sig" "$kerr"
fi
fi
return 0
}
sweep_builder_procs TERM
sleep 2
sweep_builder_procs KILL
sleep 1
if ! userdel -r "${BUILD_USER}"; then
rm -rf "/home/${BUILD_USER:?}"
if ! userdel "${BUILD_USER}"; then
echo "[customize] FATAL: cannot remove user ${BUILD_USER}; leftover processes:" >&2
builder_procs >&2 || true
exit 1
fi
fi
chown -R root:root "${DOTS_REPO}"
# ── Google Sans Flex into skel: install_google_sans_flex() early-returns once
# fc-list sees the font, so the install step needs no network ──────────────
FONT_DIR="${SKEL}/.local/share/fonts/illogical-impulse-google-sans-flex"
if [[ ! -f "${FONT_DIR}/.git/HEAD" ]]; then
echo "[customize] Pre-installing Google Sans Flex into skel..."
rm -rf "${FONT_DIR}"
git clone --depth=1 --recurse-submodules --shallow-submodules \
https://github.com/end-4/google-sans-flex "${FONT_DIR}"
fi
# ── uv into skel: CPython 3.12 + the end-4 requirements wheel cache ──────────
# install-python-packages() runs `uv venv -p 3.12` and `uv pip install -r ...`
# during setup. Arch has no python312 package (uv would download one) and the
# pinned requirements are ~250 MiB of wheels, so warm both into skel: the venv
# is then created and filled straight from the image.
if command -v uv &>/dev/null; then
echo "[customize] Pre-warming uv (CPython 3.12 + requirements cache)..."
warm_venv="/tmp/uv-warm-venv"
rm -rf "${warm_venv}"
UV_CACHE_DIR="${SKEL}/.cache/uv" \
UV_PYTHON_INSTALL_DIR="${SKEL}/.local/share/uv/python" \
uv venv -p 3.12 "${warm_venv}"
UV_CACHE_DIR="${SKEL}/.cache/uv" \
UV_PYTHON_INSTALL_DIR="${SKEL}/.local/share/uv/python" \
uv pip install --python "${warm_venv}/bin/python" \
-r "${DOTS_REPO}/sdata/uv/requirements.txt"
rm -rf "${warm_venv}"
else
echo "[customize] uv not found - skipping python/wheel pre-warm."
fi
# ── Fish: ensure default shell is set for the live user ──────────────────────
# The live user (usually 'archlinux' or 'root') gets fish as default shell
if command -v fish &>/dev/null; then
+12
View File
@@ -0,0 +1,12 @@
NAME="Alvin Arch Linux"
PRETTY_NAME="Arch Linux"
ID_LIKE=arch
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://gitlab.archlinux.org/groups/archlinux/-/issues"
PRIVACY_POLICY_URL="https://terms.archlinux.org/docs/privacy-policy/"
LOGO=archlinux-logo
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
882DCFE48E2051D48E2562ABF3B607488DB35A47:4:
@@ -0,0 +1,41 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQGNBGERxNwBDAD1aEVN8rdWBlV2sOwkiW1ddO44xKjdumwuGhoXP1pUzK4SkNUb
IrQ1cenckdxzZsS8cbXTvEteC4K8tTYxobZpgzAPhKZNECsyCyDf2DEYv7bS75gy
sdl0bh+mOXPjvOe9IK3eFPQWWFd0erYyf9SHjlZ0utOg3qZ2JuVupGOH8W3taKth
ijR98RzUqP5rPoMPKcrOdBUiIREHx0y6SwdyX0c2XKm52T3cP8O0MPsvZLbRwGU0
DTyr7knzuGhR9tLxsy4PqKz3tSUEGM7PhFcpEoRFvV/4Al8/OpRaPj3zRn6RbL1D
9ZAH9OblgHkQlK6MPnLOygoaAvjreMHK3ykjlRugUtnRBmQHhH+o3iXb8Ep5GXjZ
XJZazy5ZSTbuJ8+DcjuC/G459ePnQ658od2Sxz5OBRmK3a1taAtgszHio1EHb8Db
OZ+Za5E46VOHM/8sl8toGbK4JOqpgdQ3YqIH4R915WqCYnMvfTQbCiHLYzWHrgAA
awBu3kaV2MagPnkAEQEAAbQbQ2FjaHlPUyA8YWRtaW5AY2FjaHlvcy5vcmc+iQHO
BBMBCAA4AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEEiC3P5I4gUdSOJWKr
87YHSI2zWkcFAmTUdqcACgkQ87YHSI2zWkc2ygwAknD+O2LQeHp1tEYwplF9Rthq
uPN64IxC/8nAc+L92fSOkVJKUfRh0PJcCCZgpTBAa7UV++GsT9SZ8jRtUPDfAy/R
0TSwKkEC6b1291xNdV3O83CtkSJRTP39nVCefXrBUpIwmkQJuytBF1qypTuw4jom
orcbmE40O7uNDe0FpZOJkUxT1sVJqj+y2h4mJsDuEAYKVQa4809yDwlQOYlLg6i3
wEBut7PPh8bEFWycNElKseh3dpQfvFVWMcUBafpQq7Q9zVFDW3nCUkFBMErcLb0y
VARQizrO3GqmWSU0zmgs8ruc3HnYjIfLIU68JRDsLdFgzIstEasnOskdUYywdvYw
BeGpCQX2ZFcTosLrZc1SRAk/XKioVXeHA92dcQacBClzKCmbat0CcNng5phu9fom
xGbNijvV5NWmQITw7j2sco0nLtfx2MiyRlR8s6pgrZ/VgfGq5K2gM306MgshgyMW
oIELm7aUTkbY+QH4v0y+U/KUNeHetDZhsMLwZq1DuQGNBGERxNwBDAC1RE2JFOjA
Mzqg3f5JsTa51WgApe2zlS/QjD+qr2LbC0CvQK3WO/MseqnEBfnXlUrL+tCzQXG7
9+kJk5xHsdaIbblTqdX3xNbT0/+sJkLsUWbfLh1lTgs+NnltsCtg1cIKm/eOBEWy
VfnrkKI+uTlQDDGcHW9XGaxLaIMi8FgaitMtrvH3AdajEpvpvdAAUbeIUL/hFs6V
TSs74xJRxy0J1eZYlZXo2YQ8EuZCAtyaQuvoDKijybxqj+FKPRiL920UI2emBYL0
cwMRq1XylZST7xXEzrEVgQ+xEUTBOUgmbRmIJVsSE/pDy7127dwPVpTglWiwfqnt
gdujrl6HM2b0a6lV5/ZoeYL5ucu6bku0ewbkoEKhqTe1JSVYWbStW5hwGFBxCFxG
pKQMMsDltmst8Z0Ic1Bhes00gd7LAC0AK8OkWFs4sIbHinNBVXQH/5MINF2ngm9t
P9kym17Nr5JterbxOOyNYl+ZOq6HFsrMXMZ1Cx+d4diqK2GnSeCZIvMAEQEAAYkB
vAQYAQgAJhYhBIgtz+SOIFHUjiViq/O2B0iNs1pHBQJhEcTcAhsMBQkDwmcAAAoJ
EPO2B0iNs1pHmFMMAOuyEJ93J4X5H+Jnf8/pXg2PFVvp0se7weCFha1d9umGSTrQ
Ejivm55z1X4R+Jt6D/cL3wN1WnayyNEtVzTD1CiuMDNO4a+qyBmE3/tJRWyIXoZ/
wdNu38rRNO/SdNbDWj0dCl6HCokLKSlfpP7996zymNeVX7yCw7T56jb2mTILTszy
E0xYPVAKb8cRZt9gUTivxQ3SPw5xVe1OXcF0Dkwx2EAAm7Alo6DMCZlqTii8Xc6K
YcaSRHNdlmkkW3RcTMkNja5mRFhzygklh9ViXqQs+9gZB+VHDqB2iNKbHJwO40aL
Ro/bta1h9P0HDD8q8mZWkZpGBlzul0x5UMedCeYudk9tOMwFCKRrhZeAyzMRn/+F
XUw7oFiWX6RX9ujq0O+Yna6WsWe+YN/vmT0KloTzRb0yqeDc37zc850+woYy+mNp
V2+Tq6hBDajk+BohvFyI7T4vvs45e+GwN2fTS6oqVsc9TfO7Q8JTi5y9UqByEbNC
bqY/IeIwaapRIqDYsg==
=bQDM
-----END PGP PUBLIC KEY BLOCK-----
+2 -2
View File
@@ -1,5 +1,5 @@
title Arch Linux install medium (%ARCH%, UEFI)
sort-key 01
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux-cachyos
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux-cachyos.img
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
options archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID%
@@ -1,5 +1,5 @@
title Arch Linux install medium (%ARCH%, UEFI) with speech
sort-key 02
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux-cachyos
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux-cachyos.img
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
options archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% accessibility=on
+4 -4
View File
@@ -46,14 +46,14 @@ timeout_style=menu
menuentry "Arch Linux install medium (%ARCH%, ${archiso_platform})" --class arch --class gnu-linux --class gnu --class os --id 'archlinux' {
set gfxpayload=keep
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux-cachyos archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID%
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux-cachyos.img
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID%
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
}
menuentry "Arch Linux install medium with speakup screen reader (%ARCH%, ${archiso_platform})" --hotkey s --class arch --class gnu-linux --class gnu --class os --id 'archlinux-accessibility' {
set gfxpayload=keep
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux-cachyos archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% accessibility=on
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux-cachyos.img
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% accessibility=on
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
}
+4 -4
View File
@@ -23,14 +23,14 @@ timeout_style=menu
menuentry "Arch Linux install medium (%ARCH%, ${archiso_platform})" --class arch --class gnu-linux --class gnu --class os --id 'archlinux' {
set gfxpayload=keep
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux-cachyos archisobasedir=%INSTALL_DIR% img_dev=UUID=${archiso_img_dev_uuid} img_loop="${iso_path}"
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux-cachyos.img
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux archisobasedir=%INSTALL_DIR% img_dev=UUID=${archiso_img_dev_uuid} img_loop="${iso_path}"
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
}
menuentry "Arch Linux install medium with speakup screen reader (%ARCH%, ${archiso_platform})" --hotkey s --class arch --class gnu-linux --class gnu --class os --id 'archlinux-accessibility' {
set gfxpayload=keep
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux-cachyos archisobasedir=%INSTALL_DIR% img_dev=UUID=${archiso_img_dev_uuid} img_loop="${iso_path}" accessibility=on
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux-cachyos.img
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux archisobasedir=%INSTALL_DIR% img_dev=UUID=${archiso_img_dev_uuid} img_loop="${iso_path}" accessibility=on
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
}
+17 -19
View File
@@ -87,36 +87,34 @@ done
info "═══ Step 2: Building AUR dependencies ═══"
# ── Theming & appearance ─────────────────────────────────────────────────────
# Entries in these lists must start at column 0: CI's package check accepts
# repo-less packages via `grep -qxF <pkg>` against this file (exact whole-line
# match), which silently never matched while the names were indented.
AUR_THEMING=(
adw-gtk-theme-git
darkly-bin
ttf-material-symbols-variable-git
ttf-readex-pro
ttf-rubik-vf
ttf-twemoji
otf-space-grotesk
kde-material-you-colors-git
adw-gtk-theme-git
darkly-bin
ttf-material-symbols-variable-git
ttf-readex-pro
ttf-rubik-vf
ttf-twemoji
otf-space-grotesk
kde-material-you-colors-git
)
# ── end-4 specific / build-from-source packages ──────────────────────────────
# matugen — material you color generation tool
# speech-dispatcher — may need AUR build on some setups
AUR_TOOLS=(
matugen
python-rpypostprocess
tts
matugen
python-rpypostprocess
tts
)
# ── Packages not in any standard repo ────────────────────────────────────────
AUR_MISSING=(
asciinema-agg
davs2
varia
woeusb-ng
ttf-ms-fonts
asciinema-agg
davs2
syncthingtray-qt6
varia
woeusb-ng
ttf-ms-fonts
)
# ── Large / complex builds (skipped with --quick) ────────────────────────────
-184
View File
@@ -1,184 +0,0 @@
#!/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"
@@ -1 +0,0 @@
ref: refs/heads/master
@@ -1,9 +0,0 @@
[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
@@ -1 +0,0 @@
Unnamed repository; edit this file 'description' to name the repository.
@@ -1,15 +0,0 @@
#!/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+"$@"}
:
@@ -1,74 +0,0 @@
#!/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
@@ -1,168 +0,0 @@
#!/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;
}
@@ -1,8 +0,0 @@
#!/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
@@ -1,14 +0,0 @@
#!/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+"$@"}
:
@@ -1,49 +0,0 @@
#!/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 --
@@ -1,13 +0,0 @@
#!/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"
:
@@ -1,53 +0,0 @@
#!/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
@@ -1,169 +0,0 @@
#!/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
@@ -1,24 +0,0 @@
#!/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
@@ -1,42 +0,0 @@
#!/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
@@ -1,78 +0,0 @@
#!/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
@@ -1,77 +0,0 @@
#!/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
@@ -1,128 +0,0 @@
#!/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
@@ -1 +0,0 @@
* -export-subst -export-ignore
@@ -1,6 +0,0 @@
# 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]
# *~
@@ -1,2 +0,0 @@
# pack-refs with: peeled fully-peeled sorted
e8c6e58b1306119e51297b02f0b449fa7300416d refs/heads/master
Submodule localrepo/end4-pkgbuilds/microtex-git/src/MicroTeX deleted from f1dc9f74bb
@@ -1,4 +1,4 @@
_commit='11ca60be22b063478ed9586ca1d7f92f0f261caf'
_commit='7511545ee20664e3b8b8d3322c0ffe7567c56f7a'
# Useful links:
# https://git.outfoxxed.me/quickshell/quickshell/commits/branch/master
# https://aur.archlinux.org/packages/quickshell-git
@@ -8,7 +8,7 @@ _prefix='illogical-impulse'
_pkgname=quickshell
pkgname="$_prefix-$_pkgname-git"
pkgver=0.1.0.r1
pkgrel=9
pkgrel=8
pkgdesc="$_pkgname-git pinned commit and extra deps for $_prefix"
arch=(x86_64 aarch64)
url='https://git.outfoxxed.me/quickshell/quickshell'
@@ -1,52 +0,0 @@
# 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
@@ -1 +0,0 @@
/usr/bin/quickshell
@@ -1,8 +0,0 @@
module Quickshell.Bluetooth
linktarget quickshell-bluetoothplugin
optional plugin quickshell-bluetoothplugin
classname Quickshell_BluetoothPlugin
typeinfo quickshell-bluetooth.qmltypes
depends QtQml
prefer :/qt/qml/Quickshell/Bluetooth/
@@ -1,411 +0,0 @@
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 }
}
}
@@ -1,10 +0,0 @@
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
@@ -1,67 +0,0 @@
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 }
}
}
@@ -1,10 +0,0 @@
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
@@ -1,48 +0,0 @@
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 }
}
}
}
@@ -1,9 +0,0 @@
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
@@ -1,72 +0,0 @@
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 }
}
}
@@ -1,9 +0,0 @@
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
@@ -1,538 +0,0 @@
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 }
}
}
@@ -1,9 +0,0 @@
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
@@ -1,50 +0,0 @@
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 }
}
}
@@ -1,11 +0,0 @@
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/
@@ -1,8 +0,0 @@
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 {}
@@ -1,10 +0,0 @@
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
@@ -1,413 +0,0 @@
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 }
}
}
@@ -1,8 +0,0 @@
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/
@@ -1,8 +0,0 @@
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 {}
@@ -1,53 +0,0 @@
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;
}
}
@@ -1,11 +0,0 @@
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
@@ -1,642 +0,0 @@
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 }
}
}
@@ -1,9 +0,0 @@
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
@@ -1,614 +0,0 @@
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 }
}
}
@@ -1,9 +0,0 @@
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
@@ -1,127 +0,0 @@
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" }
}
}
}
@@ -1,9 +0,0 @@
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
@@ -1,529 +0,0 @@
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
}
}
}
@@ -1,9 +0,0 @@
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
@@ -1,441 +0,0 @@
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" }
}
}
}
@@ -1,9 +0,0 @@
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
@@ -1,181 +0,0 @@
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" }
}
}
}
@@ -1,10 +0,0 @@
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
@@ -1,646 +0,0 @@
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 }
}
}
}
@@ -1,9 +0,0 @@
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
@@ -1,251 +0,0 @@
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 }
}
}

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