Compare commits
52
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f06bfd1512
|
||
|
|
a940d91794
|
||
|
|
9af4bc6c27
|
||
|
|
3c540f8bed
|
||
|
|
3f3bba05f3
|
||
|
|
01913f7682
|
||
|
|
f9a2978517
|
||
|
|
1e8a1e3282
|
||
|
|
db83549996
|
||
|
|
59d82f06f5
|
||
|
|
1bb6f8dddd
|
||
|
|
0fbec83573
|
||
|
|
a6c99b72d0
|
||
|
|
c64c64dc97
|
||
|
|
319333e400
|
||
|
|
bb6f64e977
|
||
|
|
3b3764573e
|
||
|
|
8501a60165
|
||
|
|
7c601ca53d
|
||
|
|
f3bd10cf0f
|
||
|
|
83ed87f6a9
|
||
|
|
5ffd5d0d82
|
||
|
|
8484bddcf2
|
||
|
|
0755091721
|
||
|
|
c71168371d
|
||
|
|
117b5e97aa
|
||
|
|
8a88921913
|
||
|
|
9614192416
|
||
|
|
2f1ac8d052
|
||
|
|
fa7eff8517
|
||
|
|
24f3f0f399
|
||
|
|
ac59de33c8
|
||
|
|
da0855d341
|
||
|
|
50d49bbe38 | ||
|
|
1090e3c75b
|
||
|
|
48b760d54e
|
||
|
|
7f91c189db
|
||
|
|
3816877b12
|
||
|
|
c9cf5ead97
|
||
|
|
01c7c4e1fa
|
||
|
|
d5356b772e
|
||
|
|
75bc4b3f4c | ||
|
|
10198915a1
|
||
|
|
56c02781c2
|
||
|
|
8e6e06155c
|
||
|
|
22bae5f19b
|
||
|
|
2dbbb3321d
|
||
|
|
c4ce0b3534
|
||
|
|
3c592d1e84
|
||
|
|
aad0ea2e03
|
||
|
|
2eb1e9f61a
|
||
|
|
08e947c7ea
|
+531
-40
@@ -1,10 +1,14 @@
|
||||
name: Scheduled ArchISO Build
|
||||
name: Automated Arch ISO 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
|
||||
@@ -15,80 +19,567 @@ 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: |
|
||||
pacman -Syu --noconfirm archiso jq
|
||||
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
|
||||
|
||||
- name: Build Arch ISO
|
||||
run: |
|
||||
# Replace 'releng' with your custom profile directory if needed
|
||||
mkarchiso -v -w work -o out/ releng
|
||||
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)"
|
||||
|
||||
- name: Generate Unique Dynamic Tag
|
||||
id: tag
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||
SERVER_URL: ${{ github.server_url }}
|
||||
GITEA_API: http://192.168.1.168:3000/api/v1
|
||||
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 -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}"
|
||||
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}"
|
||||
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 }}
|
||||
SERVER_URL: ${{ github.server_url }}
|
||||
# Use internal Gitea URL to bypass traefik proxy timeout on large uploads
|
||||
GITEA_API: http://192.168.1.168:3000/api/v1
|
||||
REPOSITORY: ${{ github.repository }}
|
||||
TAG_NAME: ${{ steps.tag.outputs.tag_name }}
|
||||
RELEASE_NAME: ${{ steps.tag.outputs.release_name }}
|
||||
run: |
|
||||
# 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')
|
||||
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
|
||||
|
||||
echo "Created release ID: $RELEASE_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
|
||||
|
||||
# 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" \
|
||||
-F "attachment=@$iso" \
|
||||
"$SERVER_URL/api/v1/repos/$REPOSITORY/releases/$RELEASE_ID/assets"
|
||||
# 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
|
||||
|
||||
echo "Release $TAG_NAME created and ISOs uploaded."
|
||||
# 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
|
||||
|
||||
- name: Keep only latest 3 releases
|
||||
# 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 \
|
||||
-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
|
||||
done
|
||||
|
||||
echo "✅ All ISOs uploaded to release $TAG_NAME"
|
||||
exit 0
|
||||
|
||||
- name: Verify uploaded ISO checksums
|
||||
if: success()
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||
SERVER_URL: ${{ github.server_url }}
|
||||
# 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
|
||||
REPOSITORY: ${{ github.repository }}
|
||||
run: |
|
||||
# Fetch all releases
|
||||
releases=$(curl -s -H "Authorization: token $GITEA_TOKEN" \
|
||||
"$SERVER_URL/api/v1/repos/$REPOSITORY/releases")
|
||||
set -euo pipefail
|
||||
test -n "$GITEA_TOKEN"
|
||||
|
||||
# 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 "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]}
|
||||
echo "Deleting old release ID: $id"
|
||||
curl -s -X DELETE -H "Authorization: token $GITEA_TOKEN" \
|
||||
"$SERVER_URL/api/v1/repos/$REPOSITORY/releases/$id"
|
||||
fi
|
||||
done
|
||||
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"
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
name: Upstream pin check
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 6 * * 1" # Mondays 06:00 UTC — catches upstream/Qt drift between ISO builds
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "localrepo/end4-pkgbuilds/quickshell-git/PKGBUILD"
|
||||
- "localrepo/check-quickshell-pin.sh"
|
||||
- "airootfs/root/customize_airootfs.sh"
|
||||
- ".gitea/workflows/pin-check.yaml"
|
||||
|
||||
jobs:
|
||||
quickshell-pin:
|
||||
runs-on: archlinux
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v4
|
||||
|
||||
# Tripwire for the failure mode that broke ISO build run 137:
|
||||
# a quickshell pin (ours or end-4's) that predates a Qt compat fix
|
||||
# or has simply gone stale. Fails the job so the drift is visible
|
||||
# in Actions instead of surfacing as a 3-hour ISO build failure.
|
||||
- name: Check quickshell pins
|
||||
run: ./localrepo/check-quickshell-pin.sh
|
||||
@@ -36,7 +36,23 @@ jobs:
|
||||
rm -f /var/lib/pacman/sync/cachyos* /var/lib/pacman/sync/chaotic*
|
||||
|
||||
- name: Install prerequisites
|
||||
run: pacman -Syu --noconfirm --needed shellcheck yamllint
|
||||
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: |
|
||||
@@ -54,7 +70,20 @@ jobs:
|
||||
printf '\n[cachyos]\nInclude = /etc/pacman.d/cachyos-mirrorlist\n' \
|
||||
>> /etc/pacman.conf
|
||||
|
||||
pacman -Syu --noconfirm
|
||||
# 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: |
|
||||
@@ -65,7 +94,20 @@ jobs:
|
||||
printf '\n[chaotic-aur]\nInclude = /etc/pacman.d/chaotic-mirrorlist\n' \
|
||||
>> /etc/pacman.conf
|
||||
|
||||
pacman -Syu --noconfirm
|
||||
# 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: |
|
||||
@@ -80,7 +122,7 @@ jobs:
|
||||
fi
|
||||
|
||||
FAILED=0
|
||||
for f in $SH_FILES; do
|
||||
while IFS= read -r f; do
|
||||
echo ""
|
||||
echo "── Checking: $f"
|
||||
if shellcheck -x -s bash "$f"; then
|
||||
@@ -89,7 +131,7 @@ jobs:
|
||||
echo " ❌ $f failed"
|
||||
FAILED=1
|
||||
fi
|
||||
done
|
||||
done <<< "$SH_FILES"
|
||||
|
||||
if [ "$FAILED" -ne 0 ]; then
|
||||
echo ""
|
||||
@@ -110,14 +152,14 @@ jobs:
|
||||
echo " Running yamllint on all YAML files"
|
||||
echo "═══════════════════════════════════════════════════════════════"
|
||||
|
||||
YAML_FILES=$(find . -name '*.yml' -o -name '*.yaml' | grep -v '.git/')
|
||||
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
|
||||
for f in $YAML_FILES; do
|
||||
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
|
||||
@@ -126,7 +168,7 @@ jobs:
|
||||
echo " ❌ $f failed"
|
||||
FAILED=1
|
||||
fi
|
||||
done
|
||||
done <<< "$YAML_FILES"
|
||||
|
||||
if [ "$FAILED" -ne 0 ]; then
|
||||
echo ""
|
||||
@@ -260,3 +302,41 @@ jobs:
|
||||
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
@@ -0,0 +1,11 @@
|
||||
# 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
|
||||
@@ -0,0 +1,115 @@
|
||||
# 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).
|
||||
@@ -1,32 +0,0 @@
|
||||
-----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-----
|
||||
+3
-2
@@ -1,7 +1,8 @@
|
||||
To install [38;2;23;147;209mArch Linux[0m follow the installation guide:
|
||||
To install [38;2;23;147;209mArch Linux[0m, follow the installation guide,
|
||||
or run [35malvin-install[0m for an automated setup.
|
||||
https://wiki.archlinux.org/title/Installation_guide
|
||||
|
||||
For Wi-Fi, authenticate to the wireless network using the [35miwctl[0m utility.
|
||||
For Wi-Fi, run [35mnmtui[0m to configure a wireless network.
|
||||
For mobile broadband (WWAN) modems, connect with the [35mmmcli[0m utility.
|
||||
Ethernet, WLAN and WWAN interfaces using DHCP should work automatically.
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
[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"
|
||||
@@ -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 ii'
|
||||
alias q 'qs -c end4-pC'
|
||||
if test "$TERM" != "linux"
|
||||
alias ls 'eza --icons'
|
||||
end
|
||||
|
||||
@@ -0,0 +1,677 @@
|
||||
{
|
||||
"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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,676 @@
|
||||
{
|
||||
"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
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -1,186 +0,0 @@
|
||||
# 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"
|
||||
@@ -1,22 +0,0 @@
|
||||
[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
|
||||
@@ -1,20 +0,0 @@
|
||||
[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
|
||||
@@ -1,19 +0,0 @@
|
||||
[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
|
||||
@@ -0,0 +1 @@
|
||||
/usr/lib/systemd/system/NetworkManager.service
|
||||
@@ -1 +0,0 @@
|
||||
/usr/lib/systemd/system/systemd-networkd.service
|
||||
@@ -1 +0,0 @@
|
||||
/usr/lib/systemd/system/systemd-resolved.service
|
||||
@@ -48,4 +48,13 @@ Include = /etc/pacman.d/cachyos-mirrorlist
|
||||
|
||||
[chaotic-aur]
|
||||
SigLevel = Required DatabaseOptional
|
||||
Include = /etc/pacman.d/chaotic-mirrorlist
|
||||
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
|
||||
|
||||
@@ -1,6 +1,19 @@
|
||||
#!/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.
|
||||
@@ -14,6 +27,17 @@ 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).
|
||||
@@ -57,6 +81,279 @@ 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
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
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
|
||||
Executable
+2150
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
882DCFE48E2051D48E2562ABF3B607488DB35A47:4:
|
||||
@@ -1,41 +0,0 @@
|
||||
-----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-----
|
||||
@@ -1,5 +1,5 @@
|
||||
title Arch Linux install medium (%ARCH%, UEFI)
|
||||
sort-key 01
|
||||
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux
|
||||
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
|
||||
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux-cachyos
|
||||
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux-cachyos.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
|
||||
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
|
||||
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux-cachyos
|
||||
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux-cachyos.img
|
||||
options archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% accessibility=on
|
||||
|
||||
+4
-4
@@ -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 archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID%
|
||||
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
|
||||
linux /%INSTALL_DIR%/boot/%ARCH%/vmlinuz-linux-cachyos archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID%
|
||||
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux-cachyos.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 archisobasedir=%INSTALL_DIR% archisosearchuuid=%ARCHISO_UUID% accessibility=on
|
||||
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
|
||||
+4
-4
@@ -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 archisobasedir=%INSTALL_DIR% img_dev=UUID=${archiso_img_dev_uuid} img_loop="${iso_path}"
|
||||
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
|
||||
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
|
||||
}
|
||||
|
||||
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 archisobasedir=%INSTALL_DIR% img_dev=UUID=${archiso_img_dev_uuid} img_loop="${iso_path}" accessibility=on
|
||||
initrd /%INSTALL_DIR%/boot/%ARCH%/initramfs-linux.img
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -87,34 +87,36 @@ 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
|
||||
syncthingtray-qt6
|
||||
varia
|
||||
woeusb-ng
|
||||
ttf-ms-fonts
|
||||
asciinema-agg
|
||||
davs2
|
||||
varia
|
||||
woeusb-ng
|
||||
ttf-ms-fonts
|
||||
)
|
||||
|
||||
# ── Large / complex builds (skipped with --quick) ────────────────────────────
|
||||
|
||||
Executable
+184
@@ -0,0 +1,184 @@
|
||||
#!/usr/bin/env bash
|
||||
# Verify that every quickshell pin we build against is current enough to
|
||||
# survive the next Arch Qt update.
|
||||
#
|
||||
# Why this exists: CI run 137 (2026-10-08) failed because end-4 pinned
|
||||
# quickshell to 41651d7 (Sep 25), which predates quickshell's Qt 6.12 fix
|
||||
# (5d5d498, Oct 3: "use MOC includes instead of opaque pointer definitions
|
||||
# - Fixes linking issues and Qt 6.12 compatibility"). Arch shipped
|
||||
# qt6 6.12.0 the next day and the pinned commit stopped compiling
|
||||
# ("Meta Types must be fully defined"). customize_airootfs.sh papers over
|
||||
# end-4's stale pin at build time; this script is the tripwire that tells
|
||||
# us when pins - ours OR end-4's - fall behind again BEFORE a build does.
|
||||
#
|
||||
# Checked pins:
|
||||
# 1. localrepo/end4-pkgbuilds/quickshell-git/PKGBUILD (our own pin)
|
||||
# 2. end-4/dots-hyprland sdata/dist-arch PKGBUILD (live from GitHub)
|
||||
#
|
||||
# Checks per pin:
|
||||
# - commit exists upstream
|
||||
# - includes the Qt 6.12 fix (5d5d498)
|
||||
# - not older than QUICKSHELL_PIN_MAX_AGE_DAYS (default 45)
|
||||
#
|
||||
# Exit 1 on any failure so CI (pin-check.yaml) goes red.
|
||||
#
|
||||
# Usage: ./localrepo/check-quickshell-pin.sh
|
||||
set -euo pipefail
|
||||
|
||||
QT612_FIX='5d5d49873fe8cf1f99ddfd5006ceb2057c5c9b13'
|
||||
QS_REPO='https://git.outfoxxed.me/quickshell/quickshell.git'
|
||||
END4_STALE_PIN='41651d7' # the pin customize_airootfs.sh overrides
|
||||
END4_PKGBUILD_URL='https://raw.githubusercontent.com/end-4/dots-hyprland/main/sdata/dist-arch/illogical-impulse-quickshell-git/PKGBUILD'
|
||||
MAX_AGE_DAYS="${QUICKSHELL_PIN_MAX_AGE_DAYS:-45}"
|
||||
|
||||
profile_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
LOCAL_PKGBUILD="${profile_dir}/localrepo/end4-pkgbuilds/quickshell-git/PKGBUILD"
|
||||
|
||||
FAILED=0
|
||||
|
||||
fail() {
|
||||
echo "❌ $1" >&2
|
||||
FAILED=1
|
||||
}
|
||||
|
||||
# ── collect pins ────────────────────────────────────────────────────────────
|
||||
|
||||
pin_of() { # <file-contents-stdin> -> first _commit='...' value
|
||||
sed -n "s/^_commit='\([0-9a-f]\{7,40\}\)'.*/\1/p" | head -n1
|
||||
}
|
||||
|
||||
if [[ ! -f "$LOCAL_PKGBUILD" ]]; then
|
||||
echo "❌ missing ${LOCAL_PKGBUILD}" >&2
|
||||
exit 1
|
||||
fi
|
||||
local_pin=$(pin_of < "$LOCAL_PKGBUILD")
|
||||
if [[ -z "$local_pin" ]]; then
|
||||
echo "❌ no _commit= found in ${LOCAL_PKGBUILD}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
end4_pin=''
|
||||
end4_pkgbuild=''
|
||||
for try in 1 2 3 4 5; do
|
||||
if end4_pkgbuild=$(curl -fsSL --max-time 30 "$END4_PKGBUILD_URL"); then
|
||||
end4_pin=$(printf '%s\n' "$end4_pkgbuild" | pin_of)
|
||||
break
|
||||
fi
|
||||
echo " ⏳ fetch of end-4 PKGBUILD failed (try $try/5), retrying in $(( try * 3 ))s..." >&2
|
||||
sleep $(( try * 3 ))
|
||||
done
|
||||
if [[ -z "$end4_pin" ]]; then
|
||||
fail "could not fetch end-4's quickshell PKGBUILD from GitHub — network or path change?"
|
||||
echo ""
|
||||
echo "Result: FAILED"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ── clone quickshell (blobless: commits+trees only, fast) ───────────────────
|
||||
|
||||
tmp=$(mktemp -d)
|
||||
trap 'rm -rf "$tmp"' EXIT
|
||||
|
||||
cloned=0
|
||||
for try in 1 2 3; do
|
||||
if git clone --filter=blob:none --quiet "$QS_REPO" "$tmp/qs" 2>/dev/null; then
|
||||
cloned=1
|
||||
break
|
||||
fi
|
||||
rm -rf "$tmp/qs"
|
||||
echo " ⏳ clone of quickshell failed (try $try/3), retrying in $(( try * 5 ))s..." >&2
|
||||
sleep $(( try * 5 ))
|
||||
done
|
||||
if [[ "$cloned" -ne 1 ]]; then
|
||||
fail "could not clone ${QS_REPO} — network or repo moved?"
|
||||
echo ""
|
||||
echo "Result: FAILED"
|
||||
exit 1
|
||||
fi
|
||||
QS="$tmp/qs"
|
||||
qs_head=$(git -C "$QS" rev-parse HEAD)
|
||||
qs_head_date=$(git -C "$QS" show -s --format=%cs HEAD)
|
||||
echo "quickshell upstream master: ${qs_head:0:12} (${qs_head_date})"
|
||||
echo ""
|
||||
|
||||
now=$(date +%s)
|
||||
|
||||
# <label> <pin> <mode>: mode "hard" fails on any problem; mode "soft" only
|
||||
# warns, for pins we don't control (end-4's) — UNLESS the problem is one the
|
||||
# customize_airootfs.sh override does not cover, which always fails hard
|
||||
# because it would break the next ISO build.
|
||||
check_pin() {
|
||||
local label=$1 pin=$2 mode=$3
|
||||
local ts age behind bad=0
|
||||
|
||||
if ! git -C "$QS" cat-file -e "${pin}^{commit}" 2>/dev/null; then
|
||||
fail "$label: pin '$pin' does not exist in quickshell upstream"
|
||||
return
|
||||
fi
|
||||
|
||||
local has_fix=0
|
||||
if git -C "$QS" merge-base --is-ancestor "$QT612_FIX" "$pin"; then
|
||||
has_fix=1
|
||||
fi
|
||||
|
||||
ts=$(git -C "$QS" show -s --format=%ct "$pin")
|
||||
age=$(( (now - ts) / 86400 ))
|
||||
behind=$(git -C "$QS" rev-list --count "$pin..HEAD")
|
||||
|
||||
if [[ "$mode" == "hard" ]]; then
|
||||
if [[ "$has_fix" -eq 0 ]]; then
|
||||
fail "$label: pin '$pin' PREDATES the Qt 6.12 fix (${QT612_FIX:0:12}) — will not compile against Qt >= 6.12"
|
||||
bad=1
|
||||
fi
|
||||
if (( age > MAX_AGE_DAYS )); then
|
||||
fail "$label: pin is $age days old (> ${MAX_AGE_DAYS}d), $behind commit(s) behind upstream master — bump it"
|
||||
bad=1
|
||||
fi
|
||||
if [[ "$bad" -eq 0 ]]; then
|
||||
echo " ✅ $label: pin ${pin:0:12} includes the Qt 6.12 fix, age ${age}d (${behind} commit(s) behind master)"
|
||||
fi
|
||||
return
|
||||
fi
|
||||
|
||||
# soft mode: our build-time override compensates for this pin, so drift is
|
||||
# a heads-up — it cannot break the ISO build on its own.
|
||||
if [[ "$has_fix" -eq 0 ]]; then
|
||||
echo " ⚠️ $label: pin ${pin:0:12} predates the Qt 6.12 fix — covered by the customize_airootfs.sh override, but end-4 should bump it"
|
||||
else
|
||||
echo " ✅ $label: pin ${pin:0:12} includes the Qt 6.12 fix"
|
||||
fi
|
||||
if (( age > MAX_AGE_DAYS )); then
|
||||
echo " ⚠️ $label: pin is $age days old (> ${MAX_AGE_DAYS}d), $behind commit(s) behind master — consider bumping (not enforced, we don't own this pin)"
|
||||
else
|
||||
echo " ✅ $label: pin age ${age}d (${behind} commit(s) behind master), limit ${MAX_AGE_DAYS}d"
|
||||
fi
|
||||
}
|
||||
|
||||
# ── our pin ─────────────────────────────────────────────────────────────────
|
||||
|
||||
echo "our pin (localrepo/end4-pkgbuilds):"
|
||||
check_pin "ours" "$local_pin" hard
|
||||
|
||||
# ── end-4's pin ─────────────────────────────────────────────────────────────
|
||||
|
||||
echo ""
|
||||
echo "end-4's pin (dots-hyprland sdata/dist-arch):"
|
||||
# end-4's pin is only safe if OUR override covers it: customize_airootfs.sh
|
||||
# rewrites exactly the 41651d7 pin. Any other Qt-unsafe end-4 pin sails
|
||||
# straight into the ISO build unpatched → hard failure.
|
||||
if [[ "$end4_pin" == "$END4_STALE_PIN"* ]]; then
|
||||
echo " ℹ️ end-4 still pins ${end4_pin:0:12} — customize_airootfs.sh override is active"
|
||||
check_pin "end-4" "$end4_pin" soft
|
||||
else
|
||||
check_pin "end-4" "$end4_pin" hard
|
||||
echo " ℹ️ end-4 has moved off ${END4_STALE_PIN} to ${end4_pin:0:12}"
|
||||
echo " → if it now passes, consider retiring the override guard in"
|
||||
echo " customize_airootfs.sh and syncing our own pin to match."
|
||||
fi
|
||||
|
||||
echo ""
|
||||
if [[ "$FAILED" -ne 0 ]]; then
|
||||
echo "Result: FAILED"
|
||||
exit 1
|
||||
fi
|
||||
echo "Result: OK — all quickshell pins are Qt 6.12-safe and within ${MAX_AGE_DAYS}d of upstream"
|
||||
@@ -0,0 +1 @@
|
||||
ref: refs/heads/master
|
||||
@@ -0,0 +1,9 @@
|
||||
[core]
|
||||
repositoryformatversion = 0
|
||||
filemode = true
|
||||
bare = true
|
||||
[remote "origin"]
|
||||
url = https://github.com/end-4/MicroTeX.git
|
||||
tagOpt = --no-tags
|
||||
fetch = +refs/*:refs/*
|
||||
mirror = true
|
||||
@@ -0,0 +1 @@
|
||||
Unnamed repository; edit this file 'description' to name the repository.
|
||||
@@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to check the commit log message taken by
|
||||
# applypatch from an e-mail message.
|
||||
#
|
||||
# The hook should exit with non-zero status after issuing an
|
||||
# appropriate message if it wants to stop the commit. The hook is
|
||||
# allowed to edit the commit message file.
|
||||
#
|
||||
# To enable this hook, rename this file to "applypatch-msg".
|
||||
|
||||
. git-sh-setup
|
||||
commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
|
||||
test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
|
||||
:
|
||||
@@ -0,0 +1,74 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to check the commit log message.
|
||||
# Called by "git commit" with one argument, the name of the file
|
||||
# that has the commit message. The hook should exit with non-zero
|
||||
# status after issuing an appropriate message if it wants to stop the
|
||||
# commit. The hook is allowed to edit the commit message file.
|
||||
#
|
||||
# To enable this hook, rename this file to "commit-msg".
|
||||
|
||||
# Uncomment the below to add a Signed-off-by line to the message.
|
||||
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
|
||||
# hook is more suited to it.
|
||||
#
|
||||
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
||||
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
|
||||
|
||||
# This example catches duplicate Signed-off-by lines and messages that
|
||||
# would confuse 'git am'.
|
||||
|
||||
ret=0
|
||||
|
||||
test "" = "$(grep '^Signed-off-by: ' "$1" |
|
||||
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
|
||||
echo >&2 Duplicate Signed-off-by lines.
|
||||
ret=1
|
||||
}
|
||||
|
||||
comment_re="$(
|
||||
{
|
||||
git config --get-regexp "^core\.comment(char|string)\$" ||
|
||||
echo '#'
|
||||
} | sed -n -e '
|
||||
${
|
||||
s/^[^ ]* //
|
||||
s|[][*./\]|\\&|g
|
||||
s/^auto$/[#;@!$%^&|:]/
|
||||
p
|
||||
}'
|
||||
)"
|
||||
scissors_line="^${comment_re} -\{8,\} >8 -\{8,\}\$"
|
||||
comment_line="^${comment_re}.*"
|
||||
blank_line='^[ ]*$'
|
||||
# Disallow lines starting with "diff -" or "Index: " in the body of the
|
||||
# message. Stop looking if we see a scissors line.
|
||||
line="$(sed -n -e "
|
||||
# Skip comments and blank lines at the start of the file.
|
||||
/${scissors_line}/q
|
||||
/${comment_line}/d
|
||||
/${blank_line}/d
|
||||
# The first paragraph will become the subject header so
|
||||
# does not need to be checked.
|
||||
: subject
|
||||
n
|
||||
/${scissors_line}/q
|
||||
/${blank_line}/!b subject
|
||||
# Check the body of the message for problematic
|
||||
# prefixes.
|
||||
: body
|
||||
n
|
||||
/${scissors_line}/q
|
||||
/${comment_line}/b body
|
||||
/^diff -/{p;q;}
|
||||
/^Index: /{p;q;}
|
||||
b body
|
||||
" "$1")"
|
||||
if test -n "$line"
|
||||
then
|
||||
echo >&2 "Message contains a diff that will confuse 'git am'."
|
||||
echo >&2 "To fix this indent the diff."
|
||||
ret=1
|
||||
fi
|
||||
|
||||
exit $ret
|
||||
+168
@@ -0,0 +1,168 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use IPC::Open2;
|
||||
|
||||
# An example hook script to integrate Watchman
|
||||
# (https://facebook.github.io/watchman/) with git to speed up detecting
|
||||
# new and modified files.
|
||||
#
|
||||
# The hook is passed a version (currently 2) and last update token
|
||||
# formatted as a string and outputs to stdout a new update token and
|
||||
# all files that have been modified since the update token. Paths must
|
||||
# be relative to the root of the working tree and separated by a single NUL.
|
||||
#
|
||||
# To enable this hook, rename this file to "query-watchman" and set
|
||||
# 'git config core.fsmonitor .git/hooks/query-watchman'
|
||||
#
|
||||
my ($version, $last_update_token) = @ARGV;
|
||||
|
||||
# Uncomment for debugging
|
||||
# print STDERR "$0 $version $last_update_token\n";
|
||||
|
||||
# Check the hook interface version
|
||||
if ($version ne 2) {
|
||||
die "Unsupported query-fsmonitor hook version '$version'.\n" .
|
||||
"Falling back to scanning...\n";
|
||||
}
|
||||
|
||||
my $git_work_tree = get_working_dir();
|
||||
|
||||
my $json_pkg;
|
||||
eval {
|
||||
require JSON::XS;
|
||||
$json_pkg = "JSON::XS";
|
||||
1;
|
||||
} or do {
|
||||
require JSON::PP;
|
||||
$json_pkg = "JSON::PP";
|
||||
};
|
||||
|
||||
launch_watchman();
|
||||
|
||||
sub launch_watchman {
|
||||
my $o = watchman_query();
|
||||
if (is_work_tree_watched($o)) {
|
||||
output_result($o->{clock}, @{$o->{files}});
|
||||
}
|
||||
}
|
||||
|
||||
sub output_result {
|
||||
my ($clockid, @files) = @_;
|
||||
|
||||
# Uncomment for debugging watchman output
|
||||
# open (my $fh, ">", ".git/watchman-output.out");
|
||||
# binmode $fh, ":utf8";
|
||||
# print $fh "$clockid\n@files\n";
|
||||
# close $fh;
|
||||
|
||||
binmode STDOUT, ":utf8";
|
||||
print $clockid;
|
||||
print "\0";
|
||||
local $, = "\0";
|
||||
print @files;
|
||||
}
|
||||
|
||||
sub watchman_clock {
|
||||
my $response = qx/watchman clock "$git_work_tree"/;
|
||||
die "Failed to get clock id on '$git_work_tree'.\n" .
|
||||
"Falling back to scanning...\n" if $? != 0;
|
||||
|
||||
return $json_pkg->new->utf8->decode($response);
|
||||
}
|
||||
|
||||
sub watchman_query {
|
||||
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
|
||||
or die "open2() failed: $!\n" .
|
||||
"Falling back to scanning...\n";
|
||||
|
||||
# In the query expression below we're asking for names of files that
|
||||
# changed since $last_update_token but not from the .git folder.
|
||||
#
|
||||
# To accomplish this, we're using the "since" generator to use the
|
||||
# recency index to select candidate nodes and "fields" to limit the
|
||||
# output to file names only. Then we're using the "expression" term to
|
||||
# further constrain the results.
|
||||
my $last_update_line = "";
|
||||
if (substr($last_update_token, 0, 1) eq "c") {
|
||||
$last_update_token = "\"$last_update_token\"";
|
||||
$last_update_line = qq[\n"since": $last_update_token,];
|
||||
}
|
||||
my $query = <<" END";
|
||||
["query", "$git_work_tree", {$last_update_line
|
||||
"fields": ["name"],
|
||||
"expression": ["not", ["dirname", ".git"]]
|
||||
}]
|
||||
END
|
||||
|
||||
# Uncomment for debugging the watchman query
|
||||
# open (my $fh, ">", ".git/watchman-query.json");
|
||||
# print $fh $query;
|
||||
# close $fh;
|
||||
|
||||
print CHLD_IN $query;
|
||||
close CHLD_IN;
|
||||
my $response = do {local $/; <CHLD_OUT>};
|
||||
|
||||
# Uncomment for debugging the watch response
|
||||
# open ($fh, ">", ".git/watchman-response.json");
|
||||
# print $fh $response;
|
||||
# close $fh;
|
||||
|
||||
die "Watchman: command returned no output.\n" .
|
||||
"Falling back to scanning...\n" if $response eq "";
|
||||
die "Watchman: command returned invalid output: $response\n" .
|
||||
"Falling back to scanning...\n" unless $response =~ /^\{/;
|
||||
|
||||
return $json_pkg->new->utf8->decode($response);
|
||||
}
|
||||
|
||||
sub is_work_tree_watched {
|
||||
my ($output) = @_;
|
||||
my $error = $output->{error};
|
||||
if ($error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
|
||||
my $response = qx/watchman watch "$git_work_tree"/;
|
||||
die "Failed to make watchman watch '$git_work_tree'.\n" .
|
||||
"Falling back to scanning...\n" if $? != 0;
|
||||
$output = $json_pkg->new->utf8->decode($response);
|
||||
$error = $output->{error};
|
||||
die "Watchman: $error.\n" .
|
||||
"Falling back to scanning...\n" if $error;
|
||||
|
||||
# Uncomment for debugging watchman output
|
||||
# open (my $fh, ">", ".git/watchman-output.out");
|
||||
# close $fh;
|
||||
|
||||
# Watchman will always return all files on the first query so
|
||||
# return the fast "everything is dirty" flag to git and do the
|
||||
# Watchman query just to get it over with now so we won't pay
|
||||
# the cost in git to look up each individual file.
|
||||
my $o = watchman_clock();
|
||||
$error = $o->{error};
|
||||
|
||||
die "Watchman: $error.\n" .
|
||||
"Falling back to scanning...\n" if $error;
|
||||
|
||||
output_result($o->{clock}, ("/"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
die "Watchman: $error.\n" .
|
||||
"Falling back to scanning...\n" if $error;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub get_working_dir {
|
||||
my $working_dir;
|
||||
if ($^O =~ 'msys' || $^O =~ 'cygwin') {
|
||||
$working_dir = Win32::GetCwd();
|
||||
$working_dir =~ tr/\\/\//;
|
||||
} else {
|
||||
require Cwd;
|
||||
$working_dir = Cwd::cwd();
|
||||
}
|
||||
|
||||
return $working_dir;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to prepare a packed repository for use over
|
||||
# dumb transports.
|
||||
#
|
||||
# To enable this hook, rename this file to "post-update".
|
||||
|
||||
exec git update-server-info
|
||||
@@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to verify what is about to be committed
|
||||
# by applypatch from an e-mail message.
|
||||
#
|
||||
# The hook should exit with non-zero status after issuing an
|
||||
# appropriate message if it wants to stop the commit.
|
||||
#
|
||||
# To enable this hook, rename this file to "pre-applypatch".
|
||||
|
||||
. git-sh-setup
|
||||
precommit="$(git rev-parse --git-path hooks/pre-commit)"
|
||||
test -x "$precommit" && exec "$precommit" ${1+"$@"}
|
||||
:
|
||||
@@ -0,0 +1,49 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to verify what is about to be committed.
|
||||
# Called by "git commit" with no arguments. The hook should
|
||||
# exit with non-zero status after issuing an appropriate message if
|
||||
# it wants to stop the commit.
|
||||
#
|
||||
# To enable this hook, rename this file to "pre-commit".
|
||||
|
||||
if git rev-parse --verify HEAD >/dev/null 2>&1
|
||||
then
|
||||
against=HEAD
|
||||
else
|
||||
# Initial commit: diff against an empty tree object
|
||||
against=$(git hash-object -t tree /dev/null)
|
||||
fi
|
||||
|
||||
# If you want to allow non-ASCII filenames set this variable to true.
|
||||
allownonascii=$(git config --type=bool hooks.allownonascii)
|
||||
|
||||
# Redirect output to stderr.
|
||||
exec 1>&2
|
||||
|
||||
# Cross platform projects tend to avoid non-ASCII filenames; prevent
|
||||
# them from being added to the repository. We exploit the fact that the
|
||||
# printable range starts at the space character and ends with tilde.
|
||||
if [ "$allownonascii" != "true" ] &&
|
||||
# Note that the use of brackets around a tr range is ok here, (it's
|
||||
# even required, for portability to Solaris 10's /usr/bin/tr), since
|
||||
# the square bracket bytes happen to fall in the designated range.
|
||||
test $(git diff-index --cached --name-only --diff-filter=A -z $against |
|
||||
LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
|
||||
then
|
||||
cat <<\EOF
|
||||
Error: Attempt to add a non-ASCII file name.
|
||||
|
||||
This can cause problems if you want to work with people on other platforms.
|
||||
|
||||
To be portable it is advisable to rename the file.
|
||||
|
||||
If you know what you are doing you can disable this check using:
|
||||
|
||||
git config hooks.allownonascii true
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# If there are whitespace errors, print the offending file names and fail.
|
||||
exec git diff-index --check --cached $against --
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to verify what is about to be committed.
|
||||
# Called by "git merge" with no arguments. The hook should
|
||||
# exit with non-zero status after issuing an appropriate message to
|
||||
# stderr if it wants to stop the merge commit.
|
||||
#
|
||||
# To enable this hook, rename this file to "pre-merge-commit".
|
||||
|
||||
. git-sh-setup
|
||||
test -x "$GIT_DIR/hooks/pre-commit" &&
|
||||
exec "$GIT_DIR/hooks/pre-commit"
|
||||
:
|
||||
@@ -0,0 +1,53 @@
|
||||
#!/bin/sh
|
||||
|
||||
# An example hook script to verify what is about to be pushed. Called by "git
|
||||
# push" after it has checked the remote status, but before anything has been
|
||||
# pushed. If this script exits with a non-zero status nothing will be pushed.
|
||||
#
|
||||
# This hook is called with the following parameters:
|
||||
#
|
||||
# $1 -- Name of the remote to which the push is being done
|
||||
# $2 -- URL to which the push is being done
|
||||
#
|
||||
# If pushing without using a named remote those arguments will be equal.
|
||||
#
|
||||
# Information about the commits which are being pushed is supplied as lines to
|
||||
# the standard input in the form:
|
||||
#
|
||||
# <local ref> <local oid> <remote ref> <remote oid>
|
||||
#
|
||||
# This sample shows how to prevent push of commits where the log message starts
|
||||
# with "WIP" (work in progress).
|
||||
|
||||
remote="$1"
|
||||
url="$2"
|
||||
|
||||
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
|
||||
|
||||
while read local_ref local_oid remote_ref remote_oid
|
||||
do
|
||||
if test "$local_oid" = "$zero"
|
||||
then
|
||||
# Handle delete
|
||||
:
|
||||
else
|
||||
if test "$remote_oid" = "$zero"
|
||||
then
|
||||
# New branch, examine all commits
|
||||
range="$local_oid"
|
||||
else
|
||||
# Update to existing branch, examine new commits
|
||||
range="$remote_oid..$local_oid"
|
||||
fi
|
||||
|
||||
# Check for WIP commit
|
||||
commit=$(git rev-list -n 1 --grep '^WIP' "$range")
|
||||
if test -n "$commit"
|
||||
then
|
||||
echo >&2 "Found WIP commit in $local_ref, not pushing"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,169 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2006, 2008 Junio C Hamano
|
||||
#
|
||||
# The "pre-rebase" hook is run just before "git rebase" starts doing
|
||||
# its job, and can prevent the command from running by exiting with
|
||||
# non-zero status.
|
||||
#
|
||||
# The hook is called with the following parameters:
|
||||
#
|
||||
# $1 -- the upstream the series was forked from.
|
||||
# $2 -- the branch being rebased (or empty when rebasing the current branch).
|
||||
#
|
||||
# This sample shows how to prevent topic branches that are already
|
||||
# merged to 'next' branch from getting rebased, because allowing it
|
||||
# would result in rebasing already published history.
|
||||
|
||||
publish=next
|
||||
basebranch="$1"
|
||||
if test "$#" = 2
|
||||
then
|
||||
topic="refs/heads/$2"
|
||||
else
|
||||
topic=`git symbolic-ref HEAD` ||
|
||||
exit 0 ;# we do not interrupt rebasing detached HEAD
|
||||
fi
|
||||
|
||||
case "$topic" in
|
||||
refs/heads/??/*)
|
||||
;;
|
||||
*)
|
||||
exit 0 ;# we do not interrupt others.
|
||||
;;
|
||||
esac
|
||||
|
||||
# Now we are dealing with a topic branch being rebased
|
||||
# on top of master. Is it OK to rebase it?
|
||||
|
||||
# Does the topic really exist?
|
||||
git show-ref -q "$topic" || {
|
||||
echo >&2 "No such branch $topic"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Is topic fully merged to master?
|
||||
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
|
||||
if test -z "$not_in_master"
|
||||
then
|
||||
echo >&2 "$topic is fully merged to master; better remove it."
|
||||
exit 1 ;# we could allow it, but there is no point.
|
||||
fi
|
||||
|
||||
# Is topic ever merged to next? If so you should not be rebasing it.
|
||||
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
|
||||
only_next_2=`git rev-list ^master ${publish} | sort`
|
||||
if test "$only_next_1" = "$only_next_2"
|
||||
then
|
||||
not_in_topic=`git rev-list "^$topic" master`
|
||||
if test -z "$not_in_topic"
|
||||
then
|
||||
echo >&2 "$topic is already up to date with master"
|
||||
exit 1 ;# we could allow it, but there is no point.
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
|
||||
/usr/bin/perl -e '
|
||||
my $topic = $ARGV[0];
|
||||
my $msg = "* $topic has commits already merged to public branch:\n";
|
||||
my (%not_in_next) = map {
|
||||
/^([0-9a-f]+) /;
|
||||
($1 => 1);
|
||||
} split(/\n/, $ARGV[1]);
|
||||
for my $elem (map {
|
||||
/^([0-9a-f]+) (.*)$/;
|
||||
[$1 => $2];
|
||||
} split(/\n/, $ARGV[2])) {
|
||||
if (!exists $not_in_next{$elem->[0]}) {
|
||||
if ($msg) {
|
||||
print STDERR $msg;
|
||||
undef $msg;
|
||||
}
|
||||
print STDERR " $elem->[1]\n";
|
||||
}
|
||||
}
|
||||
' "$topic" "$not_in_next" "$not_in_master"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
<<\DOC_END
|
||||
|
||||
This sample hook safeguards topic branches that have been
|
||||
published from being rewound.
|
||||
|
||||
The workflow assumed here is:
|
||||
|
||||
* Once a topic branch forks from "master", "master" is never
|
||||
merged into it again (either directly or indirectly).
|
||||
|
||||
* Once a topic branch is fully cooked and merged into "master",
|
||||
it is deleted. If you need to build on top of it to correct
|
||||
earlier mistakes, a new topic branch is created by forking at
|
||||
the tip of the "master". This is not strictly necessary, but
|
||||
it makes it easier to keep your history simple.
|
||||
|
||||
* Whenever you need to test or publish your changes to topic
|
||||
branches, merge them into "next" branch.
|
||||
|
||||
The script, being an example, hardcodes the publish branch name
|
||||
to be "next", but it is trivial to make it configurable via
|
||||
$GIT_DIR/config mechanism.
|
||||
|
||||
With this workflow, you would want to know:
|
||||
|
||||
(1) ... if a topic branch has ever been merged to "next". Young
|
||||
topic branches can have stupid mistakes you would rather
|
||||
clean up before publishing, and things that have not been
|
||||
merged into other branches can be easily rebased without
|
||||
affecting other people. But once it is published, you would
|
||||
not want to rewind it.
|
||||
|
||||
(2) ... if a topic branch has been fully merged to "master".
|
||||
Then you can delete it. More importantly, you should not
|
||||
build on top of it -- other people may already want to
|
||||
change things related to the topic as patches against your
|
||||
"master", so if you need further changes, it is better to
|
||||
fork the topic (perhaps with the same name) afresh from the
|
||||
tip of "master".
|
||||
|
||||
Let's look at this example:
|
||||
|
||||
o---o---o---o---o---o---o---o---o---o "next"
|
||||
/ / / /
|
||||
/ a---a---b A / /
|
||||
/ / / /
|
||||
/ / c---c---c---c B /
|
||||
/ / / \ /
|
||||
/ / / b---b C \ /
|
||||
/ / / / \ /
|
||||
---o---o---o---o---o---o---o---o---o---o---o "master"
|
||||
|
||||
|
||||
A, B and C are topic branches.
|
||||
|
||||
* A has one fix since it was merged up to "next".
|
||||
|
||||
* B has finished. It has been fully merged up to "master" and "next",
|
||||
and is ready to be deleted.
|
||||
|
||||
* C has not merged to "next" at all.
|
||||
|
||||
We would want to allow C to be rebased, refuse A, and encourage
|
||||
B to be deleted.
|
||||
|
||||
To compute (1):
|
||||
|
||||
git rev-list ^master ^topic next
|
||||
git rev-list ^master next
|
||||
|
||||
if these match, topic has not merged in next at all.
|
||||
|
||||
To compute (2):
|
||||
|
||||
git rev-list master..topic
|
||||
|
||||
if this is empty, it is fully merged to "master".
|
||||
|
||||
DOC_END
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to make use of push options.
|
||||
# The example simply echoes all push options that start with 'echoback='
|
||||
# and rejects all pushes when the "reject" push option is used.
|
||||
#
|
||||
# To enable this hook, rename this file to "pre-receive".
|
||||
|
||||
if test -n "$GIT_PUSH_OPTION_COUNT"
|
||||
then
|
||||
i=0
|
||||
while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
|
||||
do
|
||||
eval "value=\$GIT_PUSH_OPTION_$i"
|
||||
case "$value" in
|
||||
echoback=*)
|
||||
echo "echo from the pre-receive-hook: ${value#*=}" >&2
|
||||
;;
|
||||
reject)
|
||||
exit 1
|
||||
esac
|
||||
i=$((i + 1))
|
||||
done
|
||||
fi
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to prepare the commit log message.
|
||||
# Called by "git commit" with the name of the file that has the
|
||||
# commit message, followed by the description of the commit
|
||||
# message's source. The hook's purpose is to edit the commit
|
||||
# message file. If the hook fails with a non-zero status,
|
||||
# the commit is aborted.
|
||||
#
|
||||
# To enable this hook, rename this file to "prepare-commit-msg".
|
||||
|
||||
# This hook includes three examples. The first one removes the
|
||||
# "# Please enter the commit message..." help message.
|
||||
#
|
||||
# The second includes the output of "git diff --name-status -r"
|
||||
# into the message, just before the "git status" output. It is
|
||||
# commented because it doesn't cope with --amend or with squashed
|
||||
# commits.
|
||||
#
|
||||
# The third example adds a Signed-off-by line to the message, that can
|
||||
# still be edited. This is rarely a good idea.
|
||||
|
||||
COMMIT_MSG_FILE=$1
|
||||
COMMIT_SOURCE=$2
|
||||
SHA1=$3
|
||||
|
||||
/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
|
||||
|
||||
# case "$COMMIT_SOURCE,$SHA1" in
|
||||
# ,|template,)
|
||||
# /usr/bin/perl -i.bak -pe '
|
||||
# print "\n" . `git diff --cached --name-status -r`
|
||||
# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
|
||||
# *) ;;
|
||||
# esac
|
||||
|
||||
# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
||||
# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
|
||||
# if test -z "$COMMIT_SOURCE"
|
||||
# then
|
||||
# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
|
||||
# fi
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
#!/bin/sh
|
||||
|
||||
# An example hook script to update a checked-out tree on a git push.
|
||||
#
|
||||
# This hook is invoked by git-receive-pack(1) when it reacts to git
|
||||
# push and updates reference(s) in its repository, and when the push
|
||||
# tries to update the branch that is currently checked out and the
|
||||
# receive.denyCurrentBranch configuration variable is set to
|
||||
# updateInstead.
|
||||
#
|
||||
# By default, such a push is refused if the working tree and the index
|
||||
# of the remote repository has any difference from the currently
|
||||
# checked out commit; when both the working tree and the index match
|
||||
# the current commit, they are updated to match the newly pushed tip
|
||||
# of the branch. This hook is to be used to override the default
|
||||
# behaviour; however the code below reimplements the default behaviour
|
||||
# as a starting point for convenient modification.
|
||||
#
|
||||
# The hook receives the commit with which the tip of the current
|
||||
# branch is going to be updated:
|
||||
commit=$1
|
||||
|
||||
# It can exit with a non-zero status to refuse the push (when it does
|
||||
# so, it must not modify the index or the working tree).
|
||||
die () {
|
||||
echo >&2 "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Or it can make any necessary changes to the working tree and to the
|
||||
# index to bring them to the desired state when the tip of the current
|
||||
# branch is updated to the new commit, and exit with a zero status.
|
||||
#
|
||||
# For example, the hook can simply run git read-tree -u -m HEAD "$1"
|
||||
# in order to emulate git fetch that is run in the reverse direction
|
||||
# with git push, as the two-tree form of git read-tree -u -m is
|
||||
# essentially the same as git switch or git checkout that switches
|
||||
# branches while keeping the local changes in the working tree that do
|
||||
# not interfere with the difference between the branches.
|
||||
|
||||
# The below is a more-or-less exact translation to shell of the C code
|
||||
# for the default behaviour for git's push-to-checkout hook defined in
|
||||
# the push_to_deploy() function in builtin/receive-pack.c.
|
||||
#
|
||||
# Note that the hook will be executed from the repository directory,
|
||||
# not from the working tree, so if you want to perform operations on
|
||||
# the working tree, you will have to adapt your code accordingly, e.g.
|
||||
# by adding "cd .." or using relative paths.
|
||||
|
||||
if ! git update-index -q --ignore-submodules --refresh
|
||||
then
|
||||
die "Up-to-date check failed"
|
||||
fi
|
||||
|
||||
if ! git diff-files --quiet --ignore-submodules --
|
||||
then
|
||||
die "Working directory has unstaged changes"
|
||||
fi
|
||||
|
||||
# This is a rough translation of:
|
||||
#
|
||||
# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
|
||||
if git cat-file -e HEAD 2>/dev/null
|
||||
then
|
||||
head=HEAD
|
||||
else
|
||||
head=$(git hash-object -t tree --stdin </dev/null)
|
||||
fi
|
||||
|
||||
if ! git diff-index --quiet --cached --ignore-submodules $head --
|
||||
then
|
||||
die "Working directory has staged changes"
|
||||
fi
|
||||
|
||||
if ! git read-tree -u -m "$commit"
|
||||
then
|
||||
die "Could not update working tree to new HEAD"
|
||||
fi
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
#!/bin/sh
|
||||
|
||||
# An example hook script to validate a patch (and/or patch series) before
|
||||
# sending it via email.
|
||||
#
|
||||
# The hook should exit with non-zero status after issuing an appropriate
|
||||
# message if it wants to prevent the email(s) from being sent.
|
||||
#
|
||||
# To enable this hook, rename this file to "sendemail-validate".
|
||||
#
|
||||
# By default, it will only check that the patch(es) can be applied on top of
|
||||
# the default upstream branch without conflicts in a secondary worktree. After
|
||||
# validation (successful or not) of the last patch of a series, the worktree
|
||||
# will be deleted.
|
||||
#
|
||||
# The following config variables can be set to change the default remote and
|
||||
# remote ref that are used to apply the patches against:
|
||||
#
|
||||
# sendemail.validateRemote (default: origin)
|
||||
# sendemail.validateRemoteRef (default: HEAD)
|
||||
#
|
||||
# Replace the TODO placeholders with appropriate checks according to your
|
||||
# needs.
|
||||
|
||||
validate_cover_letter () {
|
||||
file="$1"
|
||||
# TODO: Replace with appropriate checks (e.g. spell checking).
|
||||
true
|
||||
}
|
||||
|
||||
validate_patch () {
|
||||
file="$1"
|
||||
# Ensure that the patch applies without conflicts.
|
||||
git am -3 "$file" || return
|
||||
# TODO: Replace with appropriate checks for this patch
|
||||
# (e.g. checkpatch.pl).
|
||||
true
|
||||
}
|
||||
|
||||
validate_series () {
|
||||
# TODO: Replace with appropriate checks for the whole series
|
||||
# (e.g. quick build, coding style checks, etc.).
|
||||
true
|
||||
}
|
||||
|
||||
# main -------------------------------------------------------------------------
|
||||
|
||||
if test "$GIT_SENDEMAIL_FILE_COUNTER" = 1
|
||||
then
|
||||
remote=$(git config --default origin --get sendemail.validateRemote) &&
|
||||
ref=$(git config --default HEAD --get sendemail.validateRemoteRef) &&
|
||||
worktree=$(mktemp --tmpdir -d sendemail-validate.XXXXXXX) &&
|
||||
git worktree add -fd --checkout "$worktree" "refs/remotes/$remote/$ref" &&
|
||||
git config --replace-all sendemail.validateWorktree "$worktree"
|
||||
else
|
||||
worktree=$(git config --get sendemail.validateWorktree)
|
||||
fi || {
|
||||
echo "sendemail-validate: error: failed to prepare worktree" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
unset GIT_DIR GIT_WORK_TREE
|
||||
cd "$worktree" &&
|
||||
|
||||
if grep -q "^diff --git " "$1"
|
||||
then
|
||||
validate_patch "$1"
|
||||
else
|
||||
validate_cover_letter "$1"
|
||||
fi &&
|
||||
|
||||
if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL"
|
||||
then
|
||||
git config --unset-all sendemail.validateWorktree &&
|
||||
trap 'git worktree remove -ff "$worktree"' EXIT &&
|
||||
validate_series
|
||||
fi
|
||||
@@ -0,0 +1,128 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to block unannotated tags from entering.
|
||||
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
|
||||
#
|
||||
# To enable this hook, rename this file to "update".
|
||||
#
|
||||
# Config
|
||||
# ------
|
||||
# hooks.allowunannotated
|
||||
# This boolean sets whether unannotated tags will be allowed into the
|
||||
# repository. By default they won't be.
|
||||
# hooks.allowdeletetag
|
||||
# This boolean sets whether deleting tags will be allowed in the
|
||||
# repository. By default they won't be.
|
||||
# hooks.allowmodifytag
|
||||
# This boolean sets whether a tag may be modified after creation. By default
|
||||
# it won't be.
|
||||
# hooks.allowdeletebranch
|
||||
# This boolean sets whether deleting branches will be allowed in the
|
||||
# repository. By default they won't be.
|
||||
# hooks.denycreatebranch
|
||||
# This boolean sets whether remotely creating branches will be denied
|
||||
# in the repository. By default this is allowed.
|
||||
#
|
||||
|
||||
# --- Command line
|
||||
refname="$1"
|
||||
oldrev="$2"
|
||||
newrev="$3"
|
||||
|
||||
# --- Safety check
|
||||
if [ -z "$GIT_DIR" ]; then
|
||||
echo "Don't run this script from the command line." >&2
|
||||
echo " (if you want, you could supply GIT_DIR then run" >&2
|
||||
echo " $0 <ref> <oldrev> <newrev>)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
|
||||
echo "usage: $0 <ref> <oldrev> <newrev>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Config
|
||||
allowunannotated=$(git config --type=bool hooks.allowunannotated)
|
||||
allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
|
||||
denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
|
||||
allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
|
||||
allowmodifytag=$(git config --type=bool hooks.allowmodifytag)
|
||||
|
||||
# check for no description
|
||||
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
|
||||
case "$projectdesc" in
|
||||
"Unnamed repository"* | "")
|
||||
echo "*** Project description file hasn't been set" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# --- Check types
|
||||
# if $newrev is 0000...0000, it's a commit to delete a ref.
|
||||
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
|
||||
if [ "$newrev" = "$zero" ]; then
|
||||
newrev_type=delete
|
||||
else
|
||||
newrev_type=$(git cat-file -t $newrev)
|
||||
fi
|
||||
|
||||
case "$refname","$newrev_type" in
|
||||
refs/tags/*,commit)
|
||||
# un-annotated tag
|
||||
short_refname=${refname##refs/tags/}
|
||||
if [ "$allowunannotated" != "true" ]; then
|
||||
echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
|
||||
echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
refs/tags/*,delete)
|
||||
# delete tag
|
||||
if [ "$allowdeletetag" != "true" ]; then
|
||||
echo "*** Deleting a tag is not allowed in this repository" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
refs/tags/*,tag)
|
||||
# annotated tag
|
||||
if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
|
||||
then
|
||||
echo "*** Tag '$refname' already exists." >&2
|
||||
echo "*** Modifying a tag is not allowed in this repository." >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
refs/heads/*,commit)
|
||||
# branch
|
||||
if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
|
||||
echo "*** Creating a branch is not allowed in this repository" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
refs/heads/*,delete)
|
||||
# delete branch
|
||||
if [ "$allowdeletebranch" != "true" ]; then
|
||||
echo "*** Deleting a branch is not allowed in this repository" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
refs/remotes/*,commit)
|
||||
# tracking branch
|
||||
;;
|
||||
refs/remotes/*,delete)
|
||||
# delete tracking branch
|
||||
if [ "$allowdeletebranch" != "true" ]; then
|
||||
echo "*** Deleting a tracking branch is not allowed in this repository" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
# Anything else (is there anything else?)
|
||||
echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# --- Finished
|
||||
exit 0
|
||||
@@ -0,0 +1 @@
|
||||
* -export-subst -export-ignore
|
||||
@@ -0,0 +1,6 @@
|
||||
# git ls-files --others --exclude-from=.git/info/exclude
|
||||
# Lines that start with '#' are comments.
|
||||
# For a project mostly in C, the following would be a good set of
|
||||
# exclude patterns (uncomment them if you want to use them):
|
||||
# *.[oa]
|
||||
# *~
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -0,0 +1,2 @@
|
||||
# pack-refs with: peeled fully-peeled sorted
|
||||
e8c6e58b1306119e51297b02f0b449fa7300416d refs/heads/master
|
||||
+1
Submodule localrepo/end4-pkgbuilds/microtex-git/src/MicroTeX added at f1dc9f74bb
@@ -1,4 +1,4 @@
|
||||
_commit='7511545ee20664e3b8b8d3322c0ffe7567c56f7a'
|
||||
_commit='11ca60be22b063478ed9586ca1d7f92f0f261caf'
|
||||
# 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=8
|
||||
pkgrel=9
|
||||
pkgdesc="$_pkgname-git pinned commit and extra deps for $_prefix"
|
||||
arch=(x86_64 aarch64)
|
||||
url='https://git.outfoxxed.me/quickshell/quickshell'
|
||||
|
||||
+2913
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,52 @@
|
||||
# Generated by makepkg 7.1.0
|
||||
# using fakeroot version 1.37.2
|
||||
pkgname = illogical-impulse-quickshell-git
|
||||
pkgbase = illogical-impulse-quickshell-git
|
||||
xdata = pkgtype=pkg
|
||||
pkgver = 0.1.0.r1-9
|
||||
pkgdesc = quickshell-git pinned commit and extra deps for illogical-impulse
|
||||
url = https://git.outfoxxed.me/quickshell/quickshell
|
||||
builddate = 1791439825
|
||||
packager = Unknown Packager
|
||||
size = 198896342
|
||||
arch = x86_64
|
||||
license = LGPL-3.0-only
|
||||
group = illogical-impulse
|
||||
conflict = quickshell
|
||||
conflict = quickshell-git
|
||||
provides = quickshell
|
||||
provides = quickshell-git
|
||||
depend = cpptrace
|
||||
depend = jemalloc
|
||||
depend = mesa
|
||||
depend = qt6-declarative
|
||||
depend = qt6-base
|
||||
depend = qt6-svg
|
||||
depend = libdrm
|
||||
depend = libpipewire
|
||||
depend = libxcb
|
||||
depend = wayland
|
||||
depend = qt6-5compat
|
||||
depend = qt6-avif-image-plugin
|
||||
depend = qt6-imageformats
|
||||
depend = qt6-multimedia
|
||||
depend = qt6-positioning
|
||||
depend = qt6-quicktimeline
|
||||
depend = qt6-sensors
|
||||
depend = qt6-svg
|
||||
depend = qt6-tools
|
||||
depend = qt6-translations
|
||||
depend = qt6-virtualkeyboard
|
||||
depend = qt6-wayland
|
||||
depend = kirigami
|
||||
depend = kdialog
|
||||
depend = syntax-highlighting
|
||||
makedepend = cli11
|
||||
makedepend = cmake
|
||||
makedepend = git
|
||||
makedepend = ninja
|
||||
makedepend = qt6-shadertools
|
||||
makedepend = spirv-tools
|
||||
makedepend = vulkan-headers
|
||||
makedepend = wayland
|
||||
makedepend = wayland-protocols
|
||||
+1
@@ -0,0 +1 @@
|
||||
/usr/bin/quickshell
|
||||
Executable
BIN
Binary file not shown.
+8
@@ -0,0 +1,8 @@
|
||||
module Quickshell.Bluetooth
|
||||
linktarget quickshell-bluetoothplugin
|
||||
optional plugin quickshell-bluetoothplugin
|
||||
classname Quickshell_BluetoothPlugin
|
||||
typeinfo quickshell-bluetooth.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Bluetooth/
|
||||
|
||||
+411
@@ -0,0 +1,411 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "adapter.hpp"
|
||||
lineNumber: 57
|
||||
name: "qs::bluetooth::BluetoothAdapter"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Bluetooth/BluetoothAdapter 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
bindable: "bindableName"
|
||||
read: "default"
|
||||
notify: "nameChanged"
|
||||
index: 0
|
||||
lineNumber: 63
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "enabled"
|
||||
type: "bool"
|
||||
read: "enabled"
|
||||
write: "setEnabled"
|
||||
notify: "enabledChanged"
|
||||
index: 1
|
||||
lineNumber: 65
|
||||
}
|
||||
Property {
|
||||
name: "state"
|
||||
type: "BluetoothAdapterState::Enum"
|
||||
bindable: "bindableState"
|
||||
read: "default"
|
||||
notify: "stateChanged"
|
||||
index: 2
|
||||
lineNumber: 67
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "discoverable"
|
||||
type: "bool"
|
||||
read: "discoverable"
|
||||
write: "setDiscoverable"
|
||||
notify: "discoverableChanged"
|
||||
index: 3
|
||||
lineNumber: 69
|
||||
}
|
||||
Property {
|
||||
name: "discoverableTimeout"
|
||||
type: "uint"
|
||||
read: "discoverableTimeout"
|
||||
write: "setDiscoverableTimeout"
|
||||
notify: "discoverableTimeoutChanged"
|
||||
index: 4
|
||||
lineNumber: 72
|
||||
}
|
||||
Property {
|
||||
name: "discovering"
|
||||
type: "bool"
|
||||
read: "discovering"
|
||||
write: "setDiscovering"
|
||||
notify: "discoveringChanged"
|
||||
index: 5
|
||||
lineNumber: 74
|
||||
}
|
||||
Property {
|
||||
name: "pairable"
|
||||
type: "bool"
|
||||
read: "pairable"
|
||||
write: "setPairable"
|
||||
notify: "pairableChanged"
|
||||
index: 6
|
||||
lineNumber: 79
|
||||
}
|
||||
Property {
|
||||
name: "pairableTimeout"
|
||||
type: "uint"
|
||||
read: "pairableTimeout"
|
||||
write: "setPairableTimeout"
|
||||
notify: "pairableTimeoutChanged"
|
||||
index: 7
|
||||
lineNumber: 82
|
||||
}
|
||||
Property {
|
||||
name: "devices"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "devices"
|
||||
index: 8
|
||||
lineNumber: 85
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "adapterId"
|
||||
type: "QString"
|
||||
read: "adapterId"
|
||||
index: 9
|
||||
lineNumber: 87
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "dbusPath"
|
||||
type: "QString"
|
||||
read: "path"
|
||||
index: 10
|
||||
lineNumber: 89
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Signal { name: "nameChanged"; lineNumber: 136 }
|
||||
Signal { name: "enabledChanged"; lineNumber: 137 }
|
||||
Signal { name: "stateChanged"; lineNumber: 138 }
|
||||
Signal { name: "discoverableChanged"; lineNumber: 139 }
|
||||
Signal { name: "discoverableTimeoutChanged"; lineNumber: 140 }
|
||||
Signal { name: "discoveringChanged"; lineNumber: 141 }
|
||||
Signal { name: "pairableChanged"; lineNumber: 142 }
|
||||
Signal { name: "pairableTimeoutChanged"; lineNumber: 143 }
|
||||
}
|
||||
Component {
|
||||
file: "adapter.hpp"
|
||||
lineNumber: 15
|
||||
name: "qs::bluetooth::BluetoothAdapterState"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Bluetooth/BluetoothAdapterState 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 21
|
||||
values: [
|
||||
"Disabled",
|
||||
"Enabled",
|
||||
"Enabling",
|
||||
"Disabling",
|
||||
"Blocked"
|
||||
]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 35
|
||||
Parameter { name: "state"; type: "BluetoothAdapterState::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "device.hpp"
|
||||
lineNumber: 55
|
||||
name: "qs::bluetooth::BluetoothDevice"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Bluetooth/BluetoothDevice 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "address"
|
||||
type: "QString"
|
||||
bindable: "bindableAddress"
|
||||
read: "default"
|
||||
notify: "addressChanged"
|
||||
index: 0
|
||||
lineNumber: 61
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
read: "name"
|
||||
write: "setName"
|
||||
notify: "nameChanged"
|
||||
index: 1
|
||||
lineNumber: 66
|
||||
}
|
||||
Property {
|
||||
name: "deviceName"
|
||||
type: "QString"
|
||||
bindable: "bindableDeviceName"
|
||||
read: "default"
|
||||
notify: "deviceNameChanged"
|
||||
index: 2
|
||||
lineNumber: 69
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "icon"
|
||||
type: "QString"
|
||||
bindable: "bindableIcon"
|
||||
read: "default"
|
||||
notify: "iconChanged"
|
||||
index: 3
|
||||
lineNumber: 71
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "state"
|
||||
type: "BluetoothDeviceState::Enum"
|
||||
bindable: "bindableState"
|
||||
read: "default"
|
||||
notify: "stateChanged"
|
||||
index: 4
|
||||
lineNumber: 73
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "connected"
|
||||
type: "bool"
|
||||
read: "connected"
|
||||
write: "setConnected"
|
||||
notify: "connectedChanged"
|
||||
index: 5
|
||||
lineNumber: 79
|
||||
}
|
||||
Property {
|
||||
name: "paired"
|
||||
type: "bool"
|
||||
bindable: "bindablePaired"
|
||||
read: "default"
|
||||
notify: "pairedChanged"
|
||||
index: 6
|
||||
lineNumber: 83
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "bonded"
|
||||
type: "bool"
|
||||
bindable: "bindableBonded"
|
||||
read: "default"
|
||||
notify: "bondedChanged"
|
||||
index: 7
|
||||
lineNumber: 85
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "pairing"
|
||||
type: "bool"
|
||||
read: "pairing"
|
||||
notify: "pairingChanged"
|
||||
index: 8
|
||||
lineNumber: 89
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "trusted"
|
||||
type: "bool"
|
||||
read: "trusted"
|
||||
write: "setTrusted"
|
||||
notify: "trustedChanged"
|
||||
index: 9
|
||||
lineNumber: 92
|
||||
}
|
||||
Property {
|
||||
name: "blocked"
|
||||
type: "bool"
|
||||
read: "blocked"
|
||||
write: "setBlocked"
|
||||
notify: "blockedChanged"
|
||||
index: 10
|
||||
lineNumber: 95
|
||||
}
|
||||
Property {
|
||||
name: "wakeAllowed"
|
||||
type: "bool"
|
||||
read: "wakeAllowed"
|
||||
write: "setWakeAllowed"
|
||||
notify: "wakeAllowedChanged"
|
||||
index: 11
|
||||
lineNumber: 97
|
||||
}
|
||||
Property {
|
||||
name: "batteryAvailable"
|
||||
type: "bool"
|
||||
read: "batteryAvailable"
|
||||
notify: "batteryAvailableChanged"
|
||||
index: 12
|
||||
lineNumber: 99
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "battery"
|
||||
type: "double"
|
||||
bindable: "bindableBattery"
|
||||
read: "default"
|
||||
notify: "batteryChanged"
|
||||
index: 13
|
||||
lineNumber: 101
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "adapter"
|
||||
type: "BluetoothAdapter"
|
||||
isPointer: true
|
||||
read: "adapter"
|
||||
notify: "adapterChanged"
|
||||
index: 14
|
||||
lineNumber: 103
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "dbusPath"
|
||||
type: "QString"
|
||||
read: "path"
|
||||
index: 15
|
||||
lineNumber: 105
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Signal { name: "addressChanged"; lineNumber: 167 }
|
||||
Signal { name: "deviceNameChanged"; lineNumber: 168 }
|
||||
Signal { name: "nameChanged"; lineNumber: 169 }
|
||||
Signal { name: "connectedChanged"; lineNumber: 170 }
|
||||
Signal { name: "stateChanged"; lineNumber: 171 }
|
||||
Signal { name: "pairedChanged"; lineNumber: 172 }
|
||||
Signal { name: "bondedChanged"; lineNumber: 173 }
|
||||
Signal { name: "pairingChanged"; lineNumber: 174 }
|
||||
Signal { name: "trustedChanged"; lineNumber: 175 }
|
||||
Signal { name: "blockedChanged"; lineNumber: 176 }
|
||||
Signal { name: "wakeAllowedChanged"; lineNumber: 177 }
|
||||
Signal { name: "iconChanged"; lineNumber: 178 }
|
||||
Signal { name: "batteryAvailableChanged"; lineNumber: 179 }
|
||||
Signal { name: "batteryChanged"; lineNumber: 180 }
|
||||
Signal { name: "adapterChanged"; lineNumber: 181 }
|
||||
Method { name: "connect"; lineNumber: 112 }
|
||||
Method { name: "disconnect"; lineNumber: 114 }
|
||||
Method { name: "pair"; lineNumber: 118 }
|
||||
Method { name: "cancelPair"; lineNumber: 120 }
|
||||
Method { name: "forget"; lineNumber: 122 }
|
||||
}
|
||||
Component {
|
||||
file: "device.hpp"
|
||||
lineNumber: 14
|
||||
name: "qs::bluetooth::BluetoothDeviceState"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Bluetooth/BluetoothDeviceState 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 20
|
||||
values: [
|
||||
"Disconnected",
|
||||
"Connected",
|
||||
"Disconnecting",
|
||||
"Connecting"
|
||||
]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 32
|
||||
Parameter { name: "state"; type: "BluetoothDeviceState::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "bluez.hpp"
|
||||
lineNumber: 63
|
||||
name: "qs::bluetooth::BluezQml"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Bluetooth/Bluetooth 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "defaultAdapter"
|
||||
type: "BluetoothAdapter"
|
||||
isPointer: true
|
||||
bindable: "bindableDefaultAdapter"
|
||||
read: "default"
|
||||
notify: "defaultAdapterChanged"
|
||||
index: 0
|
||||
lineNumber: 69
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "adapters"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "adapters"
|
||||
index: 1
|
||||
lineNumber: 72
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "devices"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "devices"
|
||||
index: 2
|
||||
lineNumber: 76
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Signal { name: "defaultAdapterChanged"; lineNumber: 80 }
|
||||
}
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
module Quickshell.DBusMenu
|
||||
linktarget quickshell-dbusmenuplugin
|
||||
optional plugin quickshell-dbusmenuplugin
|
||||
classname Quickshell_DBusMenuPlugin
|
||||
typeinfo quickshell-dbusmenu.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/DBusMenu/
|
||||
depends Quickshell
|
||||
depends QtQuick
|
||||
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "dbusmenu.hpp"
|
||||
lineNumber: 118
|
||||
name: "qs::dbus::dbusmenu::DBusMenu"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.DBusMenu/DBusMenuHandle 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "menu"
|
||||
type: "qs::dbus::dbusmenu::DBusMenuItem"
|
||||
isPointer: true
|
||||
read: "menu"
|
||||
index: 0
|
||||
lineNumber: 120
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Signal { name: "iconThemePathChanged"; lineNumber: 130 }
|
||||
Method {
|
||||
name: "onLayoutUpdated"
|
||||
lineNumber: 146
|
||||
Parameter { name: "revision"; type: "uint" }
|
||||
Parameter { name: "parent"; type: "int" }
|
||||
}
|
||||
Method {
|
||||
name: "onItemPropertiesUpdated"
|
||||
lineNumber: 147
|
||||
Parameter { name: "updatedProps"; type: "DBusMenuItemPropertiesList" }
|
||||
Parameter { name: "removedProps"; type: "DBusMenuItemPropertyNamesList" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "dbusmenu.hpp"
|
||||
lineNumber: 48
|
||||
name: "qs::dbus::dbusmenu::DBusMenuItem"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QsMenuEntry"
|
||||
exports: ["Quickshell.DBusMenu/DBusMenuItem 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "menuHandle"
|
||||
type: "qs::dbus::dbusmenu::DBusMenu"
|
||||
isPointer: true
|
||||
read: "menuHandle"
|
||||
index: 0
|
||||
lineNumber: 51
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Signal { name: "layoutUpdated"; lineNumber: 92 }
|
||||
Method { name: "sendOpened"; isMethodConstant: true; lineNumber: 95 }
|
||||
Method { name: "sendClosed"; isMethodConstant: true; lineNumber: 96 }
|
||||
Method { name: "sendTriggered"; isMethodConstant: true; lineNumber: 97 }
|
||||
Method { name: "updateLayout"; isMethodConstant: true; lineNumber: 64 }
|
||||
}
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
module Quickshell.Hyprland._FocusGrab
|
||||
linktarget quickshell-hyprland-focus-grabplugin
|
||||
optional plugin quickshell-hyprland-focus-grabplugin
|
||||
classname Quickshell_Hyprland__FocusGrabPlugin
|
||||
typeinfo quickshell-hyprland-focus-grab.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Hyprland/_FocusGrab/
|
||||
depends Quickshell
|
||||
depends QtQuick
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 55
|
||||
name: "qs::hyprland::HyprlandFocusGrab"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
interfaces: ["QQmlParserStatus"]
|
||||
exports: ["Quickshell.Hyprland._FocusGrab/HyprlandFocusGrab 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "active"
|
||||
type: "bool"
|
||||
read: "isActive"
|
||||
write: "setActive"
|
||||
notify: "activeChanged"
|
||||
index: 0
|
||||
lineNumber: 68
|
||||
}
|
||||
Property {
|
||||
name: "windows"
|
||||
type: "QObjectList"
|
||||
read: "windows"
|
||||
write: "setWindows"
|
||||
notify: "windowsChanged"
|
||||
index: 1
|
||||
lineNumber: 70
|
||||
}
|
||||
Signal { name: "cleared"; lineNumber: 90 }
|
||||
Signal { name: "activeChanged"; lineNumber: 92 }
|
||||
Signal { name: "windowsChanged"; lineNumber: 93 }
|
||||
Method { name: "onGrabActivated"; lineNumber: 96 }
|
||||
Method { name: "onGrabCleared"; lineNumber: 97 }
|
||||
Method { name: "onProxyConnected"; lineNumber: 98 }
|
||||
Method {
|
||||
name: "onObjectDestroyed"
|
||||
lineNumber: 99
|
||||
Parameter { name: "object"; type: "QObject"; isPointer: true }
|
||||
}
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
module Quickshell.Hyprland._GlobalShortcuts
|
||||
linktarget quickshell-hyprland-global-shortcutsplugin
|
||||
optional plugin quickshell-hyprland-global-shortcutsplugin
|
||||
classname Quickshell_Hyprland__GlobalShortcutsPlugin
|
||||
typeinfo quickshell-hyprland-global-shortcuts.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Hyprland/_GlobalShortcuts/
|
||||
depends QtQuick
|
||||
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 35
|
||||
name: "qs::hyprland::global_shortcuts::GlobalShortcut"
|
||||
accessSemantics: "reference"
|
||||
prototype: "PostReloadHook"
|
||||
exports: ["Quickshell.Hyprland._GlobalShortcuts/GlobalShortcut 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "pressed"
|
||||
type: "bool"
|
||||
read: "isPressed"
|
||||
notify: "pressedChanged"
|
||||
index: 0
|
||||
lineNumber: 41
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "appid"
|
||||
type: "QString"
|
||||
read: "appid"
|
||||
write: "setAppid"
|
||||
notify: "appidChanged"
|
||||
index: 1
|
||||
lineNumber: 47
|
||||
}
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
read: "name"
|
||||
write: "setName"
|
||||
notify: "nameChanged"
|
||||
index: 2
|
||||
lineNumber: 50
|
||||
}
|
||||
Property {
|
||||
name: "description"
|
||||
type: "QString"
|
||||
read: "description"
|
||||
write: "setDescription"
|
||||
notify: "descriptionChanged"
|
||||
index: 3
|
||||
lineNumber: 53
|
||||
}
|
||||
Property {
|
||||
name: "triggerDescription"
|
||||
type: "QString"
|
||||
read: "triggerDescription"
|
||||
write: "setTriggerDescription"
|
||||
notify: "triggerDescriptionChanged"
|
||||
index: 4
|
||||
lineNumber: 55
|
||||
}
|
||||
Signal { name: "pressed"; lineNumber: 82 }
|
||||
Signal { name: "released"; lineNumber: 84 }
|
||||
Signal { name: "pressedChanged"; lineNumber: 86 }
|
||||
Signal { name: "appidChanged"; lineNumber: 87 }
|
||||
Signal { name: "nameChanged"; lineNumber: 88 }
|
||||
Signal { name: "descriptionChanged"; lineNumber: 89 }
|
||||
Signal { name: "triggerDescriptionChanged"; lineNumber: 90 }
|
||||
Method { name: "onPressed"; lineNumber: 93 }
|
||||
Method { name: "onReleased"; lineNumber: 94 }
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
module Quickshell.Hyprland._Ipc
|
||||
linktarget quickshell-hyprland-ipcplugin
|
||||
optional plugin quickshell-hyprland-ipcplugin
|
||||
classname Quickshell_Hyprland__IpcPlugin
|
||||
typeinfo quickshell-hyprland-ipc.qmltypes
|
||||
depends QtQuick
|
||||
prefer :/qt/qml/Quickshell/Hyprland/_Ipc/
|
||||
depends Quickshell
|
||||
|
||||
+538
@@ -0,0 +1,538 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "connection.hpp"
|
||||
lineNumber: 40
|
||||
name: "qs::hyprland::ipc::HyprlandIpcEvent"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Hyprland._Ipc/HyprlandEvent 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
read: "nameStr"
|
||||
index: 0
|
||||
lineNumber: 45
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "data"
|
||||
type: "QString"
|
||||
read: "dataStr"
|
||||
index: 1
|
||||
lineNumber: 47
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Method {
|
||||
name: "parse"
|
||||
type: "QString"
|
||||
isList: true
|
||||
isMethodConstant: true
|
||||
lineNumber: 58
|
||||
Parameter { name: "argumentCount"; type: "int" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 16
|
||||
name: "qs::hyprland::ipc::HyprlandIpcQml"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Hyprland._Ipc/Hyprland 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "usingLua"
|
||||
type: "bool"
|
||||
bindable: "bindableUsingLua"
|
||||
read: "default"
|
||||
notify: "usingLuaChanged"
|
||||
index: 0
|
||||
lineNumber: 22
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "requestSocketPath"
|
||||
type: "QString"
|
||||
read: "requestSocketPath"
|
||||
index: 1
|
||||
lineNumber: 24
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "eventSocketPath"
|
||||
type: "QString"
|
||||
read: "eventSocketPath"
|
||||
index: 2
|
||||
lineNumber: 26
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "focusedMonitor"
|
||||
type: "qs::hyprland::ipc::HyprlandMonitor"
|
||||
isPointer: true
|
||||
bindable: "bindableFocusedMonitor"
|
||||
read: "default"
|
||||
notify: "focusedMonitorChanged"
|
||||
index: 3
|
||||
lineNumber: 28
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "focusedWorkspace"
|
||||
type: "qs::hyprland::ipc::HyprlandWorkspace"
|
||||
isPointer: true
|
||||
bindable: "bindableFocusedWorkspace"
|
||||
read: "default"
|
||||
notify: "focusedWorkspaceChanged"
|
||||
index: 4
|
||||
lineNumber: 30
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "activeToplevel"
|
||||
type: "qs::hyprland::ipc::HyprlandToplevel"
|
||||
isPointer: true
|
||||
bindable: "bindableActiveToplevel"
|
||||
read: "default"
|
||||
notify: "activeToplevelChanged"
|
||||
index: 5
|
||||
lineNumber: 32
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "monitors"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "monitors"
|
||||
index: 6
|
||||
lineNumber: 35
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "workspaces"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "workspaces"
|
||||
index: 7
|
||||
lineNumber: 40
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "toplevels"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "toplevels"
|
||||
index: 8
|
||||
lineNumber: 43
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Signal {
|
||||
name: "rawEvent"
|
||||
lineNumber: 89
|
||||
Parameter { name: "event"; type: "qs::hyprland::ipc::HyprlandIpcEvent"; isPointer: true }
|
||||
}
|
||||
Signal { name: "usingLuaChanged"; lineNumber: 91 }
|
||||
Signal { name: "focusedMonitorChanged"; lineNumber: 92 }
|
||||
Signal { name: "focusedWorkspaceChanged"; lineNumber: 93 }
|
||||
Signal { name: "activeToplevelChanged"; lineNumber: 94 }
|
||||
Method {
|
||||
name: "dispatch"
|
||||
lineNumber: 52
|
||||
Parameter { name: "request"; type: "QString" }
|
||||
}
|
||||
Method {
|
||||
name: "monitorFor"
|
||||
type: "HyprlandMonitor"
|
||||
isPointer: true
|
||||
lineNumber: 55
|
||||
Parameter { name: "screen"; type: "QuickshellScreenInfo"; isPointer: true }
|
||||
}
|
||||
Method { name: "refreshMonitors"; lineNumber: 61 }
|
||||
Method { name: "refreshWorkspaces"; lineNumber: 67 }
|
||||
Method { name: "refreshToplevels"; lineNumber: 73 }
|
||||
}
|
||||
Component {
|
||||
file: "monitor.hpp"
|
||||
lineNumber: 17
|
||||
name: "qs::hyprland::ipc::HyprlandMonitor"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Hyprland._Ipc/HyprlandMonitor 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "id"
|
||||
type: "int"
|
||||
bindable: "bindableId"
|
||||
read: "default"
|
||||
notify: "idChanged"
|
||||
index: 0
|
||||
lineNumber: 20
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
bindable: "bindableName"
|
||||
read: "default"
|
||||
notify: "nameChanged"
|
||||
index: 1
|
||||
lineNumber: 21
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "description"
|
||||
type: "QString"
|
||||
bindable: "bindableDescription"
|
||||
read: "default"
|
||||
notify: "descriptionChanged"
|
||||
index: 2
|
||||
lineNumber: 22
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "x"
|
||||
type: "int"
|
||||
bindable: "bindableX"
|
||||
read: "default"
|
||||
notify: "xChanged"
|
||||
index: 3
|
||||
lineNumber: 23
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "y"
|
||||
type: "int"
|
||||
bindable: "bindableY"
|
||||
read: "default"
|
||||
notify: "yChanged"
|
||||
index: 4
|
||||
lineNumber: 24
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "width"
|
||||
type: "int"
|
||||
bindable: "bindableWidth"
|
||||
read: "default"
|
||||
notify: "widthChanged"
|
||||
index: 5
|
||||
lineNumber: 25
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "height"
|
||||
type: "int"
|
||||
bindable: "bindableHeight"
|
||||
read: "default"
|
||||
notify: "heightChanged"
|
||||
index: 6
|
||||
lineNumber: 26
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "scale"
|
||||
type: "double"
|
||||
bindable: "bindableScale"
|
||||
read: "default"
|
||||
notify: "scaleChanged"
|
||||
index: 7
|
||||
lineNumber: 27
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "lastIpcObject"
|
||||
type: "QVariantMap"
|
||||
read: "lastIpcObject"
|
||||
notify: "lastIpcObjectChanged"
|
||||
index: 8
|
||||
lineNumber: 33
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "activeWorkspace"
|
||||
type: "qs::hyprland::ipc::HyprlandWorkspace"
|
||||
isPointer: true
|
||||
bindable: "bindableActiveWorkspace"
|
||||
read: "default"
|
||||
notify: "activeWorkspaceChanged"
|
||||
index: 9
|
||||
lineNumber: 35
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "focused"
|
||||
type: "bool"
|
||||
bindable: "bindableFocused"
|
||||
read: "default"
|
||||
notify: "focusedChanged"
|
||||
index: 10
|
||||
lineNumber: 37
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "idChanged"; lineNumber: 66 }
|
||||
Signal { name: "nameChanged"; lineNumber: 67 }
|
||||
Signal { name: "descriptionChanged"; lineNumber: 68 }
|
||||
Signal { name: "xChanged"; lineNumber: 69 }
|
||||
Signal { name: "yChanged"; lineNumber: 70 }
|
||||
Signal { name: "widthChanged"; lineNumber: 71 }
|
||||
Signal { name: "heightChanged"; lineNumber: 72 }
|
||||
Signal { name: "scaleChanged"; lineNumber: 73 }
|
||||
Signal { name: "lastIpcObjectChanged"; lineNumber: 74 }
|
||||
Signal { name: "activeWorkspaceChanged"; lineNumber: 75 }
|
||||
Signal { name: "focusedChanged"; lineNumber: 76 }
|
||||
Method { name: "onActiveWorkspaceDestroyed"; lineNumber: 79 }
|
||||
}
|
||||
Component {
|
||||
file: "hyprland_toplevel.hpp"
|
||||
lineNumber: 20
|
||||
name: "qs::hyprland::ipc::HyprlandToplevel"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Hyprland._Ipc/HyprlandToplevel 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
attachedType: "qs::hyprland::ipc::HyprlandToplevel"
|
||||
Property {
|
||||
name: "address"
|
||||
type: "QString"
|
||||
read: "addressStr"
|
||||
notify: "addressChanged"
|
||||
index: 0
|
||||
lineNumber: 28
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "handle"
|
||||
type: "HyprlandToplevel"
|
||||
isPointer: true
|
||||
read: "hyprlandHandle"
|
||||
notify: "hyprlandHandleChanged"
|
||||
index: 1
|
||||
lineNumber: 31
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "wayland"
|
||||
type: "qs::wayland::toplevel::Toplevel"
|
||||
isPointer: true
|
||||
read: "waylandHandle"
|
||||
notify: "waylandHandleChanged"
|
||||
index: 2
|
||||
lineNumber: 33
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "title"
|
||||
type: "QString"
|
||||
bindable: "bindableTitle"
|
||||
read: "default"
|
||||
notify: "titleChanged"
|
||||
index: 3
|
||||
lineNumber: 35
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "activated"
|
||||
type: "bool"
|
||||
bindable: "bindableActivated"
|
||||
read: "default"
|
||||
notify: "activatedChanged"
|
||||
index: 4
|
||||
lineNumber: 37
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "urgent"
|
||||
type: "bool"
|
||||
bindable: "bindableUrgent"
|
||||
read: "default"
|
||||
notify: "urgentChanged"
|
||||
index: 5
|
||||
lineNumber: 39
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "lastIpcObject"
|
||||
type: "QVariantMap"
|
||||
bindable: "bindableLastIpcObject"
|
||||
read: "default"
|
||||
notify: "lastIpcObjectChanged"
|
||||
index: 6
|
||||
lineNumber: 45
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "workspace"
|
||||
type: "qs::hyprland::ipc::HyprlandWorkspace"
|
||||
isPointer: true
|
||||
bindable: "bindableWorkspace"
|
||||
read: "default"
|
||||
notify: "workspaceChanged"
|
||||
index: 7
|
||||
lineNumber: 47
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "monitor"
|
||||
type: "qs::hyprland::ipc::HyprlandMonitor"
|
||||
isPointer: true
|
||||
bindable: "bindableMonitor"
|
||||
read: "default"
|
||||
notify: "monitorChanged"
|
||||
index: 8
|
||||
lineNumber: 49
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "addressChanged"; lineNumber: 90 }
|
||||
Signal { name: "waylandHandleChanged"; lineNumber: 91 }
|
||||
Signal { name: "hyprlandHandleChanged"; lineNumber: 92 }
|
||||
Signal { name: "titleChanged"; lineNumber: 94 }
|
||||
Signal { name: "activatedChanged"; lineNumber: 95 }
|
||||
Signal { name: "urgentChanged"; lineNumber: 96 }
|
||||
Signal { name: "workspaceChanged"; lineNumber: 97 }
|
||||
Signal { name: "monitorChanged"; lineNumber: 98 }
|
||||
Signal { name: "lastIpcObjectChanged"; lineNumber: 99 }
|
||||
Method { name: "onActivatedChanged"; lineNumber: 102 }
|
||||
}
|
||||
Component {
|
||||
file: "workspace.hpp"
|
||||
lineNumber: 19
|
||||
name: "qs::hyprland::ipc::HyprlandWorkspace"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Hyprland._Ipc/HyprlandWorkspace 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "address"
|
||||
type: "QString"
|
||||
bindable: "bindableAddress"
|
||||
read: "default"
|
||||
notify: "addressChanged"
|
||||
index: 0
|
||||
lineNumber: 25
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "id"
|
||||
type: "int"
|
||||
bindable: "bindableId"
|
||||
read: "default"
|
||||
notify: "idChanged"
|
||||
index: 1
|
||||
lineNumber: 29
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
bindable: "bindableName"
|
||||
read: "default"
|
||||
notify: "nameChanged"
|
||||
index: 2
|
||||
lineNumber: 30
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "active"
|
||||
type: "bool"
|
||||
bindable: "bindableActive"
|
||||
read: "default"
|
||||
notify: "activeChanged"
|
||||
index: 3
|
||||
lineNumber: 32
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "focused"
|
||||
type: "bool"
|
||||
bindable: "bindableFocused"
|
||||
read: "default"
|
||||
notify: "focusedChanged"
|
||||
index: 4
|
||||
lineNumber: 35
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "urgent"
|
||||
type: "bool"
|
||||
bindable: "bindableUrgent"
|
||||
read: "default"
|
||||
notify: "urgentChanged"
|
||||
index: 5
|
||||
lineNumber: 38
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "hasFullscreen"
|
||||
type: "bool"
|
||||
bindable: "bindableHasFullscreen"
|
||||
read: "default"
|
||||
notify: "hasFullscreenChanged"
|
||||
index: 6
|
||||
lineNumber: 40
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "lastIpcObject"
|
||||
type: "QVariantMap"
|
||||
read: "lastIpcObject"
|
||||
notify: "lastIpcObjectChanged"
|
||||
index: 7
|
||||
lineNumber: 46
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "monitor"
|
||||
type: "qs::hyprland::ipc::HyprlandMonitor"
|
||||
isPointer: true
|
||||
bindable: "bindableMonitor"
|
||||
read: "default"
|
||||
notify: "monitorChanged"
|
||||
index: 8
|
||||
lineNumber: 47
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "toplevels"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "toplevels"
|
||||
index: 9
|
||||
lineNumber: 50
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Signal { name: "addressChanged"; lineNumber: 87 }
|
||||
Signal { name: "idChanged"; lineNumber: 88 }
|
||||
Signal { name: "typeChanged"; lineNumber: 89 }
|
||||
Signal { name: "nameChanged"; lineNumber: 90 }
|
||||
Signal { name: "activeChanged"; lineNumber: 91 }
|
||||
Signal { name: "focusedChanged"; lineNumber: 92 }
|
||||
Signal { name: "urgentChanged"; lineNumber: 93 }
|
||||
Signal { name: "hasFullscreenChanged"; lineNumber: 94 }
|
||||
Signal { name: "lastIpcObjectChanged"; lineNumber: 95 }
|
||||
Signal { name: "monitorChanged"; lineNumber: 96 }
|
||||
Method { name: "onMonitorDestroyed"; lineNumber: 99 }
|
||||
Method { name: "updateUrgent"; lineNumber: 100 }
|
||||
Method { name: "activate"; lineNumber: 67 }
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
module Quickshell.Hyprland._SurfaceExtensions
|
||||
linktarget quickshell-hyprland-surface-extensionsplugin
|
||||
optional plugin quickshell-hyprland-surface-extensionsplugin
|
||||
classname Quickshell_Hyprland__SurfaceExtensionsPlugin
|
||||
typeinfo quickshell-hyprland-surface-extensions.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Hyprland/_SurfaceExtensions/
|
||||
depends QtQuick
|
||||
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 33
|
||||
name: "qs::hyprland::surface::HyprlandWindow"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Hyprland._SurfaceExtensions/HyprlandWindow 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
attachedType: "qs::hyprland::surface::HyprlandWindow"
|
||||
Property {
|
||||
name: "opacity"
|
||||
type: "double"
|
||||
read: "opacity"
|
||||
write: "setOpacity"
|
||||
notify: "opacityChanged"
|
||||
index: 0
|
||||
lineNumber: 40
|
||||
}
|
||||
Property {
|
||||
name: "visibleMask"
|
||||
type: "PendingRegion"
|
||||
isPointer: true
|
||||
read: "visibleMask"
|
||||
write: "setVisibleMask"
|
||||
notify: "visibleMaskChanged"
|
||||
index: 1
|
||||
lineNumber: 45
|
||||
}
|
||||
Signal { name: "opacityChanged"; lineNumber: 65 }
|
||||
Signal { name: "visibleMaskChanged"; lineNumber: 66 }
|
||||
Method { name: "onWindowConnected"; lineNumber: 69 }
|
||||
Method { name: "onWindowVisibleChanged"; lineNumber: 70 }
|
||||
Method { name: "onWaylandWindowDestroyed"; lineNumber: 71 }
|
||||
Method { name: "onWaylandSurfaceCreated"; lineNumber: 72 }
|
||||
Method { name: "onWaylandSurfaceDestroyed"; lineNumber: 73 }
|
||||
Method { name: "onProxyWindowDestroyed"; lineNumber: 74 }
|
||||
Method { name: "onVisibleMaskDestroyed"; lineNumber: 75 }
|
||||
Method { name: "onWindowPolished"; lineNumber: 76 }
|
||||
Method { name: "updateVisibleMask"; lineNumber: 77 }
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
module Quickshell.Hyprland
|
||||
linktarget quickshell-hyprlandplugin
|
||||
optional plugin quickshell-hyprlandplugin
|
||||
classname Quickshell_HyprlandPlugin
|
||||
typeinfo quickshell-hyprland.qmltypes
|
||||
import Quickshell.Hyprland._Ipc
|
||||
import Quickshell.Hyprland._FocusGrab
|
||||
import Quickshell.Hyprland._GlobalShortcuts
|
||||
import Quickshell.Hyprland._SurfaceExtensions
|
||||
prefer :/qt/qml/Quickshell/Hyprland/
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
module Quickshell.I3._Ipc
|
||||
linktarget quickshell-i3-ipcplugin
|
||||
optional plugin quickshell-i3-ipcplugin
|
||||
classname Quickshell_I3__IpcPlugin
|
||||
typeinfo quickshell-i3-ipc.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/I3/_Ipc/
|
||||
depends Quickshell
|
||||
depends QtQuick
|
||||
|
||||
+413
@@ -0,0 +1,413 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "connection.hpp"
|
||||
lineNumber: 41
|
||||
name: "qs::i3::ipc::I3IpcEvent"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.I3._Ipc/I3Event 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "type"
|
||||
type: "QString"
|
||||
read: "type"
|
||||
index: 0
|
||||
lineNumber: 44
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "data"
|
||||
type: "QString"
|
||||
read: "data"
|
||||
index: 1
|
||||
lineNumber: 45
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "listener.hpp"
|
||||
lineNumber: 36
|
||||
name: "qs::i3::ipc::I3IpcListener"
|
||||
accessSemantics: "reference"
|
||||
prototype: "PostReloadHook"
|
||||
exports: ["Quickshell.I3._Ipc/I3IpcListener 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "subscriptions"
|
||||
type: "QString"
|
||||
isList: true
|
||||
read: "subscriptions"
|
||||
write: "setSubscriptions"
|
||||
notify: "subscriptionsChanged"
|
||||
index: 0
|
||||
lineNumber: 40
|
||||
}
|
||||
Signal {
|
||||
name: "ipcEvent"
|
||||
lineNumber: 55
|
||||
Parameter { name: "event"; type: "I3IpcEvent"; isPointer: true }
|
||||
}
|
||||
Signal { name: "subscriptionsChanged"; lineNumber: 56 }
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 15
|
||||
name: "qs::i3::ipc::I3IpcQml"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.I3._Ipc/I3 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "socketPath"
|
||||
type: "QString"
|
||||
read: "socketPath"
|
||||
index: 0
|
||||
lineNumber: 19
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "focusedWorkspace"
|
||||
type: "qs::i3::ipc::I3Workspace"
|
||||
isPointer: true
|
||||
bindable: "bindableFocusedWorkspace"
|
||||
read: "default"
|
||||
notify: "focusedWorkspaceChanged"
|
||||
index: 1
|
||||
lineNumber: 21
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "focusedMonitor"
|
||||
type: "qs::i3::ipc::I3Monitor"
|
||||
isPointer: true
|
||||
bindable: "bindableFocusedMonitor"
|
||||
read: "default"
|
||||
notify: "focusedMonitorChanged"
|
||||
index: 2
|
||||
lineNumber: 22
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "monitors"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "monitors"
|
||||
index: 3
|
||||
lineNumber: 25
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "workspaces"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "workspaces"
|
||||
index: 4
|
||||
lineNumber: 28
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Signal {
|
||||
name: "rawEvent"
|
||||
lineNumber: 70
|
||||
Parameter { name: "event"; type: "I3IpcEvent"; isPointer: true }
|
||||
}
|
||||
Signal { name: "connected"; lineNumber: 71 }
|
||||
Signal { name: "focusedWorkspaceChanged"; lineNumber: 72 }
|
||||
Signal { name: "focusedMonitorChanged"; lineNumber: 73 }
|
||||
Method {
|
||||
name: "dispatch"
|
||||
lineNumber: 37
|
||||
Parameter { name: "request"; type: "QString" }
|
||||
}
|
||||
Method { name: "refreshMonitors"; lineNumber: 40 }
|
||||
Method { name: "refreshWorkspaces"; lineNumber: 43 }
|
||||
Method {
|
||||
name: "findWorkspaceByName"
|
||||
type: "I3Workspace"
|
||||
isPointer: true
|
||||
lineNumber: 46
|
||||
Parameter { name: "name"; type: "QString" }
|
||||
}
|
||||
Method {
|
||||
name: "findMonitorByName"
|
||||
type: "I3Monitor"
|
||||
isPointer: true
|
||||
lineNumber: 49
|
||||
Parameter { name: "name"; type: "QString" }
|
||||
}
|
||||
Method {
|
||||
name: "monitorFor"
|
||||
type: "I3Monitor"
|
||||
isPointer: true
|
||||
lineNumber: 52
|
||||
Parameter { name: "screen"; type: "QuickshellScreenInfo"; isPointer: true }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "monitor.hpp"
|
||||
lineNumber: 12
|
||||
name: "qs::i3::ipc::I3Monitor"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.I3._Ipc/I3Monitor 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "id"
|
||||
type: "int"
|
||||
bindable: "bindableId"
|
||||
read: "default"
|
||||
notify: "idChanged"
|
||||
index: 0
|
||||
lineNumber: 16
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
bindable: "bindableName"
|
||||
read: "default"
|
||||
notify: "nameChanged"
|
||||
index: 1
|
||||
lineNumber: 18
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "power"
|
||||
type: "bool"
|
||||
bindable: "bindablePower"
|
||||
read: "default"
|
||||
notify: "powerChanged"
|
||||
index: 2
|
||||
lineNumber: 20
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "activeWorkspace"
|
||||
type: "qs::i3::ipc::I3Workspace"
|
||||
isPointer: true
|
||||
bindable: "bindableActiveWorkspace"
|
||||
read: "default"
|
||||
notify: "activeWorkspaceChanged"
|
||||
index: 3
|
||||
lineNumber: 22
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "focusedWorkspace"
|
||||
type: "qs::i3::ipc::I3Workspace"
|
||||
isPointer: true
|
||||
bindable: "bindableActiveWorkspace"
|
||||
read: "default"
|
||||
notify: "activeWorkspaceChanged"
|
||||
index: 4
|
||||
lineNumber: 24
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "x"
|
||||
type: "int"
|
||||
bindable: "bindableX"
|
||||
read: "default"
|
||||
notify: "xChanged"
|
||||
index: 5
|
||||
lineNumber: 26
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "y"
|
||||
type: "int"
|
||||
bindable: "bindableY"
|
||||
read: "default"
|
||||
notify: "yChanged"
|
||||
index: 6
|
||||
lineNumber: 28
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "width"
|
||||
type: "int"
|
||||
bindable: "bindableWidth"
|
||||
read: "default"
|
||||
notify: "widthChanged"
|
||||
index: 7
|
||||
lineNumber: 30
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "height"
|
||||
type: "int"
|
||||
bindable: "bindableHeight"
|
||||
read: "default"
|
||||
notify: "heightChanged"
|
||||
index: 8
|
||||
lineNumber: 32
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "scale"
|
||||
type: "double"
|
||||
bindable: "bindableScale"
|
||||
read: "default"
|
||||
notify: "scaleChanged"
|
||||
index: 9
|
||||
lineNumber: 34
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "focused"
|
||||
type: "bool"
|
||||
bindable: "bindableFocused"
|
||||
read: "default"
|
||||
notify: "focusedChanged"
|
||||
index: 10
|
||||
lineNumber: 36
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "lastIpcObject"
|
||||
type: "QVariantMap"
|
||||
read: "lastIpcObject"
|
||||
notify: "lastIpcObjectChanged"
|
||||
index: 11
|
||||
lineNumber: 40
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "idChanged"; lineNumber: 68 }
|
||||
Signal { name: "nameChanged"; lineNumber: 69 }
|
||||
Signal { name: "powerChanged"; lineNumber: 70 }
|
||||
Signal { name: "activeWorkspaceChanged"; lineNumber: 71 }
|
||||
Signal { name: "xChanged"; lineNumber: 72 }
|
||||
Signal { name: "yChanged"; lineNumber: 73 }
|
||||
Signal { name: "widthChanged"; lineNumber: 74 }
|
||||
Signal { name: "heightChanged"; lineNumber: 75 }
|
||||
Signal { name: "scaleChanged"; lineNumber: 76 }
|
||||
Signal { name: "lastIpcObjectChanged"; lineNumber: 77 }
|
||||
Signal { name: "focusedChanged"; lineNumber: 78 }
|
||||
Method { name: "onActiveWorkspaceDestroyed"; lineNumber: 81 }
|
||||
}
|
||||
Component {
|
||||
file: "workspace.hpp"
|
||||
lineNumber: 15
|
||||
name: "qs::i3::ipc::I3Workspace"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.I3._Ipc/I3Workspace 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "id"
|
||||
type: "int"
|
||||
bindable: "bindableId"
|
||||
read: "default"
|
||||
notify: "idChanged"
|
||||
index: 0
|
||||
lineNumber: 19
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
bindable: "bindableName"
|
||||
read: "default"
|
||||
notify: "nameChanged"
|
||||
index: 1
|
||||
lineNumber: 21
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "number"
|
||||
type: "int"
|
||||
bindable: "bindableNumber"
|
||||
read: "default"
|
||||
notify: "numberChanged"
|
||||
index: 2
|
||||
lineNumber: 23
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "num"
|
||||
type: "int"
|
||||
bindable: "bindableNumber"
|
||||
read: "default"
|
||||
notify: "numberChanged"
|
||||
index: 3
|
||||
lineNumber: 25
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "urgent"
|
||||
type: "bool"
|
||||
bindable: "bindableUrgent"
|
||||
read: "default"
|
||||
notify: "urgentChanged"
|
||||
index: 4
|
||||
lineNumber: 27
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "active"
|
||||
type: "bool"
|
||||
bindable: "bindableActive"
|
||||
read: "default"
|
||||
notify: "activeChanged"
|
||||
index: 5
|
||||
lineNumber: 29
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "focused"
|
||||
type: "bool"
|
||||
bindable: "bindableFocused"
|
||||
read: "default"
|
||||
notify: "focusedChanged"
|
||||
index: 6
|
||||
lineNumber: 32
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "monitor"
|
||||
type: "qs::i3::ipc::I3Monitor"
|
||||
isPointer: true
|
||||
bindable: "bindableMonitor"
|
||||
read: "default"
|
||||
notify: "monitorChanged"
|
||||
index: 7
|
||||
lineNumber: 34
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "lastIpcObject"
|
||||
type: "QVariantMap"
|
||||
read: "lastIpcObject"
|
||||
notify: "lastIpcObjectChanged"
|
||||
index: 8
|
||||
lineNumber: 38
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "idChanged"; lineNumber: 68 }
|
||||
Signal { name: "nameChanged"; lineNumber: 69 }
|
||||
Signal { name: "urgentChanged"; lineNumber: 70 }
|
||||
Signal { name: "activeChanged"; lineNumber: 71 }
|
||||
Signal { name: "focusedChanged"; lineNumber: 72 }
|
||||
Signal { name: "numberChanged"; lineNumber: 73 }
|
||||
Signal { name: "monitorChanged"; lineNumber: 74 }
|
||||
Signal { name: "lastIpcObjectChanged"; lineNumber: 75 }
|
||||
Method { name: "onMonitorDestroyed"; lineNumber: 78 }
|
||||
Method { name: "activate"; lineNumber: 52 }
|
||||
}
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
module Quickshell.I3
|
||||
linktarget quickshell-i3plugin
|
||||
optional plugin quickshell-i3plugin
|
||||
classname Quickshell_I3Plugin
|
||||
typeinfo quickshell-i3.qmltypes
|
||||
import Quickshell.I3._Ipc
|
||||
prefer :/qt/qml/Quickshell/I3/
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {}
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
import Quickshell.Io
|
||||
|
||||
FileViewInternal {
|
||||
property bool preload: this.__preload;
|
||||
property bool blockLoading: this.__blockLoading;
|
||||
property bool blockAllReads: this.__blockAllReads;
|
||||
property bool printErrors: this.__printErrors;
|
||||
property string path: this.__path;
|
||||
|
||||
onPreloadChanged: this.__preload = preload;
|
||||
onBlockLoadingChanged: this.__blockLoading = this.blockLoading;
|
||||
onBlockAllReadsChanged: this.__blockAllReads = this.blockAllReads;
|
||||
onPrintErrorsChanged: this.__printErrors = this.printErrors;
|
||||
|
||||
// Unfortunately path can't be kept as an empty string until the file loads
|
||||
// without using QQmlPropertyValueInterceptor which is private. If we lean fully
|
||||
// into using private code in the future, there will be no reason not to do it here.
|
||||
|
||||
onPathChanged: {
|
||||
if (!this.preload) this.__preload = false;
|
||||
this.__printErrors = this.printErrors;
|
||||
this.__path = this.path;
|
||||
if (this.preload) this.__preload = true;
|
||||
}
|
||||
|
||||
// The C++ side can't force bindings to be resolved in a specific order so
|
||||
// its done here. Functions are used to avoid the eager loading aspect of properties.
|
||||
|
||||
// Preload is set as it is below to avoid starting an async read from a preload
|
||||
// if the user wants an initial blocking read.
|
||||
|
||||
function text(): string {
|
||||
if (!this.preload) this.__preload = false;
|
||||
this.__blockLoading = this.blockLoading;
|
||||
this.__blockAllReads = this.blockAllReads;
|
||||
this.__printErrors = this.printErrors;
|
||||
this.__path = this.path;
|
||||
const text = this.__text;
|
||||
if (this.preload) this.__preload = true;
|
||||
return text;
|
||||
}
|
||||
|
||||
function data(): var {
|
||||
if (!this.preload) this.__preload = false;
|
||||
this.__blockLoading = this.blockLoading;
|
||||
this.__blockAllReads = this.blockAllReads;
|
||||
this.__printErrors = this.printErrors;
|
||||
this.__path = this.path;
|
||||
const data = this.__data;
|
||||
if (this.preload) this.__preload = true;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
module Quickshell.Io
|
||||
linktarget quickshell-ioplugin
|
||||
optional plugin quickshell-ioplugin
|
||||
classname Quickshell_IoPlugin
|
||||
typeinfo quickshell-io.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Io/
|
||||
FileView 0.0 FileView.qml
|
||||
depends Quickshell
|
||||
depends QtQuick
|
||||
|
||||
+642
@@ -0,0 +1,642 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "datastream.hpp"
|
||||
lineNumber: 15
|
||||
name: "DataStream"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Io/DataStream 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "parser"
|
||||
type: "DataStreamParser"
|
||||
isPointer: true
|
||||
read: "reader"
|
||||
write: "setReader"
|
||||
notify: "readerChanged"
|
||||
index: 0
|
||||
lineNumber: 19
|
||||
}
|
||||
Signal { name: "readerChanged"; lineNumber: 30 }
|
||||
Method { name: "onBytesAvailable"; lineNumber: 33 }
|
||||
Method { name: "onReaderDestroyed"; lineNumber: 39 }
|
||||
}
|
||||
Component {
|
||||
file: "datastream.hpp"
|
||||
lineNumber: 48
|
||||
name: "DataStreamParser"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Io/DataStreamParser 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Signal {
|
||||
name: "read"
|
||||
lineNumber: 62
|
||||
Parameter { name: "data"; type: "QString" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "process.hpp"
|
||||
lineNumber: 34
|
||||
name: "Process"
|
||||
accessSemantics: "reference"
|
||||
prototype: "PostReloadHook"
|
||||
exports: ["Quickshell.Io/Process 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "running"
|
||||
type: "bool"
|
||||
read: "isRunning"
|
||||
write: "setRunning"
|
||||
notify: "runningChanged"
|
||||
index: 0
|
||||
lineNumber: 56
|
||||
}
|
||||
Property {
|
||||
name: "processId"
|
||||
type: "QVariant"
|
||||
read: "processId"
|
||||
notify: "processIdChanged"
|
||||
index: 1
|
||||
lineNumber: 58
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "command"
|
||||
type: "QString"
|
||||
isList: true
|
||||
read: "command"
|
||||
write: "setCommand"
|
||||
notify: "commandChanged"
|
||||
index: 2
|
||||
lineNumber: 76
|
||||
}
|
||||
Property {
|
||||
name: "workingDirectory"
|
||||
type: "QString"
|
||||
read: "workingDirectory"
|
||||
write: "setWorkingDirectory"
|
||||
notify: "workingDirectoryChanged"
|
||||
index: 3
|
||||
lineNumber: 84
|
||||
}
|
||||
Property {
|
||||
name: "environment"
|
||||
type: "QVariantHash"
|
||||
read: "environment"
|
||||
write: "setEnvironment"
|
||||
notify: "environmentChanged"
|
||||
index: 4
|
||||
lineNumber: 105
|
||||
}
|
||||
Property {
|
||||
name: "clearEnvironment"
|
||||
type: "bool"
|
||||
read: "environmentCleared"
|
||||
write: "setEnvironmentCleared"
|
||||
notify: "environmentClearChanged"
|
||||
index: 5
|
||||
lineNumber: 125
|
||||
}
|
||||
Property {
|
||||
name: "stdout"
|
||||
type: "DataStreamParser"
|
||||
isPointer: true
|
||||
read: "stdoutParser"
|
||||
write: "setStdoutParser"
|
||||
notify: "stdoutParserChanged"
|
||||
index: 6
|
||||
lineNumber: 128
|
||||
}
|
||||
Property {
|
||||
name: "stderr"
|
||||
type: "DataStreamParser"
|
||||
isPointer: true
|
||||
read: "stderrParser"
|
||||
write: "setStderrParser"
|
||||
notify: "stderrParserChanged"
|
||||
index: 7
|
||||
lineNumber: 131
|
||||
}
|
||||
Property {
|
||||
name: "stdinEnabled"
|
||||
type: "bool"
|
||||
read: "stdinEnabled"
|
||||
write: "setStdinEnabled"
|
||||
notify: "stdinEnabledChanged"
|
||||
index: 8
|
||||
lineNumber: 134
|
||||
}
|
||||
Signal { name: "started"; lineNumber: 220 }
|
||||
Signal {
|
||||
name: "exited"
|
||||
lineNumber: 221
|
||||
Parameter { name: "exitCode"; type: "int" }
|
||||
Parameter { name: "exitStatus"; type: "QProcess::ExitStatus" }
|
||||
}
|
||||
Signal { name: "runningChanged"; lineNumber: 223 }
|
||||
Signal { name: "processIdChanged"; lineNumber: 224 }
|
||||
Signal { name: "commandChanged"; lineNumber: 225 }
|
||||
Signal { name: "workingDirectoryChanged"; lineNumber: 226 }
|
||||
Signal { name: "environmentChanged"; lineNumber: 227 }
|
||||
Signal { name: "environmentClearChanged"; lineNumber: 228 }
|
||||
Signal { name: "stdoutParserChanged"; lineNumber: 229 }
|
||||
Signal { name: "stderrParserChanged"; lineNumber: 230 }
|
||||
Signal { name: "stdinEnabledChanged"; lineNumber: 231 }
|
||||
Method { name: "onStarted"; lineNumber: 234 }
|
||||
Method {
|
||||
name: "onFinished"
|
||||
lineNumber: 235
|
||||
Parameter { name: "exitCode"; type: "int" }
|
||||
Parameter { name: "exitStatus"; type: "QProcess::ExitStatus" }
|
||||
}
|
||||
Method {
|
||||
name: "onErrorOccurred"
|
||||
lineNumber: 236
|
||||
Parameter { name: "error"; type: "QProcess::ProcessError" }
|
||||
}
|
||||
Method { name: "onStdoutReadyRead"; lineNumber: 237 }
|
||||
Method { name: "onStderrReadyRead"; lineNumber: 238 }
|
||||
Method { name: "onStdoutParserDestroyed"; lineNumber: 239 }
|
||||
Method { name: "onStderrParserDestroyed"; lineNumber: 240 }
|
||||
Method { name: "onGlobalWorkingDirectoryChanged"; lineNumber: 241 }
|
||||
Method {
|
||||
name: "exec"
|
||||
lineNumber: 146
|
||||
Parameter { name: "command"; type: "QString"; isList: true }
|
||||
}
|
||||
Method {
|
||||
name: "exec"
|
||||
lineNumber: 177
|
||||
Parameter { name: "context"; type: "qs::io::process::ProcessContext" }
|
||||
}
|
||||
Method {
|
||||
name: "signal"
|
||||
lineNumber: 180
|
||||
Parameter { name: "signal"; type: "int" }
|
||||
}
|
||||
Method {
|
||||
name: "write"
|
||||
lineNumber: 183
|
||||
Parameter { name: "data"; type: "QString" }
|
||||
}
|
||||
Method { name: "startDetached"; lineNumber: 191 }
|
||||
}
|
||||
Component {
|
||||
file: "socket.hpp"
|
||||
lineNumber: 20
|
||||
name: "Socket"
|
||||
accessSemantics: "reference"
|
||||
prototype: "DataStream"
|
||||
exports: ["Quickshell.Io/Socket 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "connected"
|
||||
type: "bool"
|
||||
read: "isConnected"
|
||||
write: "setConnected"
|
||||
notify: "connectionStateChanged"
|
||||
index: 0
|
||||
lineNumber: 27
|
||||
}
|
||||
Property {
|
||||
name: "path"
|
||||
type: "QString"
|
||||
read: "path"
|
||||
write: "setPath"
|
||||
notify: "pathChanged"
|
||||
index: 1
|
||||
lineNumber: 31
|
||||
}
|
||||
Signal {
|
||||
name: "error"
|
||||
lineNumber: 56
|
||||
Parameter { name: "error"; type: "QLocalSocket::LocalSocketError" }
|
||||
}
|
||||
Signal { name: "connectionStateChanged"; lineNumber: 58 }
|
||||
Signal { name: "pathChanged"; lineNumber: 59 }
|
||||
Method { name: "onSocketConnected"; lineNumber: 65 }
|
||||
Method { name: "onSocketDisconnected"; lineNumber: 66 }
|
||||
Method {
|
||||
name: "onSocketError"
|
||||
lineNumber: 67
|
||||
Parameter { name: "error"; type: "QLocalSocket::LocalSocketError" }
|
||||
}
|
||||
Method {
|
||||
name: "write"
|
||||
lineNumber: 40
|
||||
Parameter { name: "data"; type: "QString" }
|
||||
}
|
||||
Method { name: "flush"; lineNumber: 43 }
|
||||
}
|
||||
Component {
|
||||
file: "socket.hpp"
|
||||
lineNumber: 95
|
||||
name: "SocketServer"
|
||||
accessSemantics: "reference"
|
||||
prototype: "Reloadable"
|
||||
exports: ["Quickshell.Io/SocketServer 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "active"
|
||||
type: "bool"
|
||||
read: "isActive"
|
||||
write: "setActive"
|
||||
notify: "activeStatusChanged"
|
||||
index: 0
|
||||
lineNumber: 103
|
||||
}
|
||||
Property {
|
||||
name: "path"
|
||||
type: "QString"
|
||||
read: "path"
|
||||
write: "setPath"
|
||||
notify: "pathChanged"
|
||||
index: 1
|
||||
lineNumber: 107
|
||||
}
|
||||
Property {
|
||||
name: "handler"
|
||||
type: "QQmlComponent"
|
||||
isPointer: true
|
||||
read: "handler"
|
||||
write: "setHandler"
|
||||
notify: "handlerChanged"
|
||||
index: 2
|
||||
lineNumber: 114
|
||||
}
|
||||
Signal { name: "activeStatusChanged"; lineNumber: 134 }
|
||||
Signal { name: "pathChanged"; lineNumber: 135 }
|
||||
Signal { name: "handlerChanged"; lineNumber: 136 }
|
||||
Method { name: "onNewConnection"; lineNumber: 139 }
|
||||
}
|
||||
Component {
|
||||
file: "datastream.hpp"
|
||||
lineNumber: 67
|
||||
name: "SplitParser"
|
||||
accessSemantics: "reference"
|
||||
prototype: "DataStreamParser"
|
||||
exports: ["Quickshell.Io/SplitParser 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "splitMarker"
|
||||
type: "QString"
|
||||
read: "splitMarker"
|
||||
write: "setSplitMarker"
|
||||
notify: "splitMarkerChanged"
|
||||
index: 0
|
||||
lineNumber: 73
|
||||
}
|
||||
Signal { name: "splitMarkerChanged"; lineNumber: 86 }
|
||||
}
|
||||
Component {
|
||||
file: "datastream.hpp"
|
||||
lineNumber: 95
|
||||
name: "StdioCollector"
|
||||
accessSemantics: "reference"
|
||||
prototype: "DataStreamParser"
|
||||
exports: ["Quickshell.Io/StdioCollector 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "text"
|
||||
type: "QString"
|
||||
read: "text"
|
||||
notify: "dataChanged"
|
||||
index: 0
|
||||
lineNumber: 100
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "data"
|
||||
type: "QByteArray"
|
||||
read: "data"
|
||||
notify: "dataChanged"
|
||||
index: 1
|
||||
lineNumber: 105
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "waitForEnd"
|
||||
type: "bool"
|
||||
read: "waitForEnd"
|
||||
write: "setWaitForEnd"
|
||||
notify: "waitForEndChanged"
|
||||
index: 2
|
||||
lineNumber: 107
|
||||
}
|
||||
Signal { name: "waitForEndChanged"; lineNumber: 122 }
|
||||
Signal { name: "dataChanged"; lineNumber: 123 }
|
||||
Signal { name: "streamFinished"; lineNumber: 124 }
|
||||
}
|
||||
Component {
|
||||
file: "fileview.hpp"
|
||||
lineNumber: 164
|
||||
name: "qs::io::FileView"
|
||||
accessSemantics: "reference"
|
||||
defaultProperty: "adapter"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Io/FileViewInternal 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "blockWrites"
|
||||
type: "bool"
|
||||
bindable: "bindableBlockWrites"
|
||||
read: "default"
|
||||
write: "default"
|
||||
notify: "blockWritesChanged"
|
||||
index: 0
|
||||
lineNumber: 201
|
||||
}
|
||||
Property {
|
||||
name: "atomicWrites"
|
||||
type: "bool"
|
||||
bindable: "bindableAtomicWrites"
|
||||
read: "default"
|
||||
write: "default"
|
||||
notify: "atomicWritesChanged"
|
||||
index: 1
|
||||
lineNumber: 207
|
||||
}
|
||||
Property {
|
||||
name: "watchChanges"
|
||||
type: "bool"
|
||||
bindable: "bindableWatchChanges"
|
||||
read: "default"
|
||||
write: "default"
|
||||
notify: "watchChangesChanged"
|
||||
index: 2
|
||||
lineNumber: 222
|
||||
}
|
||||
Property {
|
||||
name: "adapter"
|
||||
type: "FileViewAdapter"
|
||||
isPointer: true
|
||||
read: "adapter"
|
||||
write: "setAdapter"
|
||||
notify: "adapterChanged"
|
||||
index: 3
|
||||
lineNumber: 230
|
||||
}
|
||||
Property {
|
||||
name: "__path"
|
||||
type: "QString"
|
||||
read: "path"
|
||||
write: "setPath"
|
||||
notify: "pathChanged"
|
||||
index: 4
|
||||
lineNumber: 232
|
||||
}
|
||||
Property {
|
||||
name: "__text"
|
||||
type: "QString"
|
||||
read: "text"
|
||||
notify: "internalTextChanged"
|
||||
index: 5
|
||||
lineNumber: 233
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "__data"
|
||||
type: "QByteArray"
|
||||
read: "data"
|
||||
notify: "internalDataChanged"
|
||||
index: 6
|
||||
lineNumber: 234
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "__preload"
|
||||
type: "bool"
|
||||
read: "shouldPreload"
|
||||
write: "setPreload"
|
||||
notify: "preloadChanged"
|
||||
index: 7
|
||||
lineNumber: 235
|
||||
}
|
||||
Property {
|
||||
name: "loaded"
|
||||
type: "bool"
|
||||
read: "isLoadedOrAsync"
|
||||
notify: "loadedOrAsyncChanged"
|
||||
index: 8
|
||||
lineNumber: 241
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "__blockLoading"
|
||||
type: "bool"
|
||||
read: "blockLoading"
|
||||
write: "setBlockLoading"
|
||||
notify: "blockLoadingChanged"
|
||||
index: 9
|
||||
lineNumber: 242
|
||||
}
|
||||
Property {
|
||||
name: "__blockAllReads"
|
||||
type: "bool"
|
||||
read: "blockAllReads"
|
||||
write: "setBlockAllReads"
|
||||
notify: "blockAllReadsChanged"
|
||||
index: 10
|
||||
lineNumber: 243
|
||||
}
|
||||
Property {
|
||||
name: "__printErrors"
|
||||
type: "bool"
|
||||
bindable: "bindablePrintErrors"
|
||||
read: "default"
|
||||
write: "default"
|
||||
notify: "printErrorsChanged"
|
||||
index: 11
|
||||
lineNumber: 244
|
||||
}
|
||||
Signal { name: "loaded"; lineNumber: 338 }
|
||||
Signal {
|
||||
name: "loadFailed"
|
||||
lineNumber: 340
|
||||
Parameter { name: "error"; type: "qs::io::FileViewError::Enum" }
|
||||
}
|
||||
Signal { name: "saved"; lineNumber: 342 }
|
||||
Signal {
|
||||
name: "saveFailed"
|
||||
lineNumber: 344
|
||||
Parameter { name: "error"; type: "qs::io::FileViewError::Enum" }
|
||||
}
|
||||
Signal { name: "fileChanged"; lineNumber: 346 }
|
||||
Signal { name: "adapterUpdated"; lineNumber: 348 }
|
||||
Signal { name: "pathChanged"; lineNumber: 350 }
|
||||
Signal { name: "internalTextChanged"; lineNumber: 351 }
|
||||
Signal { name: "internalDataChanged"; lineNumber: 352 }
|
||||
Signal { name: "textChanged"; lineNumber: 353 }
|
||||
Signal { name: "dataChanged"; lineNumber: 354 }
|
||||
Signal { name: "preloadChanged"; lineNumber: 355 }
|
||||
Signal { name: "loadedOrAsyncChanged"; lineNumber: 356 }
|
||||
Signal { name: "blockLoadingChanged"; lineNumber: 357 }
|
||||
Signal { name: "blockAllReadsChanged"; lineNumber: 358 }
|
||||
Signal { name: "blockWritesChanged"; lineNumber: 359 }
|
||||
Signal { name: "atomicWritesChanged"; lineNumber: 360 }
|
||||
Signal { name: "printErrorsChanged"; lineNumber: 361 }
|
||||
Signal { name: "watchChangesChanged"; lineNumber: 362 }
|
||||
Signal { name: "adapterChanged"; lineNumber: 363 }
|
||||
Method { name: "operationFinished"; lineNumber: 366 }
|
||||
Method { name: "onAdapterDestroyed"; lineNumber: 367 }
|
||||
Method { name: "waitForJob"; type: "bool"; lineNumber: 293 }
|
||||
Method { name: "reload"; lineNumber: 298 }
|
||||
Method { name: "writeAdapter"; lineNumber: 300 }
|
||||
Method {
|
||||
name: "setData"
|
||||
lineNumber: 316
|
||||
Parameter { name: "data"; type: "QByteArray" }
|
||||
}
|
||||
Method {
|
||||
name: "setText"
|
||||
lineNumber: 324
|
||||
Parameter { name: "text"; type: "QString" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "fileview.hpp"
|
||||
lineNumber: 436
|
||||
name: "qs::io::FileViewAdapter"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Io/FileViewAdapter 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Signal { name: "adapterUpdated"; lineNumber: 448 }
|
||||
Method { name: "onDataChanged"; lineNumber: 451 }
|
||||
}
|
||||
Component {
|
||||
file: "fileview.hpp"
|
||||
lineNumber: 25
|
||||
name: "qs::io::FileViewError"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Io/FileViewError 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 31
|
||||
values: [
|
||||
"Success",
|
||||
"Unknown",
|
||||
"FileNotFound",
|
||||
"PermissionDenied",
|
||||
"NotAFile"
|
||||
]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 46
|
||||
Parameter { name: "value"; type: "qs::io::FileViewError::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "jsonadapter.hpp"
|
||||
lineNumber: 89
|
||||
name: "qs::io::JsonAdapter"
|
||||
accessSemantics: "reference"
|
||||
prototype: "qs::io::FileViewAdapter"
|
||||
interfaces: ["QQmlParserStatus"]
|
||||
exports: ["Quickshell.Io/JsonAdapter 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Method { name: "onPropertyChanged"; lineNumber: 104 }
|
||||
}
|
||||
Component {
|
||||
file: "jsonadapter.hpp"
|
||||
lineNumber: 19
|
||||
name: "qs::io::JsonObject"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Io/JsonObject 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
}
|
||||
Component {
|
||||
file: "ipchandler.hpp"
|
||||
lineNumber: 222
|
||||
name: "qs::io::ipc::IpcHandler"
|
||||
accessSemantics: "reference"
|
||||
prototype: "PostReloadHook"
|
||||
exports: ["Quickshell.Io/IpcHandler 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "enabled"
|
||||
type: "bool"
|
||||
read: "enabled"
|
||||
write: "setEnabled"
|
||||
notify: "enabledChanged"
|
||||
index: 0
|
||||
lineNumber: 225
|
||||
}
|
||||
Property {
|
||||
name: "target"
|
||||
type: "QString"
|
||||
read: "target"
|
||||
write: "setTarget"
|
||||
notify: "targetChanged"
|
||||
index: 1
|
||||
lineNumber: 228
|
||||
}
|
||||
Signal { name: "enabledChanged"; lineNumber: 251 }
|
||||
Signal { name: "targetChanged"; lineNumber: 252 }
|
||||
Method {
|
||||
name: "onSignalTriggered"
|
||||
isMethodConstant: true
|
||||
lineNumber: 255
|
||||
Parameter { name: "signal"; type: "QString" }
|
||||
Parameter { name: "value"; type: "QString" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "processcore.hpp"
|
||||
lineNumber: 14
|
||||
name: "qs::io::process::ProcessContext"
|
||||
accessSemantics: "value"
|
||||
exports: ["Quickshell.Io/processContext 0.0"]
|
||||
isStructured: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "command"
|
||||
type: "QString"
|
||||
isList: true
|
||||
write: "setCommand"
|
||||
index: 0
|
||||
lineNumber: 15
|
||||
}
|
||||
Property {
|
||||
name: "environment"
|
||||
type: "QVariantHash"
|
||||
write: "setEnvironment"
|
||||
index: 1
|
||||
lineNumber: 16
|
||||
}
|
||||
Property {
|
||||
name: "clearEnvironment"
|
||||
type: "bool"
|
||||
write: "setClearEnvironment"
|
||||
index: 2
|
||||
lineNumber: 17
|
||||
}
|
||||
Property {
|
||||
name: "workingDirectory"
|
||||
type: "QString"
|
||||
write: "setWorkingDirectory"
|
||||
index: 3
|
||||
lineNumber: 18
|
||||
}
|
||||
Property { name: "unbindStdout"; type: "bool"; write: "setUnbindStdout"; index: 4; lineNumber: 19 }
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
module Quickshell.Networking
|
||||
linktarget quickshell-networkplugin
|
||||
optional plugin quickshell-networkplugin
|
||||
classname Quickshell_NetworkingPlugin
|
||||
typeinfo quickshell-network.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Networking/
|
||||
depends Quickshell
|
||||
|
||||
+614
@@ -0,0 +1,614 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "enums.hpp"
|
||||
lineNumber: 67
|
||||
name: "qs::network::ConnectionFailReason"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Networking/ConnectionFailReason 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 73
|
||||
values: [
|
||||
"Unknown",
|
||||
"NoSecrets",
|
||||
"WifiClientDisconnected",
|
||||
"WifiClientFailed",
|
||||
"WifiAuthTimeout",
|
||||
"WifiNetworkLost"
|
||||
]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 88
|
||||
Parameter { name: "reason"; type: "ConnectionFailReason::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "enums.hpp"
|
||||
lineNumber: 49
|
||||
name: "qs::network::ConnectionState"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Networking/ConnectionState 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 55
|
||||
values: [
|
||||
"Unknown",
|
||||
"Connecting",
|
||||
"Connected",
|
||||
"Disconnecting",
|
||||
"Disconnected"
|
||||
]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 63
|
||||
Parameter { name: "state"; type: "ConnectionState::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "enums.hpp"
|
||||
lineNumber: 92
|
||||
name: "qs::network::DeviceType"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Networking/DeviceType 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 98
|
||||
values: ["None", "Wifi", "Wired"]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 104
|
||||
Parameter { name: "type"; type: "DeviceType::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "network.hpp"
|
||||
lineNumber: 21
|
||||
name: "qs::network::Network"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Networking/Network 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
bindable: "bindableName"
|
||||
read: "default"
|
||||
notify: "nameChanged"
|
||||
index: 0
|
||||
lineNumber: 28
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "device"
|
||||
type: "NetworkDevice"
|
||||
isPointer: true
|
||||
read: "device"
|
||||
index: 1
|
||||
lineNumber: 30
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "nmSettings"
|
||||
type: "QList<NMSettings*>"
|
||||
bindable: "bindableNmSettings"
|
||||
read: "default"
|
||||
notify: "nmSettingsChanged"
|
||||
index: 2
|
||||
lineNumber: 34
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "connected"
|
||||
type: "bool"
|
||||
bindable: "bindableConnected"
|
||||
read: "default"
|
||||
notify: "connectedChanged"
|
||||
index: 3
|
||||
lineNumber: 36
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "known"
|
||||
type: "bool"
|
||||
bindable: "bindableKnown"
|
||||
read: "default"
|
||||
notify: "knownChanged"
|
||||
index: 4
|
||||
lineNumber: 38
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "state"
|
||||
type: "ConnectionState::Enum"
|
||||
bindable: "bindableState"
|
||||
read: "default"
|
||||
notify: "stateChanged"
|
||||
index: 5
|
||||
lineNumber: 40
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "stateChanging"
|
||||
type: "bool"
|
||||
bindable: "bindableStateChanging"
|
||||
read: "default"
|
||||
notify: "stateChangingChanged"
|
||||
index: 6
|
||||
lineNumber: 42
|
||||
isReadonly: true
|
||||
}
|
||||
Signal {
|
||||
name: "connectionFailed"
|
||||
lineNumber: 80
|
||||
Parameter { name: "reason"; type: "ConnectionFailReason::Enum" }
|
||||
}
|
||||
Signal { name: "nameChanged"; lineNumber: 82 }
|
||||
Signal { name: "connectedChanged"; lineNumber: 83 }
|
||||
Signal { name: "knownChanged"; lineNumber: 84 }
|
||||
Signal { name: "stateChanged"; lineNumber: 85 }
|
||||
Signal { name: "stateChangingChanged"; lineNumber: 86 }
|
||||
Signal { name: "nmSettingsChanged"; lineNumber: 87 }
|
||||
Signal { name: "requestConnect"; lineNumber: 88 }
|
||||
Signal {
|
||||
name: "requestConnectWithSettings"
|
||||
lineNumber: 89
|
||||
Parameter { name: "settings"; type: "NMSettings"; isPointer: true }
|
||||
}
|
||||
Signal { name: "requestDisconnect"; lineNumber: 90 }
|
||||
Signal { name: "requestForget"; lineNumber: 91 }
|
||||
Method { name: "connect"; lineNumber: 52 }
|
||||
Method {
|
||||
name: "connectWithSettings"
|
||||
lineNumber: 56
|
||||
Parameter { name: "settings"; type: "NMSettings"; isPointer: true }
|
||||
}
|
||||
Method { name: "disconnect"; lineNumber: 58 }
|
||||
Method { name: "forget"; lineNumber: 60 }
|
||||
}
|
||||
Component {
|
||||
file: "enums.hpp"
|
||||
lineNumber: 34
|
||||
name: "qs::network::NetworkBackendType"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Networking/NetworkBackendType 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 40
|
||||
values: ["None", "NetworkManager"]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 45
|
||||
Parameter { name: "type"; type: "NetworkBackendType::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "enums.hpp"
|
||||
lineNumber: 10
|
||||
name: "qs::network::NetworkConnectivity"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Networking/NetworkConnectivity 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 16
|
||||
values: ["Unknown", "None", "Portal", "Limited", "Full"]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 30
|
||||
Parameter { name: "conn"; type: "NetworkConnectivity::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "device.hpp"
|
||||
lineNumber: 18
|
||||
name: "qs::network::NetworkDevice"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Networking/NetworkDevice 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "type"
|
||||
type: "DeviceType::Enum"
|
||||
read: "type"
|
||||
index: 0
|
||||
lineNumber: 28
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
bindable: "bindableName"
|
||||
read: "name"
|
||||
notify: "nameChanged"
|
||||
index: 1
|
||||
lineNumber: 30
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "networks"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "networks"
|
||||
index: 2
|
||||
lineNumber: 35
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "address"
|
||||
type: "QString"
|
||||
bindable: "bindableAddress"
|
||||
read: "default"
|
||||
notify: "addressChanged"
|
||||
index: 3
|
||||
lineNumber: 37
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "connected"
|
||||
type: "bool"
|
||||
bindable: "bindableConnected"
|
||||
read: "default"
|
||||
notify: "connectedChanged"
|
||||
index: 4
|
||||
lineNumber: 39
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "state"
|
||||
type: "qs::network::ConnectionState::Enum"
|
||||
bindable: "bindableState"
|
||||
read: "default"
|
||||
notify: "stateChanged"
|
||||
index: 5
|
||||
lineNumber: 41
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "nmManaged"
|
||||
type: "bool"
|
||||
read: "nmManaged"
|
||||
write: "setNmManaged"
|
||||
notify: "nmManagedChanged"
|
||||
index: 6
|
||||
lineNumber: 45
|
||||
}
|
||||
Property {
|
||||
name: "autoconnect"
|
||||
type: "bool"
|
||||
read: "autoconnect"
|
||||
write: "setAutoconnect"
|
||||
notify: "autoconnectChanged"
|
||||
index: 7
|
||||
lineNumber: 47
|
||||
}
|
||||
Signal { name: "requestDisconnect"; lineNumber: 74 }
|
||||
Signal {
|
||||
name: "requestSetAutoconnect"
|
||||
lineNumber: 75
|
||||
Parameter { name: "autoconnect"; type: "bool" }
|
||||
}
|
||||
Signal {
|
||||
name: "requestSetNmManaged"
|
||||
lineNumber: 76
|
||||
Parameter { name: "managed"; type: "bool" }
|
||||
}
|
||||
Signal { name: "nameChanged"; lineNumber: 77 }
|
||||
Signal { name: "addressChanged"; lineNumber: 78 }
|
||||
Signal { name: "connectedChanged"; lineNumber: 79 }
|
||||
Signal { name: "stateChanged"; lineNumber: 80 }
|
||||
Signal { name: "nmManagedChanged"; lineNumber: 81 }
|
||||
Signal { name: "autoconnectChanged"; lineNumber: 82 }
|
||||
Method { name: "disconnect"; lineNumber: 54 }
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 79
|
||||
name: "qs::network::NetworkingQml"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Networking/Networking 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "devices"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "devices"
|
||||
index: 0
|
||||
lineNumber: 86
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "backend"
|
||||
type: "qs::network::NetworkBackendType::Enum"
|
||||
read: "backend"
|
||||
index: 1
|
||||
lineNumber: 88
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "wifiEnabled"
|
||||
type: "bool"
|
||||
read: "wifiEnabled"
|
||||
write: "setWifiEnabled"
|
||||
notify: "wifiEnabledChanged"
|
||||
index: 2
|
||||
lineNumber: 90
|
||||
}
|
||||
Property {
|
||||
name: "wifiHardwareEnabled"
|
||||
type: "bool"
|
||||
bindable: "bindableWifiHardwareEnabled"
|
||||
read: "default"
|
||||
notify: "wifiHardwareEnabledChanged"
|
||||
index: 3
|
||||
lineNumber: 92
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "canCheckConnectivity"
|
||||
type: "bool"
|
||||
bindable: "bindableCanCheckConnectivity"
|
||||
read: "default"
|
||||
notify: "canCheckConnectivityChanged"
|
||||
index: 4
|
||||
lineNumber: 94
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "connectivityCheckEnabled"
|
||||
type: "bool"
|
||||
read: "connectivityCheckEnabled"
|
||||
write: "setConnectivityCheckEnabled"
|
||||
notify: "connectivityCheckEnabledChanged"
|
||||
index: 5
|
||||
lineNumber: 96
|
||||
}
|
||||
Property {
|
||||
name: "connectivity"
|
||||
type: "qs::network::NetworkConnectivity::Enum"
|
||||
bindable: "bindableConnectivity"
|
||||
read: "default"
|
||||
notify: "connectivityChanged"
|
||||
index: 6
|
||||
lineNumber: 106
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "wifiEnabledChanged"; lineNumber: 144 }
|
||||
Signal { name: "wifiHardwareEnabledChanged"; lineNumber: 145 }
|
||||
Signal { name: "canCheckConnectivityChanged"; lineNumber: 146 }
|
||||
Signal { name: "connectivityCheckEnabledChanged"; lineNumber: 147 }
|
||||
Signal { name: "connectivityChanged"; lineNumber: 148 }
|
||||
Method { name: "checkConnectivity"; lineNumber: 114 }
|
||||
}
|
||||
Component {
|
||||
file: "wifi.hpp"
|
||||
lineNumber: 57
|
||||
name: "qs::network::WifiDevice"
|
||||
accessSemantics: "reference"
|
||||
prototype: "qs::network::NetworkDevice"
|
||||
exports: ["Quickshell.Networking/WifiDevice 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "scannerEnabled"
|
||||
type: "bool"
|
||||
bindable: "bindableScannerEnabled"
|
||||
read: "scannerEnabled"
|
||||
write: "setScannerEnabled"
|
||||
notify: "scannerEnabledChanged"
|
||||
index: 0
|
||||
lineNumber: 65
|
||||
}
|
||||
Property {
|
||||
name: "mode"
|
||||
type: "WifiDeviceMode::Enum"
|
||||
bindable: "bindableMode"
|
||||
read: "default"
|
||||
notify: "modeChanged"
|
||||
index: 1
|
||||
lineNumber: 67
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "modeChanged"; lineNumber: 79 }
|
||||
Signal {
|
||||
name: "scannerEnabledChanged"
|
||||
lineNumber: 80
|
||||
Parameter { name: "enabled"; type: "bool" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "enums.hpp"
|
||||
lineNumber: 133
|
||||
name: "qs::network::WifiDeviceMode"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Networking/WifiDeviceMode 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 139
|
||||
values: ["AdHoc", "Station", "AccessPoint", "Mesh", "Unknown"]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 152
|
||||
Parameter { name: "mode"; type: "WifiDeviceMode::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "wifi.hpp"
|
||||
lineNumber: 17
|
||||
name: "qs::network::WifiNetwork"
|
||||
accessSemantics: "reference"
|
||||
prototype: "qs::network::Network"
|
||||
exports: ["Quickshell.Networking/WifiNetwork 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "signalStrength"
|
||||
type: "double"
|
||||
bindable: "bindableSignalStrength"
|
||||
read: "default"
|
||||
notify: "signalStrengthChanged"
|
||||
index: 0
|
||||
lineNumber: 23
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "security"
|
||||
type: "WifiSecurityType::Enum"
|
||||
bindable: "bindableSecurity"
|
||||
read: "default"
|
||||
notify: "securityChanged"
|
||||
index: 1
|
||||
lineNumber: 25
|
||||
isReadonly: true
|
||||
}
|
||||
Signal {
|
||||
name: "requestConnectWithPsk"
|
||||
lineNumber: 45
|
||||
Parameter { name: "psk"; type: "QString" }
|
||||
}
|
||||
Signal { name: "signalStrengthChanged"; lineNumber: 46 }
|
||||
Signal { name: "securityChanged"; lineNumber: 47 }
|
||||
Method {
|
||||
name: "connectWithPsk"
|
||||
lineNumber: 39
|
||||
Parameter { name: "psk"; type: "QString" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "enums.hpp"
|
||||
lineNumber: 108
|
||||
name: "qs::network::WifiSecurityType"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Networking/WifiSecurityType 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 114
|
||||
values: [
|
||||
"Wpa3SuiteB192",
|
||||
"Sae",
|
||||
"Wpa2Eap",
|
||||
"Wpa2Psk",
|
||||
"WpaEap",
|
||||
"WpaPsk",
|
||||
"StaticWep",
|
||||
"DynamicWep",
|
||||
"Leap",
|
||||
"Owe",
|
||||
"Open",
|
||||
"Unknown"
|
||||
]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 129
|
||||
Parameter { name: "type"; type: "WifiSecurityType::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "wired.hpp"
|
||||
lineNumber: 15
|
||||
name: "qs::network::WiredDevice"
|
||||
accessSemantics: "reference"
|
||||
prototype: "qs::network::NetworkDevice"
|
||||
exports: ["Quickshell.Networking/WiredDevice 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "network"
|
||||
type: "Network"
|
||||
isPointer: true
|
||||
bindable: "bindableNetwork"
|
||||
read: "network"
|
||||
notify: "networkChanged"
|
||||
index: 0
|
||||
lineNumber: 23
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "linkSpeed"
|
||||
type: "uint"
|
||||
bindable: "bindableLinkSpeed"
|
||||
read: "default"
|
||||
notify: "linkSpeedChanged"
|
||||
index: 1
|
||||
lineNumber: 25
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "hasLink"
|
||||
type: "bool"
|
||||
bindable: "bindableHasLink"
|
||||
read: "default"
|
||||
notify: "hasLinkChanged"
|
||||
index: 2
|
||||
lineNumber: 27
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "networkChanged"; lineNumber: 41 }
|
||||
Signal { name: "linkSpeedChanged"; lineNumber: 42 }
|
||||
Signal { name: "hasLinkChanged"; lineNumber: 43 }
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
module Quickshell.Services.Greetd
|
||||
linktarget quickshell-service-greetdplugin
|
||||
optional plugin quickshell-service-greetdplugin
|
||||
classname Quickshell_Services_GreetdPlugin
|
||||
typeinfo quickshell-service-greetd.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Services/Greetd/
|
||||
depends QtQuick
|
||||
|
||||
+127
@@ -0,0 +1,127 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 16
|
||||
name: "Greetd"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Greetd/Greetd 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "available"
|
||||
type: "bool"
|
||||
read: "isAvailable"
|
||||
index: 0
|
||||
lineNumber: 19
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "state"
|
||||
type: "GreetdState::Enum"
|
||||
read: "state"
|
||||
notify: "stateChanged"
|
||||
index: 1
|
||||
lineNumber: 21
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "user"
|
||||
type: "QString"
|
||||
read: "user"
|
||||
notify: "userChanged"
|
||||
index: 2
|
||||
lineNumber: 23
|
||||
isReadonly: true
|
||||
}
|
||||
Signal {
|
||||
name: "authMessage"
|
||||
lineNumber: 78
|
||||
Parameter { name: "message"; type: "QString" }
|
||||
Parameter { name: "error"; type: "bool" }
|
||||
Parameter { name: "responseRequired"; type: "bool" }
|
||||
Parameter { name: "echoResponse"; type: "bool" }
|
||||
}
|
||||
Signal {
|
||||
name: "authFailure"
|
||||
lineNumber: 82
|
||||
Parameter { name: "message"; type: "QString" }
|
||||
}
|
||||
Signal { name: "readyToLaunch"; lineNumber: 84 }
|
||||
Signal { name: "launched"; lineNumber: 89 }
|
||||
Signal {
|
||||
name: "error"
|
||||
lineNumber: 91
|
||||
Parameter { name: "error"; type: "QString" }
|
||||
}
|
||||
Signal { name: "stateChanged"; lineNumber: 93 }
|
||||
Signal { name: "userChanged"; lineNumber: 94 }
|
||||
Method {
|
||||
name: "createSession"
|
||||
lineNumber: 31
|
||||
Parameter { name: "user"; type: "QString" }
|
||||
}
|
||||
Method { name: "cancelSession"; lineNumber: 33 }
|
||||
Method {
|
||||
name: "respond"
|
||||
lineNumber: 37
|
||||
Parameter { name: "response"; type: "QString" }
|
||||
}
|
||||
Method {
|
||||
name: "launch"
|
||||
lineNumber: 44
|
||||
Parameter { name: "command"; type: "QString"; isList: true }
|
||||
}
|
||||
Method {
|
||||
name: "launch"
|
||||
lineNumber: 47
|
||||
Parameter { name: "command"; type: "QString"; isList: true }
|
||||
Parameter { name: "environment"; type: "QString"; isList: true }
|
||||
}
|
||||
Method {
|
||||
name: "launch"
|
||||
lineNumber: 59
|
||||
Parameter { name: "command"; type: "QString"; isList: true }
|
||||
Parameter { name: "environment"; type: "QString"; isList: true }
|
||||
Parameter { name: "quit"; type: "bool" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "connection.hpp"
|
||||
lineNumber: 15
|
||||
name: "GreetdState"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Greetd/GreetdState 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 21
|
||||
values: [
|
||||
"Inactive",
|
||||
"Authenticating",
|
||||
"ReadyToLaunch",
|
||||
"Launching",
|
||||
"Launched"
|
||||
]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 30
|
||||
Parameter { name: "value"; type: "GreetdState::Enum" }
|
||||
}
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
module Quickshell.Services.Mpris
|
||||
linktarget quickshell-service-mprisplugin
|
||||
optional plugin quickshell-service-mprisplugin
|
||||
classname Quickshell_Services_MprisPlugin
|
||||
typeinfo quickshell-service-mpris.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Services/Mpris/
|
||||
depends Quickshell
|
||||
|
||||
+529
@@ -0,0 +1,529 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "player.hpp"
|
||||
lineNumber: 38
|
||||
name: "qs::service::mpris::MprisLoopState"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Mpris/MprisLoopState 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 44
|
||||
values: ["None", "Track", "Playlist"]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 51
|
||||
Parameter { name: "status"; type: "qs::service::mpris::MprisLoopState::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "player.hpp"
|
||||
lineNumber: 20
|
||||
name: "qs::service::mpris::MprisPlaybackState"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Mpris/MprisPlaybackState 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 26
|
||||
values: ["Stopped", "Playing", "Paused"]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 33
|
||||
Parameter { name: "status"; type: "qs::service::mpris::MprisPlaybackState::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "player.hpp"
|
||||
lineNumber: 87
|
||||
name: "qs::service::mpris::MprisPlayer"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Mpris/MprisPlayer 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "canControl"
|
||||
type: "bool"
|
||||
bindable: "bindableCanControl"
|
||||
read: "default"
|
||||
notify: "canControlChanged"
|
||||
index: 0
|
||||
lineNumber: 90
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "canPlay"
|
||||
type: "bool"
|
||||
bindable: "bindableCanPlay"
|
||||
read: "default"
|
||||
notify: "canPlayChanged"
|
||||
index: 1
|
||||
lineNumber: 91
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "canPause"
|
||||
type: "bool"
|
||||
bindable: "bindableCanPause"
|
||||
read: "default"
|
||||
notify: "canPauseChanged"
|
||||
index: 2
|
||||
lineNumber: 92
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "canTogglePlaying"
|
||||
type: "bool"
|
||||
bindable: "bindableCanTogglePlaying"
|
||||
read: "default"
|
||||
notify: "canTogglePlayingChanged"
|
||||
index: 3
|
||||
lineNumber: 93
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "canSeek"
|
||||
type: "bool"
|
||||
bindable: "bindableCanSeek"
|
||||
read: "default"
|
||||
notify: "canSeekChanged"
|
||||
index: 4
|
||||
lineNumber: 94
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "canGoNext"
|
||||
type: "bool"
|
||||
bindable: "bindableCanGoNext"
|
||||
read: "default"
|
||||
notify: "canGoNextChanged"
|
||||
index: 5
|
||||
lineNumber: 95
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "canGoPrevious"
|
||||
type: "bool"
|
||||
bindable: "bindableCanGoPrevious"
|
||||
read: "default"
|
||||
notify: "canGoPreviousChanged"
|
||||
index: 6
|
||||
lineNumber: 96
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "canQuit"
|
||||
type: "bool"
|
||||
bindable: "bindableCanQuit"
|
||||
read: "default"
|
||||
notify: "canQuitChanged"
|
||||
index: 7
|
||||
lineNumber: 97
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "canRaise"
|
||||
type: "bool"
|
||||
bindable: "bindableCanRaise"
|
||||
read: "default"
|
||||
notify: "canRaiseChanged"
|
||||
index: 8
|
||||
lineNumber: 98
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "canSetFullscreen"
|
||||
type: "bool"
|
||||
bindable: "bindableCanSetFullscreen"
|
||||
read: "default"
|
||||
notify: "canSetFullscreenChanged"
|
||||
index: 9
|
||||
lineNumber: 99
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "identity"
|
||||
type: "QString"
|
||||
bindable: "bindableIdentity"
|
||||
read: "default"
|
||||
notify: "identityChanged"
|
||||
index: 10
|
||||
lineNumber: 101
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "desktopEntry"
|
||||
type: "QString"
|
||||
bindable: "bindableDesktopEntry"
|
||||
read: "default"
|
||||
notify: "desktopEntryChanged"
|
||||
index: 11
|
||||
lineNumber: 103
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "dbusName"
|
||||
type: "QString"
|
||||
read: "address"
|
||||
index: 12
|
||||
lineNumber: 105
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "position"
|
||||
type: "double"
|
||||
read: "position"
|
||||
write: "setPosition"
|
||||
notify: "positionChanged"
|
||||
index: 13
|
||||
lineNumber: 139
|
||||
}
|
||||
Property {
|
||||
name: "positionSupported"
|
||||
type: "bool"
|
||||
read: "positionSupported"
|
||||
notify: "positionSupportedChanged"
|
||||
index: 14
|
||||
lineNumber: 140
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "length"
|
||||
type: "double"
|
||||
read: "length"
|
||||
notify: "lengthChanged"
|
||||
index: 15
|
||||
lineNumber: 143
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "lengthSupported"
|
||||
type: "bool"
|
||||
bindable: "bindableLengthSupported"
|
||||
read: "default"
|
||||
notify: "lengthSupportedChanged"
|
||||
index: 16
|
||||
lineNumber: 144
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "volume"
|
||||
type: "double"
|
||||
read: "volume"
|
||||
write: "setVolume"
|
||||
notify: "volumeChanged"
|
||||
index: 17
|
||||
lineNumber: 148
|
||||
}
|
||||
Property {
|
||||
name: "volumeSupported"
|
||||
type: "bool"
|
||||
read: "volumeSupported"
|
||||
notify: "volumeSupportedChanged"
|
||||
index: 18
|
||||
lineNumber: 149
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "metadata"
|
||||
type: "QVariantMap"
|
||||
bindable: "bindableMetadata"
|
||||
read: "default"
|
||||
notify: "metadataChanged"
|
||||
index: 19
|
||||
lineNumber: 158
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "uniqueId"
|
||||
type: "uint"
|
||||
bindable: "bindableUniqueId"
|
||||
read: "default"
|
||||
notify: "uniqueIdChanged"
|
||||
index: 20
|
||||
lineNumber: 163
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "trackTitle"
|
||||
type: "QString"
|
||||
bindable: "bindableTrackTitle"
|
||||
read: "default"
|
||||
notify: "trackTitleChanged"
|
||||
index: 21
|
||||
lineNumber: 168
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "trackArtist"
|
||||
type: "QString"
|
||||
bindable: "bindableTrackArtist"
|
||||
read: "default"
|
||||
notify: "trackArtistChanged"
|
||||
index: 22
|
||||
lineNumber: 173
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "trackArtists"
|
||||
type: "QString"
|
||||
bindable: "bindableTrackArtist"
|
||||
read: "default"
|
||||
notify: "trackArtistChanged"
|
||||
index: 23
|
||||
lineNumber: 175
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "trackAlbum"
|
||||
type: "QString"
|
||||
bindable: "bindableTrackAlbum"
|
||||
read: "default"
|
||||
notify: "trackAlbumChanged"
|
||||
index: 24
|
||||
lineNumber: 180
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "trackAlbumArtist"
|
||||
type: "QString"
|
||||
bindable: "bindableTrackAlbumArtist"
|
||||
read: "default"
|
||||
notify: "trackAlbumArtistChanged"
|
||||
index: 25
|
||||
lineNumber: 185
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "trackArtUrl"
|
||||
type: "QString"
|
||||
bindable: "bindableTrackArtUrl"
|
||||
read: "default"
|
||||
notify: "trackArtUrlChanged"
|
||||
index: 26
|
||||
lineNumber: 187
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "playbackState"
|
||||
type: "qs::service::mpris::MprisPlaybackState::Enum"
|
||||
read: "playbackState"
|
||||
write: "setPlaybackState"
|
||||
notify: "playbackStateChanged"
|
||||
index: 27
|
||||
lineNumber: 194
|
||||
}
|
||||
Property {
|
||||
name: "isPlaying"
|
||||
type: "bool"
|
||||
read: "isPlaying"
|
||||
write: "setPlaying"
|
||||
notify: "isPlayingChanged"
|
||||
index: 28
|
||||
lineNumber: 199
|
||||
}
|
||||
Property {
|
||||
name: "loopState"
|
||||
type: "qs::service::mpris::MprisLoopState::Enum"
|
||||
read: "loopState"
|
||||
write: "setLoopState"
|
||||
notify: "loopStateChanged"
|
||||
index: 29
|
||||
lineNumber: 203
|
||||
}
|
||||
Property {
|
||||
name: "loopSupported"
|
||||
type: "bool"
|
||||
read: "loopSupported"
|
||||
notify: "loopSupportedChanged"
|
||||
index: 30
|
||||
lineNumber: 204
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "rate"
|
||||
type: "double"
|
||||
read: "rate"
|
||||
write: "setRate"
|
||||
notify: "rateChanged"
|
||||
index: 31
|
||||
lineNumber: 211
|
||||
}
|
||||
Property {
|
||||
name: "minRate"
|
||||
type: "double"
|
||||
bindable: "bindableMinRate"
|
||||
read: "default"
|
||||
notify: "minRateChanged"
|
||||
index: 32
|
||||
lineNumber: 212
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "maxRate"
|
||||
type: "double"
|
||||
bindable: "bindableMaxRate"
|
||||
read: "default"
|
||||
notify: "maxRateChanged"
|
||||
index: 33
|
||||
lineNumber: 213
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "shuffle"
|
||||
type: "bool"
|
||||
read: "shuffle"
|
||||
write: "setShuffle"
|
||||
notify: "shuffleChanged"
|
||||
index: 34
|
||||
lineNumber: 217
|
||||
}
|
||||
Property {
|
||||
name: "shuffleSupported"
|
||||
type: "bool"
|
||||
read: "shuffleSupported"
|
||||
notify: "shuffleSupportedChanged"
|
||||
index: 35
|
||||
lineNumber: 218
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "fullscreen"
|
||||
type: "bool"
|
||||
read: "fullscreen"
|
||||
write: "setFullscreen"
|
||||
notify: "fullscreenChanged"
|
||||
index: 36
|
||||
lineNumber: 222
|
||||
}
|
||||
Property {
|
||||
name: "supportedUriSchemes"
|
||||
type: "QString"
|
||||
isList: true
|
||||
bindable: "bindableSupportedUriSchemes"
|
||||
read: "default"
|
||||
notify: "supportedUriSchemesChanged"
|
||||
index: 37
|
||||
lineNumber: 224
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "supportedMimeTypes"
|
||||
type: "QString"
|
||||
isList: true
|
||||
bindable: "bindableSupportedMimeTypes"
|
||||
read: "default"
|
||||
notify: "supportedMimeTypesChanged"
|
||||
index: 38
|
||||
lineNumber: 226
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "trackChanged"; lineNumber: 359 }
|
||||
Signal { name: "postTrackChanged"; lineNumber: 365 }
|
||||
Signal { name: "ready"; lineNumber: 367 }
|
||||
Signal { name: "canControlChanged"; lineNumber: 368 }
|
||||
Signal { name: "canPlayChanged"; lineNumber: 369 }
|
||||
Signal { name: "canPauseChanged"; lineNumber: 370 }
|
||||
Signal { name: "canTogglePlayingChanged"; lineNumber: 371 }
|
||||
Signal { name: "canSeekChanged"; lineNumber: 372 }
|
||||
Signal { name: "canGoNextChanged"; lineNumber: 373 }
|
||||
Signal { name: "canGoPreviousChanged"; lineNumber: 374 }
|
||||
Signal { name: "canQuitChanged"; lineNumber: 375 }
|
||||
Signal { name: "canRaiseChanged"; lineNumber: 376 }
|
||||
Signal { name: "canSetFullscreenChanged"; lineNumber: 377 }
|
||||
Signal { name: "identityChanged"; lineNumber: 378 }
|
||||
Signal { name: "desktopEntryChanged"; lineNumber: 379 }
|
||||
Signal { name: "positionChanged"; lineNumber: 380 }
|
||||
Signal { name: "positionSupportedChanged"; lineNumber: 381 }
|
||||
Signal { name: "lengthChanged"; lineNumber: 382 }
|
||||
Signal { name: "lengthSupportedChanged"; lineNumber: 383 }
|
||||
Signal { name: "volumeChanged"; lineNumber: 384 }
|
||||
Signal { name: "volumeSupportedChanged"; lineNumber: 385 }
|
||||
Signal { name: "metadataChanged"; lineNumber: 386 }
|
||||
Signal { name: "uniqueIdChanged"; lineNumber: 387 }
|
||||
Signal { name: "trackTitleChanged"; lineNumber: 388 }
|
||||
Signal { name: "trackArtistChanged"; lineNumber: 389 }
|
||||
Signal { name: "trackAlbumChanged"; lineNumber: 390 }
|
||||
Signal { name: "trackAlbumArtistChanged"; lineNumber: 391 }
|
||||
Signal { name: "trackArtUrlChanged"; lineNumber: 392 }
|
||||
Signal { name: "playbackStateChanged"; lineNumber: 393 }
|
||||
Signal { name: "isPlayingChanged"; lineNumber: 394 }
|
||||
Signal { name: "loopStateChanged"; lineNumber: 395 }
|
||||
Signal { name: "loopSupportedChanged"; lineNumber: 396 }
|
||||
Signal { name: "rateChanged"; lineNumber: 397 }
|
||||
Signal { name: "minRateChanged"; lineNumber: 398 }
|
||||
Signal { name: "maxRateChanged"; lineNumber: 399 }
|
||||
Signal { name: "shuffleChanged"; lineNumber: 400 }
|
||||
Signal { name: "shuffleSupportedChanged"; lineNumber: 401 }
|
||||
Signal { name: "fullscreenChanged"; lineNumber: 402 }
|
||||
Signal { name: "supportedUriSchemesChanged"; lineNumber: 403 }
|
||||
Signal { name: "supportedMimeTypesChanged"; lineNumber: 404 }
|
||||
Method { name: "onGetAllFinished"; lineNumber: 407 }
|
||||
Method { name: "onExportedPositionChanged"; lineNumber: 408 }
|
||||
Method {
|
||||
name: "onSeek"
|
||||
lineNumber: 409
|
||||
Parameter { name: "time"; type: "qlonglong" }
|
||||
}
|
||||
Method { name: "raise"; lineNumber: 237 }
|
||||
Method { name: "quit"; lineNumber: 241 }
|
||||
Method {
|
||||
name: "openUri"
|
||||
lineNumber: 246
|
||||
Parameter { name: "uri"; type: "QString" }
|
||||
}
|
||||
Method { name: "next"; lineNumber: 250 }
|
||||
Method { name: "previous"; lineNumber: 254 }
|
||||
Method {
|
||||
name: "seek"
|
||||
lineNumber: 261
|
||||
Parameter { name: "offset"; type: "double" }
|
||||
}
|
||||
Method { name: "play"; lineNumber: 263 }
|
||||
Method { name: "pause"; lineNumber: 265 }
|
||||
Method { name: "stop"; lineNumber: 267 }
|
||||
Method { name: "togglePlaying"; lineNumber: 272 }
|
||||
}
|
||||
Component {
|
||||
file: "watcher.hpp"
|
||||
lineNumber: 45
|
||||
name: "qs::service::mpris::MprisQml"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Mpris/Mpris 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "players"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "players"
|
||||
index: 0
|
||||
lineNumber: 51
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
module Quickshell.Services.Notifications
|
||||
linktarget quickshell-service-notificationsplugin
|
||||
optional plugin quickshell-service-notificationsplugin
|
||||
classname Quickshell_Services_NotificationsPlugin
|
||||
typeinfo quickshell-service-notifications.qmltypes
|
||||
prefer :/qt/qml/Quickshell/Services/Notifications/
|
||||
depends Quickshell
|
||||
depends QtQuick
|
||||
|
||||
+441
@@ -0,0 +1,441 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "notification.hpp"
|
||||
lineNumber: 66
|
||||
name: "qs::service::notifications::Notification"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Notifications/Notification 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "id"
|
||||
type: "uint"
|
||||
read: "id"
|
||||
index: 0
|
||||
lineNumber: 72
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "tracked"
|
||||
type: "bool"
|
||||
read: "isTracked"
|
||||
write: "setTracked"
|
||||
notify: "trackedChanged"
|
||||
index: 1
|
||||
lineNumber: 76
|
||||
}
|
||||
Property {
|
||||
name: "lastGeneration"
|
||||
type: "bool"
|
||||
read: "isLastGeneration"
|
||||
index: 2
|
||||
lineNumber: 82
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "expireTimeout"
|
||||
type: "double"
|
||||
bindable: "bindableExpireTimeout"
|
||||
read: "default"
|
||||
notify: "expireTimeoutChanged"
|
||||
index: 3
|
||||
lineNumber: 84
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "appName"
|
||||
type: "QString"
|
||||
bindable: "bindableAppName"
|
||||
read: "default"
|
||||
notify: "appNameChanged"
|
||||
index: 4
|
||||
lineNumber: 86
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "appIcon"
|
||||
type: "QString"
|
||||
bindable: "bindableAppIcon"
|
||||
read: "default"
|
||||
notify: "appIconChanged"
|
||||
index: 5
|
||||
lineNumber: 89
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "summary"
|
||||
type: "QString"
|
||||
bindable: "bindableSummary"
|
||||
read: "default"
|
||||
notify: "summaryChanged"
|
||||
index: 6
|
||||
lineNumber: 91
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "body"
|
||||
type: "QString"
|
||||
bindable: "bindableBody"
|
||||
read: "default"
|
||||
notify: "bodyChanged"
|
||||
index: 7
|
||||
lineNumber: 92
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "urgency"
|
||||
type: "qs::service::notifications::NotificationUrgency::Enum"
|
||||
bindable: "bindableUrgency"
|
||||
read: "default"
|
||||
notify: "urgencyChanged"
|
||||
index: 8
|
||||
lineNumber: 93
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "actions"
|
||||
type: "QList<qs::service::notifications::NotificationAction*>"
|
||||
read: "actions"
|
||||
notify: "actionsChanged"
|
||||
index: 9
|
||||
lineNumber: 95
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "hasActionIcons"
|
||||
type: "bool"
|
||||
bindable: "bindableHasActionIcons"
|
||||
read: "default"
|
||||
notify: "hasActionIconsChanged"
|
||||
index: 10
|
||||
lineNumber: 99
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "resident"
|
||||
type: "bool"
|
||||
bindable: "bindableResident"
|
||||
read: "default"
|
||||
notify: "residentChanged"
|
||||
index: 11
|
||||
lineNumber: 101
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "transient"
|
||||
type: "bool"
|
||||
bindable: "bindableTransient"
|
||||
read: "default"
|
||||
notify: "transientChanged"
|
||||
index: 12
|
||||
lineNumber: 103
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "desktopEntry"
|
||||
type: "QString"
|
||||
bindable: "bindableDesktopEntry"
|
||||
read: "default"
|
||||
notify: "desktopEntryChanged"
|
||||
index: 13
|
||||
lineNumber: 105
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "image"
|
||||
type: "QString"
|
||||
bindable: "bindableImage"
|
||||
read: "default"
|
||||
notify: "imageChanged"
|
||||
index: 14
|
||||
lineNumber: 109
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "hasInlineReply"
|
||||
type: "bool"
|
||||
bindable: "bindableHasInlineReply"
|
||||
read: "default"
|
||||
notify: "hasInlineReplyChanged"
|
||||
index: 15
|
||||
lineNumber: 113
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "inlineReplyPlaceholder"
|
||||
type: "QString"
|
||||
bindable: "bindableInlineReplyPlaceholder"
|
||||
read: "default"
|
||||
notify: "inlineReplyPlaceholderChanged"
|
||||
index: 16
|
||||
lineNumber: 115
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "hints"
|
||||
type: "QVariantMap"
|
||||
bindable: "bindableHints"
|
||||
read: "default"
|
||||
notify: "hintsChanged"
|
||||
index: 17
|
||||
lineNumber: 118
|
||||
isReadonly: true
|
||||
}
|
||||
Signal {
|
||||
name: "closed"
|
||||
lineNumber: 188
|
||||
Parameter { name: "reason"; type: "qs::service::notifications::NotificationCloseReason::Enum" }
|
||||
}
|
||||
Signal { name: "trackedChanged"; lineNumber: 190 }
|
||||
Signal { name: "expireTimeoutChanged"; lineNumber: 191 }
|
||||
Signal { name: "appNameChanged"; lineNumber: 192 }
|
||||
Signal { name: "appIconChanged"; lineNumber: 193 }
|
||||
Signal { name: "summaryChanged"; lineNumber: 194 }
|
||||
Signal { name: "bodyChanged"; lineNumber: 195 }
|
||||
Signal { name: "urgencyChanged"; lineNumber: 196 }
|
||||
Signal { name: "actionsChanged"; lineNumber: 197 }
|
||||
Signal { name: "hasActionIconsChanged"; lineNumber: 198 }
|
||||
Signal { name: "residentChanged"; lineNumber: 199 }
|
||||
Signal { name: "transientChanged"; lineNumber: 200 }
|
||||
Signal { name: "desktopEntryChanged"; lineNumber: 201 }
|
||||
Signal { name: "imageChanged"; lineNumber: 202 }
|
||||
Signal { name: "hasInlineReplyChanged"; lineNumber: 203 }
|
||||
Signal { name: "inlineReplyPlaceholderChanged"; lineNumber: 204 }
|
||||
Signal { name: "hintsChanged"; lineNumber: 205 }
|
||||
Method { name: "expire"; lineNumber: 128 }
|
||||
Method { name: "dismiss"; lineNumber: 131 }
|
||||
Method {
|
||||
name: "sendInlineReply"
|
||||
lineNumber: 137
|
||||
Parameter { name: "replyText"; type: "QString" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "notification.hpp"
|
||||
lineNumber: 241
|
||||
name: "qs::service::notifications::NotificationAction"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Notifications/NotificationAction 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "identifier"
|
||||
type: "QString"
|
||||
read: "identifier"
|
||||
index: 0
|
||||
lineNumber: 247
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "text"
|
||||
type: "QString"
|
||||
read: "text"
|
||||
notify: "textChanged"
|
||||
index: 1
|
||||
lineNumber: 249
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "textChanged"; lineNumber: 268 }
|
||||
Method { name: "invoke"; lineNumber: 261 }
|
||||
}
|
||||
Component {
|
||||
file: "notification.hpp"
|
||||
lineNumber: 39
|
||||
name: "qs::service::notifications::NotificationCloseReason"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: [
|
||||
"Quickshell.Services.Notifications/NotificationCloseReason 0.0"
|
||||
]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 45
|
||||
values: ["Expired", "Dismissed", "CloseRequested"]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 56
|
||||
Parameter { name: "value"; type: "qs::service::notifications::NotificationCloseReason::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 24
|
||||
name: "qs::service::notifications::NotificationServerQml"
|
||||
accessSemantics: "reference"
|
||||
prototype: "PostReloadHook"
|
||||
exports: ["Quickshell.Services.Notifications/NotificationServer 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "keepOnReload"
|
||||
type: "bool"
|
||||
read: "keepOnReload"
|
||||
write: "setKeepOnReload"
|
||||
notify: "keepOnReloadChanged"
|
||||
index: 0
|
||||
lineNumber: 31
|
||||
}
|
||||
Property {
|
||||
name: "persistenceSupported"
|
||||
type: "bool"
|
||||
read: "persistenceSupported"
|
||||
write: "setPersistenceSupported"
|
||||
notify: "persistenceSupportedChanged"
|
||||
index: 1
|
||||
lineNumber: 34
|
||||
}
|
||||
Property {
|
||||
name: "bodySupported"
|
||||
type: "bool"
|
||||
read: "bodySupported"
|
||||
write: "setBodySupported"
|
||||
notify: "bodySupportedChanged"
|
||||
index: 2
|
||||
lineNumber: 40
|
||||
}
|
||||
Property {
|
||||
name: "bodyMarkupSupported"
|
||||
type: "bool"
|
||||
read: "bodyMarkupSupported"
|
||||
write: "setBodyMarkupSupported"
|
||||
notify: "bodyMarkupSupportedChanged"
|
||||
index: 3
|
||||
lineNumber: 47
|
||||
}
|
||||
Property {
|
||||
name: "bodyHyperlinksSupported"
|
||||
type: "bool"
|
||||
read: "bodyHyperlinksSupported"
|
||||
write: "setBodyHyperlinksSupported"
|
||||
notify: "bodyHyperlinksSupportedChanged"
|
||||
index: 4
|
||||
lineNumber: 54
|
||||
}
|
||||
Property {
|
||||
name: "bodyImagesSupported"
|
||||
type: "bool"
|
||||
read: "bodyImagesSupported"
|
||||
write: "setBodyImagesSupported"
|
||||
notify: "bodyImagesSupportedChanged"
|
||||
index: 5
|
||||
lineNumber: 61
|
||||
}
|
||||
Property {
|
||||
name: "actionsSupported"
|
||||
type: "bool"
|
||||
read: "actionsSupported"
|
||||
write: "setActionsSupported"
|
||||
notify: "actionsSupportedChanged"
|
||||
index: 6
|
||||
lineNumber: 63
|
||||
}
|
||||
Property {
|
||||
name: "actionIconsSupported"
|
||||
type: "bool"
|
||||
read: "actionIconsSupported"
|
||||
write: "setActionIconsSupported"
|
||||
notify: "actionIconsSupportedChanged"
|
||||
index: 7
|
||||
lineNumber: 65
|
||||
}
|
||||
Property {
|
||||
name: "imageSupported"
|
||||
type: "bool"
|
||||
read: "imageSupported"
|
||||
write: "setImageSupported"
|
||||
notify: "imageSupportedChanged"
|
||||
index: 8
|
||||
lineNumber: 67
|
||||
}
|
||||
Property {
|
||||
name: "inlineReplySupported"
|
||||
type: "bool"
|
||||
read: "inlineReplySupported"
|
||||
write: "setInlineReplySupported"
|
||||
notify: "inlineReplySupportedChanged"
|
||||
index: 9
|
||||
lineNumber: 69
|
||||
}
|
||||
Property {
|
||||
name: "trackedNotifications"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "trackedNotifications"
|
||||
notify: "trackedNotificationsChanged"
|
||||
index: 10
|
||||
lineNumber: 72
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "extraHints"
|
||||
type: "QString"
|
||||
isList: true
|
||||
read: "extraHints"
|
||||
write: "setExtraHints"
|
||||
notify: "extraHintsChanged"
|
||||
index: 11
|
||||
lineNumber: 74
|
||||
}
|
||||
Signal {
|
||||
name: "notification"
|
||||
lineNumber: 120
|
||||
Parameter {
|
||||
name: "notification"
|
||||
type: "qs::service::notifications::Notification"
|
||||
isPointer: true
|
||||
}
|
||||
}
|
||||
Signal { name: "keepOnReloadChanged"; lineNumber: 122 }
|
||||
Signal { name: "persistenceSupportedChanged"; lineNumber: 123 }
|
||||
Signal { name: "bodySupportedChanged"; lineNumber: 124 }
|
||||
Signal { name: "bodyMarkupSupportedChanged"; lineNumber: 125 }
|
||||
Signal { name: "bodyHyperlinksSupportedChanged"; lineNumber: 126 }
|
||||
Signal { name: "bodyImagesSupportedChanged"; lineNumber: 127 }
|
||||
Signal { name: "actionsSupportedChanged"; lineNumber: 128 }
|
||||
Signal { name: "actionIconsSupportedChanged"; lineNumber: 129 }
|
||||
Signal { name: "imageSupportedChanged"; lineNumber: 130 }
|
||||
Signal { name: "inlineReplySupportedChanged"; lineNumber: 131 }
|
||||
Signal { name: "extraHintsChanged"; lineNumber: 132 }
|
||||
Signal { name: "trackedNotificationsChanged"; lineNumber: 133 }
|
||||
}
|
||||
Component {
|
||||
file: "notification.hpp"
|
||||
lineNumber: 21
|
||||
name: "qs::service::notifications::NotificationUrgency"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Notifications/NotificationUrgency 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 27
|
||||
values: ["Low", "Normal", "Critical"]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 34
|
||||
Parameter { name: "value"; type: "qs::service::notifications::NotificationUrgency::Enum" }
|
||||
}
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
module Quickshell.Services.Pam
|
||||
linktarget quickshell-service-pamplugin
|
||||
optional plugin quickshell-service-pamplugin
|
||||
classname Quickshell_Services_PamPlugin
|
||||
typeinfo quickshell-service-pam.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Services/Pam/
|
||||
depends QtQuick
|
||||
|
||||
+181
@@ -0,0 +1,181 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 20
|
||||
name: "PamContext"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
interfaces: ["QQmlParserStatus"]
|
||||
exports: ["Quickshell.Services.Pam/PamContext 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "active"
|
||||
type: "bool"
|
||||
read: "isActive"
|
||||
write: "setActive"
|
||||
notify: "activeChanged"
|
||||
index: 0
|
||||
lineNumber: 31
|
||||
}
|
||||
Property {
|
||||
name: "config"
|
||||
type: "QString"
|
||||
read: "config"
|
||||
write: "setConfig"
|
||||
notify: "configChanged"
|
||||
index: 1
|
||||
lineNumber: 37
|
||||
}
|
||||
Property {
|
||||
name: "configDirectory"
|
||||
type: "QString"
|
||||
read: "configDirectory"
|
||||
write: "setConfigDirectory"
|
||||
notify: "configDirectoryChanged"
|
||||
index: 2
|
||||
lineNumber: 45
|
||||
}
|
||||
Property {
|
||||
name: "user"
|
||||
type: "QString"
|
||||
read: "user"
|
||||
write: "setUser"
|
||||
notify: "userChanged"
|
||||
index: 3
|
||||
lineNumber: 49
|
||||
}
|
||||
Property {
|
||||
name: "message"
|
||||
type: "QString"
|
||||
read: "message"
|
||||
notify: "messageChanged"
|
||||
index: 4
|
||||
lineNumber: 51
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "messageIsError"
|
||||
type: "bool"
|
||||
read: "messageIsError"
|
||||
notify: "messageIsErrorChanged"
|
||||
index: 5
|
||||
lineNumber: 53
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "responseRequired"
|
||||
type: "bool"
|
||||
read: "isResponseRequired"
|
||||
notify: "responseRequiredChanged"
|
||||
index: 6
|
||||
lineNumber: 57
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "responseVisible"
|
||||
type: "bool"
|
||||
read: "isResponseVisible"
|
||||
notify: "responseVisibleChanged"
|
||||
index: 7
|
||||
lineNumber: 59
|
||||
isReadonly: true
|
||||
}
|
||||
Signal {
|
||||
name: "completed"
|
||||
lineNumber: 101
|
||||
Parameter { name: "result"; type: "PamResult::Enum" }
|
||||
}
|
||||
Signal {
|
||||
name: "error"
|
||||
lineNumber: 105
|
||||
Parameter { name: "error"; type: "PamError::Enum" }
|
||||
}
|
||||
Signal { name: "pamMessage"; lineNumber: 109 }
|
||||
Signal { name: "activeChanged"; lineNumber: 111 }
|
||||
Signal { name: "configChanged"; lineNumber: 112 }
|
||||
Signal { name: "configDirectoryChanged"; lineNumber: 113 }
|
||||
Signal { name: "userChanged"; lineNumber: 114 }
|
||||
Signal { name: "messageChanged"; lineNumber: 115 }
|
||||
Signal { name: "messageIsErrorChanged"; lineNumber: 116 }
|
||||
Signal { name: "responseRequiredChanged"; lineNumber: 117 }
|
||||
Signal { name: "responseVisibleChanged"; lineNumber: 118 }
|
||||
Method {
|
||||
name: "onCompleted"
|
||||
lineNumber: 121
|
||||
Parameter { name: "result"; type: "PamResult::Enum" }
|
||||
}
|
||||
Method {
|
||||
name: "onError"
|
||||
lineNumber: 122
|
||||
Parameter { name: "error"; type: "PamError::Enum" }
|
||||
}
|
||||
Method {
|
||||
name: "onMessage"
|
||||
lineNumber: 123
|
||||
Parameter { name: "message"; type: "QString" }
|
||||
Parameter { name: "isError"; type: "bool" }
|
||||
Parameter { name: "responseRequired"; type: "bool" }
|
||||
Parameter { name: "responseVisible"; type: "bool" }
|
||||
}
|
||||
Method { name: "start"; type: "bool"; lineNumber: 72 }
|
||||
Method { name: "abort"; lineNumber: 75 }
|
||||
Method {
|
||||
name: "respond"
|
||||
lineNumber: 80
|
||||
Parameter { name: "response"; type: "QString" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "conversation.hpp"
|
||||
lineNumber: 41
|
||||
name: "PamError"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pam/PamError 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 47
|
||||
values: ["StartFailed", "TryAuthFailed", "InternalError"]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 58
|
||||
Parameter { name: "value"; type: "PamError::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "conversation.hpp"
|
||||
lineNumber: 18
|
||||
name: "PamResult"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pam/PamResult 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 24
|
||||
values: ["Success", "Failed", "Error", "MaxTries"]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 36
|
||||
Parameter { name: "value"; type: "PamResult::Enum" }
|
||||
}
|
||||
}
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
module Quickshell.Services.Pipewire
|
||||
linktarget quickshell-service-pipewireplugin
|
||||
optional plugin quickshell-service-pipewireplugin
|
||||
classname Quickshell_Services_PipewirePlugin
|
||||
typeinfo quickshell-service-pipewire.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Services/Pipewire/
|
||||
depends Quickshell
|
||||
depends QtQuick
|
||||
|
||||
+646
@@ -0,0 +1,646 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 56
|
||||
name: "qs::service::pipewire::Pipewire"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pipewire/Pipewire 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "nodes"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "nodes"
|
||||
index: 0
|
||||
lineNumber: 67
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "links"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "links"
|
||||
index: 1
|
||||
lineNumber: 79
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "linkGroups"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "linkGroups"
|
||||
index: 2
|
||||
lineNumber: 87
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "defaultAudioSink"
|
||||
type: "qs::service::pipewire::PwNodeIface"
|
||||
isPointer: true
|
||||
read: "defaultAudioSink"
|
||||
notify: "defaultAudioSinkChanged"
|
||||
index: 3
|
||||
lineNumber: 97
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "defaultAudioSource"
|
||||
type: "qs::service::pipewire::PwNodeIface"
|
||||
isPointer: true
|
||||
read: "defaultAudioSource"
|
||||
notify: "defaultAudioSourceChanged"
|
||||
index: 4
|
||||
lineNumber: 107
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "preferredDefaultAudioSink"
|
||||
type: "qs::service::pipewire::PwNodeIface"
|
||||
isPointer: true
|
||||
read: "defaultConfiguredAudioSink"
|
||||
write: "setDefaultConfiguredAudioSink"
|
||||
notify: "defaultConfiguredAudioSinkChanged"
|
||||
index: 5
|
||||
lineNumber: 114
|
||||
}
|
||||
Property {
|
||||
name: "preferredDefaultAudioSource"
|
||||
type: "qs::service::pipewire::PwNodeIface"
|
||||
isPointer: true
|
||||
read: "defaultConfiguredAudioSource"
|
||||
write: "setDefaultConfiguredAudioSource"
|
||||
notify: "defaultConfiguredAudioSourceChanged"
|
||||
index: 6
|
||||
lineNumber: 121
|
||||
}
|
||||
Property {
|
||||
name: "ready"
|
||||
type: "bool"
|
||||
read: "isReady"
|
||||
notify: "readyChanged"
|
||||
index: 7
|
||||
lineNumber: 128
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "defaultAudioSinkChanged"; lineNumber: 152 }
|
||||
Signal { name: "defaultAudioSourceChanged"; lineNumber: 153 }
|
||||
Signal { name: "defaultConfiguredAudioSinkChanged"; lineNumber: 155 }
|
||||
Signal { name: "defaultConfiguredAudioSourceChanged"; lineNumber: 156 }
|
||||
Signal { name: "readyChanged"; lineNumber: 158 }
|
||||
Method {
|
||||
name: "onNodeAdded"
|
||||
lineNumber: 161
|
||||
Parameter { name: "node"; type: "PwNode"; isPointer: true }
|
||||
}
|
||||
Method {
|
||||
name: "onNodeRemoved"
|
||||
lineNumber: 162
|
||||
Parameter { name: "object"; type: "QObject"; isPointer: true }
|
||||
}
|
||||
Method {
|
||||
name: "onLinkAdded"
|
||||
lineNumber: 163
|
||||
Parameter { name: "link"; type: "PwLink"; isPointer: true }
|
||||
}
|
||||
Method {
|
||||
name: "onLinkRemoved"
|
||||
lineNumber: 164
|
||||
Parameter { name: "object"; type: "QObject"; isPointer: true }
|
||||
}
|
||||
Method {
|
||||
name: "onLinkGroupAdded"
|
||||
lineNumber: 165
|
||||
Parameter { name: "group"; type: "PwLinkGroup"; isPointer: true }
|
||||
}
|
||||
Method {
|
||||
name: "onLinkGroupRemoved"
|
||||
lineNumber: 166
|
||||
Parameter { name: "object"; type: "QObject"; isPointer: true }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "node.hpp"
|
||||
lineNumber: 27
|
||||
name: "qs::service::pipewire::PwAudioChannel"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pipewire/PwAudioChannel 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
lineNumber: 33
|
||||
values: [
|
||||
"Unknown",
|
||||
"NA",
|
||||
"Mono",
|
||||
"FrontCenter",
|
||||
"FrontLeft",
|
||||
"FrontRight",
|
||||
"FrontLeftCenter",
|
||||
"FrontRightCenter",
|
||||
"FrontLeftWide",
|
||||
"FrontRightWide",
|
||||
"FrontCenterHigh",
|
||||
"FrontLeftHigh",
|
||||
"FrontRightHigh",
|
||||
"LowFrequencyEffects",
|
||||
"LowFrequencyEffects2",
|
||||
"LowFrequencyEffectsLeft",
|
||||
"LowFrequencyEffectsRight",
|
||||
"SideLeft",
|
||||
"SideRight",
|
||||
"RearCenter",
|
||||
"RearLeft",
|
||||
"RearRight",
|
||||
"RearLeftCenter",
|
||||
"RearRightCenter",
|
||||
"TopCenter",
|
||||
"TopFrontCenter",
|
||||
"TopFrontLeft",
|
||||
"TopFrontRight",
|
||||
"TopFrontLeftCenter",
|
||||
"TopFrontRightCenter",
|
||||
"TopSideLeft",
|
||||
"TopSideRight",
|
||||
"TopRearCenter",
|
||||
"TopRearLeft",
|
||||
"TopRearRight",
|
||||
"BottomCenter",
|
||||
"BottomLeftCenter",
|
||||
"BottomRightCenter",
|
||||
"AuxRangeStart",
|
||||
"AuxRangeEnd",
|
||||
"CustomRangeStart"
|
||||
]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 89
|
||||
Parameter { name: "value"; type: "qs::service::pipewire::PwAudioChannel::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 388
|
||||
name: "qs::service::pipewire::PwLinkGroupIface"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pipewire/PwLinkGroup 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "target"
|
||||
type: "qs::service::pipewire::PwNodeIface"
|
||||
isPointer: true
|
||||
read: "target"
|
||||
index: 0
|
||||
lineNumber: 393
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "source"
|
||||
type: "qs::service::pipewire::PwNodeIface"
|
||||
isPointer: true
|
||||
read: "source"
|
||||
index: 1
|
||||
lineNumber: 395
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "state"
|
||||
type: "qs::service::pipewire::PwLinkState::Enum"
|
||||
read: "state"
|
||||
notify: "stateChanged"
|
||||
index: 2
|
||||
lineNumber: 399
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "stateChanged"; lineNumber: 420 }
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 350
|
||||
name: "qs::service::pipewire::PwLinkIface"
|
||||
accessSemantics: "reference"
|
||||
prototype: "qs::service::pipewire::PwObjectIface"
|
||||
exports: ["Quickshell.Services.Pipewire/PwLink 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "id"
|
||||
type: "uint"
|
||||
read: "id"
|
||||
index: 0
|
||||
lineNumber: 356
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "target"
|
||||
type: "qs::service::pipewire::PwNodeIface"
|
||||
isPointer: true
|
||||
read: "target"
|
||||
index: 1
|
||||
lineNumber: 358
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "source"
|
||||
type: "qs::service::pipewire::PwNodeIface"
|
||||
isPointer: true
|
||||
read: "source"
|
||||
index: 2
|
||||
lineNumber: 360
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "state"
|
||||
type: "PwLinkState::Enum"
|
||||
read: "state"
|
||||
notify: "stateChanged"
|
||||
index: 3
|
||||
lineNumber: 364
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "stateChanged"; lineNumber: 380 }
|
||||
}
|
||||
Component {
|
||||
file: "link.hpp"
|
||||
lineNumber: 18
|
||||
name: "qs::service::pipewire::PwLinkState"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pipewire/PwLinkState 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "qint8"
|
||||
lineNumber: 24
|
||||
values: [
|
||||
"Error",
|
||||
"Unlinked",
|
||||
"Init",
|
||||
"Negotiating",
|
||||
"Allocating",
|
||||
"Paused",
|
||||
"Active"
|
||||
]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 35
|
||||
Parameter { name: "value"; type: "qs::service::pipewire::PwLinkState::Enum" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 220
|
||||
name: "qs::service::pipewire::PwNodeAudioIface"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pipewire/PwNodeAudio 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "muted"
|
||||
type: "bool"
|
||||
read: "isMuted"
|
||||
write: "setMuted"
|
||||
notify: "mutedChanged"
|
||||
index: 0
|
||||
lineNumber: 226
|
||||
}
|
||||
Property {
|
||||
name: "volume"
|
||||
type: "float"
|
||||
read: "averageVolume"
|
||||
write: "setAverageVolume"
|
||||
notify: "volumesChanged"
|
||||
index: 1
|
||||
lineNumber: 231
|
||||
}
|
||||
Property {
|
||||
name: "channels"
|
||||
type: "qs::service::pipewire::PwAudioChannel::Enum"
|
||||
isList: true
|
||||
read: "channels"
|
||||
notify: "channelsChanged"
|
||||
index: 2
|
||||
lineNumber: 235
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "volumes"
|
||||
type: "float"
|
||||
isList: true
|
||||
read: "volumes"
|
||||
write: "setVolumes"
|
||||
notify: "volumesChanged"
|
||||
index: 3
|
||||
lineNumber: 241
|
||||
}
|
||||
Signal { name: "mutedChanged"; lineNumber: 261 }
|
||||
Signal { name: "channelsChanged"; lineNumber: 262 }
|
||||
Signal { name: "volumesChanged"; lineNumber: 263 }
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 270
|
||||
name: "qs::service::pipewire::PwNodeIface"
|
||||
accessSemantics: "reference"
|
||||
prototype: "qs::service::pipewire::PwObjectIface"
|
||||
exports: ["Quickshell.Services.Pipewire/PwNode 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "id"
|
||||
type: "uint"
|
||||
read: "id"
|
||||
index: 0
|
||||
lineNumber: 276
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "name"
|
||||
type: "QString"
|
||||
read: "name"
|
||||
index: 1
|
||||
lineNumber: 278
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "description"
|
||||
type: "QString"
|
||||
read: "description"
|
||||
index: 2
|
||||
lineNumber: 282
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "nickname"
|
||||
type: "QString"
|
||||
read: "nickname"
|
||||
index: 3
|
||||
lineNumber: 286
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "isSink"
|
||||
type: "bool"
|
||||
read: "isSink"
|
||||
index: 4
|
||||
lineNumber: 289
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "isStream"
|
||||
type: "bool"
|
||||
read: "isStream"
|
||||
index: 5
|
||||
lineNumber: 292
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "type"
|
||||
type: "qs::service::pipewire::PwNodeType::Flags"
|
||||
read: "type"
|
||||
index: 6
|
||||
lineNumber: 294
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "properties"
|
||||
type: "QVariantMap"
|
||||
read: "properties"
|
||||
notify: "propertiesChanged"
|
||||
index: 7
|
||||
lineNumber: 307
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "audio"
|
||||
type: "qs::service::pipewire::PwNodeAudioIface"
|
||||
isPointer: true
|
||||
read: "audio"
|
||||
index: 8
|
||||
lineNumber: 312
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "ready"
|
||||
type: "bool"
|
||||
read: "isReady"
|
||||
notify: "readyChanged"
|
||||
index: 9
|
||||
lineNumber: 317
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "propertiesChanged"; lineNumber: 339 }
|
||||
Signal { name: "readyChanged"; lineNumber: 340 }
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 175
|
||||
name: "qs::service::pipewire::PwNodeLinkTracker"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pipewire/PwNodeLinkTracker 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "node"
|
||||
type: "qs::service::pipewire::PwNodeIface"
|
||||
isPointer: true
|
||||
read: "node"
|
||||
write: "setNode"
|
||||
notify: "nodeChanged"
|
||||
index: 0
|
||||
lineNumber: 179
|
||||
}
|
||||
Property {
|
||||
name: "linkGroups"
|
||||
type: "qs::service::pipewire::PwLinkGroupIface"
|
||||
isList: true
|
||||
read: "linkGroups"
|
||||
notify: "linkGroupsChanged"
|
||||
index: 1
|
||||
lineNumber: 184
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "nodeChanged"; lineNumber: 197 }
|
||||
Signal { name: "linkGroupsChanged"; lineNumber: 198 }
|
||||
Method { name: "onNodeDestroyed"; lineNumber: 201 }
|
||||
Method {
|
||||
name: "onLinkGroupCreated"
|
||||
lineNumber: 202
|
||||
Parameter { name: "linkGroup"; type: "PwLinkGroup"; isPointer: true }
|
||||
}
|
||||
Method {
|
||||
name: "onLinkGroupDestroyed"
|
||||
lineNumber: 203
|
||||
Parameter { name: "object"; type: "QObject"; isPointer: true }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "peak.hpp"
|
||||
lineNumber: 21
|
||||
name: "qs::service::pipewire::PwNodePeakMonitor"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pipewire/PwNodePeakMonitor 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "node"
|
||||
type: "qs::service::pipewire::PwNodeIface"
|
||||
isPointer: true
|
||||
read: "node"
|
||||
write: "setNode"
|
||||
notify: "nodeChanged"
|
||||
index: 0
|
||||
lineNumber: 25
|
||||
}
|
||||
Property {
|
||||
name: "enabled"
|
||||
type: "bool"
|
||||
read: "isEnabled"
|
||||
write: "setEnabled"
|
||||
notify: "enabledChanged"
|
||||
index: 1
|
||||
lineNumber: 27
|
||||
}
|
||||
Property {
|
||||
name: "peaks"
|
||||
type: "float"
|
||||
isList: true
|
||||
read: "peaks"
|
||||
notify: "peaksChanged"
|
||||
index: 2
|
||||
lineNumber: 31
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "peak"
|
||||
type: "float"
|
||||
read: "peak"
|
||||
notify: "peakChanged"
|
||||
index: 3
|
||||
lineNumber: 33
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "channels"
|
||||
type: "qs::service::pipewire::PwAudioChannel::Enum"
|
||||
isList: true
|
||||
read: "channels"
|
||||
notify: "channelsChanged"
|
||||
index: 4
|
||||
lineNumber: 35
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "nodeChanged"; lineNumber: 55 }
|
||||
Signal { name: "enabledChanged"; lineNumber: 56 }
|
||||
Signal { name: "peaksChanged"; lineNumber: 57 }
|
||||
Signal { name: "peakChanged"; lineNumber: 58 }
|
||||
Signal { name: "channelsChanged"; lineNumber: 59 }
|
||||
Method { name: "onNodeDestroyed"; lineNumber: 62 }
|
||||
}
|
||||
Component {
|
||||
file: "node.hpp"
|
||||
lineNumber: 93
|
||||
name: "qs::service::pipewire::PwNodeType"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pipewire/PwNodeType 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Flag"
|
||||
type: "quint8"
|
||||
lineNumber: 99
|
||||
values: [
|
||||
"Untracked",
|
||||
"Audio",
|
||||
"Video",
|
||||
"Stream",
|
||||
"Source",
|
||||
"Sink",
|
||||
"AudioSink",
|
||||
"AudioSource",
|
||||
"AudioDuplex",
|
||||
"AudioOutStream",
|
||||
"AudioInStream",
|
||||
"VideoSource",
|
||||
"VideoSink"
|
||||
]
|
||||
}
|
||||
Method {
|
||||
name: "toString"
|
||||
type: "QString"
|
||||
lineNumber: 151
|
||||
Parameter { name: "type"; type: "qs::service::pipewire::PwNodeType::Flags" }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 33
|
||||
name: "qs::service::pipewire::PwObjectIface"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
Method { name: "onObjectDestroying"; lineNumber: 48 }
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 437
|
||||
name: "qs::service::pipewire::PwObjectTracker"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Pipewire/PwObjectTracker 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "objects"
|
||||
type: "QObjectList"
|
||||
read: "objects"
|
||||
write: "setObjects"
|
||||
notify: "objectsChanged"
|
||||
index: 0
|
||||
lineNumber: 440
|
||||
}
|
||||
Signal { name: "objectsChanged"; lineNumber: 452 }
|
||||
Method {
|
||||
name: "objectDestroyed"
|
||||
lineNumber: 455
|
||||
Parameter { name: "object"; type: "QObject"; isPointer: true }
|
||||
}
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
module Quickshell.Services.Polkit
|
||||
linktarget quickshell-service-polkitplugin
|
||||
optional plugin quickshell-service-polkitplugin
|
||||
classname Quickshell_Services_PolkitPlugin
|
||||
typeinfo quickshell-service-polkit.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Services/Polkit/
|
||||
depends QtQuick
|
||||
|
||||
+251
@@ -0,0 +1,251 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "flow.hpp"
|
||||
lineNumber: 14
|
||||
name: "qs::service::polkit::AuthFlow"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.Polkit/AuthFlow 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "message"
|
||||
type: "QString"
|
||||
read: "message"
|
||||
index: 0
|
||||
lineNumber: 24
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "iconName"
|
||||
type: "QString"
|
||||
read: "iconName"
|
||||
index: 1
|
||||
lineNumber: 31
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "actionId"
|
||||
type: "QString"
|
||||
read: "actionId"
|
||||
index: 2
|
||||
lineNumber: 36
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "cookie"
|
||||
type: "QString"
|
||||
read: "cookie"
|
||||
index: 3
|
||||
lineNumber: 41
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "identities"
|
||||
type: "QList<Identity*>"
|
||||
read: "identities"
|
||||
index: 4
|
||||
lineNumber: 48
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Property {
|
||||
name: "selectedIdentity"
|
||||
type: "Identity"
|
||||
isPointer: true
|
||||
bindable: "selectedIdentity"
|
||||
read: "default"
|
||||
write: "setSelectedIdentity"
|
||||
notify: "selectedIdentityChanged"
|
||||
index: 5
|
||||
lineNumber: 53
|
||||
}
|
||||
Property {
|
||||
name: "isResponseRequired"
|
||||
type: "bool"
|
||||
bindable: "isResponseRequired"
|
||||
read: "default"
|
||||
notify: "isResponseRequiredChanged"
|
||||
index: 6
|
||||
lineNumber: 57
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "inputPrompt"
|
||||
type: "QString"
|
||||
bindable: "inputPrompt"
|
||||
read: "default"
|
||||
notify: "inputPromptChanged"
|
||||
index: 7
|
||||
lineNumber: 60
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "responseVisible"
|
||||
type: "bool"
|
||||
bindable: "responseVisible"
|
||||
read: "default"
|
||||
notify: "responseVisibleChanged"
|
||||
index: 8
|
||||
lineNumber: 63
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "supplementaryMessage"
|
||||
type: "QString"
|
||||
bindable: "supplementaryMessage"
|
||||
read: "default"
|
||||
notify: "supplementaryMessageChanged"
|
||||
index: 9
|
||||
lineNumber: 69
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "supplementaryIsError"
|
||||
type: "bool"
|
||||
bindable: "supplementaryIsError"
|
||||
read: "default"
|
||||
notify: "supplementaryIsErrorChanged"
|
||||
index: 10
|
||||
lineNumber: 72
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "isCompleted"
|
||||
type: "bool"
|
||||
bindable: "isCompleted"
|
||||
read: "default"
|
||||
notify: "isCompletedChanged"
|
||||
index: 11
|
||||
lineNumber: 75
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "isSuccessful"
|
||||
type: "bool"
|
||||
bindable: "isSuccessful"
|
||||
read: "default"
|
||||
notify: "isSuccessfulChanged"
|
||||
index: 12
|
||||
lineNumber: 78
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "isCancelled"
|
||||
type: "bool"
|
||||
bindable: "isCancelled"
|
||||
read: "default"
|
||||
notify: "isCancelledChanged"
|
||||
index: 13
|
||||
lineNumber: 81
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "failed"
|
||||
type: "bool"
|
||||
bindable: "failed"
|
||||
read: "default"
|
||||
notify: "failedChanged"
|
||||
index: 14
|
||||
lineNumber: 84
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "authenticationSucceeded"; lineNumber: 124 }
|
||||
Signal { name: "authenticationFailed"; lineNumber: 135 }
|
||||
Signal { name: "authenticationRequestCancelled"; lineNumber: 138 }
|
||||
Signal { name: "selectedIdentityChanged"; lineNumber: 140 }
|
||||
Signal { name: "isResponseRequiredChanged"; lineNumber: 141 }
|
||||
Signal { name: "inputPromptChanged"; lineNumber: 142 }
|
||||
Signal { name: "responseVisibleChanged"; lineNumber: 143 }
|
||||
Signal { name: "supplementaryMessageChanged"; lineNumber: 144 }
|
||||
Signal { name: "supplementaryIsErrorChanged"; lineNumber: 145 }
|
||||
Signal { name: "isCompletedChanged"; lineNumber: 146 }
|
||||
Signal { name: "isSuccessfulChanged"; lineNumber: 147 }
|
||||
Signal { name: "isCancelledChanged"; lineNumber: 148 }
|
||||
Signal { name: "failedChanged"; lineNumber: 149 }
|
||||
Method {
|
||||
name: "request"
|
||||
lineNumber: 153
|
||||
Parameter { name: "message"; type: "QString" }
|
||||
Parameter { name: "echo"; type: "bool" }
|
||||
}
|
||||
Method {
|
||||
name: "completed"
|
||||
lineNumber: 154
|
||||
Parameter { name: "gainedAuthorization"; type: "bool" }
|
||||
}
|
||||
Method {
|
||||
name: "showError"
|
||||
lineNumber: 155
|
||||
Parameter { name: "message"; type: "QString" }
|
||||
}
|
||||
Method {
|
||||
name: "showInfo"
|
||||
lineNumber: 156
|
||||
Parameter { name: "message"; type: "QString" }
|
||||
}
|
||||
Method {
|
||||
name: "submit"
|
||||
lineNumber: 95
|
||||
Parameter { name: "value"; type: "QString" }
|
||||
}
|
||||
Method { name: "cancelAuthenticationRequest"; lineNumber: 97 }
|
||||
}
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 25
|
||||
name: "qs::service::polkit::PolkitAgent"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
interfaces: ["QQmlParserStatus"]
|
||||
exports: ["Quickshell.Services.Polkit/PolkitAgent 0.0"]
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property { name: "path"; type: "QString"; read: "path"; write: "setPath"; index: 0; lineNumber: 36 }
|
||||
Property {
|
||||
name: "isRegistered"
|
||||
type: "bool"
|
||||
bindable: "isRegistered"
|
||||
read: "default"
|
||||
notify: "isRegisteredChanged"
|
||||
index: 1
|
||||
lineNumber: 39
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "isActive"
|
||||
type: "bool"
|
||||
bindable: "isActive"
|
||||
read: "default"
|
||||
notify: "isActiveChanged"
|
||||
index: 2
|
||||
lineNumber: 45
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "flow"
|
||||
type: "AuthFlow"
|
||||
isPointer: true
|
||||
bindable: "flow"
|
||||
read: "default"
|
||||
notify: "flowChanged"
|
||||
index: 3
|
||||
lineNumber: 50
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "authenticationRequestStarted"; lineNumber: 71 }
|
||||
Signal { name: "isRegisteredChanged"; lineNumber: 73 }
|
||||
Signal { name: "isActiveChanged"; lineNumber: 74 }
|
||||
Signal { name: "flowChanged"; lineNumber: 75 }
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
module Quickshell.Services.SystemTray
|
||||
linktarget quickshell-service-statusnotifierplugin
|
||||
optional plugin quickshell-service-statusnotifierplugin
|
||||
classname Quickshell_Services_SystemTrayPlugin
|
||||
typeinfo quickshell-service-statusnotifier.qmltypes
|
||||
depends QtQml
|
||||
prefer :/qt/qml/Quickshell/Services/SystemTray/
|
||||
depends Quickshell
|
||||
depends Quickshell.DBusMenu
|
||||
depends QtQuick
|
||||
|
||||
+211
@@ -0,0 +1,211 @@
|
||||
import QtQuick.tooling 1.2
|
||||
|
||||
// This file describes the plugin-supplied types contained in the library.
|
||||
// It is used for QML tooling purposes only.
|
||||
//
|
||||
// This file was auto-generated by qmltyperegistrar.
|
||||
|
||||
Module {
|
||||
Component {
|
||||
file: "qml.hpp"
|
||||
lineNumber: 16
|
||||
name: "SystemTray"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.SystemTray/SystemTray 0.0"]
|
||||
isCreatable: false
|
||||
isSingleton: true
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "items"
|
||||
type: "UntypedObjectModel"
|
||||
isPointer: true
|
||||
read: "items"
|
||||
index: 0
|
||||
lineNumber: 20
|
||||
isReadonly: true
|
||||
isPropertyConstant: true
|
||||
}
|
||||
Method {
|
||||
name: "onItemRegistered"
|
||||
lineNumber: 30
|
||||
Parameter { name: "item"; type: "qs::service::sni::StatusNotifierItem"; isPointer: true }
|
||||
}
|
||||
Method {
|
||||
name: "onItemUnregistered"
|
||||
lineNumber: 31
|
||||
Parameter { name: "item"; type: "qs::service::sni::StatusNotifierItem"; isPointer: true }
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "item.hpp"
|
||||
lineNumber: 43
|
||||
name: "qs::service::sni::Category"
|
||||
accessSemantics: "none"
|
||||
exports: ["Quickshell.Services.SystemTray/Category 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 47
|
||||
values: [
|
||||
"Hardware",
|
||||
"SystemServices",
|
||||
"ApplicationStatus",
|
||||
"Communications"
|
||||
]
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "item.hpp"
|
||||
lineNumber: 26
|
||||
name: "qs::service::sni::Status"
|
||||
accessSemantics: "none"
|
||||
exports: ["Quickshell.Services.SystemTray/Status 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Enum {
|
||||
name: "Enum"
|
||||
type: "quint8"
|
||||
lineNumber: 30
|
||||
values: ["Passive", "Active", "NeedsAttention"]
|
||||
}
|
||||
}
|
||||
Component {
|
||||
file: "item.hpp"
|
||||
lineNumber: 100
|
||||
name: "qs::service::sni::StatusNotifierItem"
|
||||
accessSemantics: "reference"
|
||||
prototype: "QObject"
|
||||
exports: ["Quickshell.Services.SystemTray/SystemTrayItem 0.0"]
|
||||
isCreatable: false
|
||||
exportMetaObjectRevisions: [0]
|
||||
Property {
|
||||
name: "id"
|
||||
type: "QString"
|
||||
bindable: "bindableId"
|
||||
read: "default"
|
||||
notify: "idChanged"
|
||||
index: 0
|
||||
lineNumber: 105
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "title"
|
||||
type: "QString"
|
||||
bindable: "bindableTitle"
|
||||
read: "default"
|
||||
notify: "titleChanged"
|
||||
index: 1
|
||||
lineNumber: 107
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "status"
|
||||
type: "qs::service::sni::Status::Enum"
|
||||
bindable: "bindableStatus"
|
||||
read: "default"
|
||||
notify: "statusChanged"
|
||||
index: 2
|
||||
lineNumber: 108
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "category"
|
||||
type: "qs::service::sni::Category::Enum"
|
||||
bindable: "bindableCategory"
|
||||
read: "default"
|
||||
notify: "categoryChanged"
|
||||
index: 3
|
||||
lineNumber: 109
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "icon"
|
||||
type: "QString"
|
||||
bindable: "bindableIcon"
|
||||
read: "default"
|
||||
notify: "iconChanged"
|
||||
index: 4
|
||||
lineNumber: 111
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "tooltipTitle"
|
||||
type: "QString"
|
||||
read: "tooltipTitle"
|
||||
notify: "tooltipTitleChanged"
|
||||
index: 5
|
||||
lineNumber: 112
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "tooltipDescription"
|
||||
type: "QString"
|
||||
read: "tooltipDescription"
|
||||
notify: "tooltipDescriptionChanged"
|
||||
index: 6
|
||||
lineNumber: 113
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "hasMenu"
|
||||
type: "bool"
|
||||
bindable: "bindableHasMenu"
|
||||
read: "default"
|
||||
notify: "hasMenuChanged"
|
||||
index: 7
|
||||
lineNumber: 115
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "menu"
|
||||
type: "qs::dbus::dbusmenu::DBusMenuHandle"
|
||||
isPointer: true
|
||||
read: "menuHandle"
|
||||
notify: "hasMenuChanged"
|
||||
index: 8
|
||||
lineNumber: 119
|
||||
isReadonly: true
|
||||
}
|
||||
Property {
|
||||
name: "onlyMenu"
|
||||
type: "bool"
|
||||
bindable: "bindableOnlyMenu"
|
||||
read: "default"
|
||||
notify: "onlyMenuChanged"
|
||||
index: 9
|
||||
lineNumber: 121
|
||||
isReadonly: true
|
||||
}
|
||||
Signal { name: "ready"; lineNumber: 155 }
|
||||
Signal { name: "idChanged"; lineNumber: 157 }
|
||||
Signal { name: "titleChanged"; lineNumber: 158 }
|
||||
Signal { name: "iconChanged"; lineNumber: 159 }
|
||||
Signal { name: "statusChanged"; lineNumber: 160 }
|
||||
Signal { name: "categoryChanged"; lineNumber: 161 }
|
||||
Signal { name: "tooltipTitleChanged"; lineNumber: 162 }
|
||||
Signal { name: "tooltipDescriptionChanged"; lineNumber: 163 }
|
||||
Signal { name: "hasMenuChanged"; lineNumber: 164 }
|
||||
Signal { name: "onlyMenuChanged"; lineNumber: 165 }
|
||||
Method { name: "onGetAllFinished"; lineNumber: 168 }
|
||||
Method { name: "onGetAllFailed"; isMethodConstant: true; lineNumber: 169 }
|
||||
Method { name: "activate"; lineNumber: 130 }
|
||||
Method { name: "secondaryActivate"; lineNumber: 132 }
|
||||
Method {
|
||||
name: "scroll"
|
||||
isMethodConstant: true
|
||||
lineNumber: 134
|
||||
Parameter { name: "delta"; type: "int" }
|
||||
Parameter { name: "horizontal"; type: "bool" }
|
||||
}
|
||||
Method {
|
||||
name: "display"
|
||||
lineNumber: 136
|
||||
Parameter { name: "parentWindow"; type: "QObject"; isPointer: true }
|
||||
Parameter { name: "relativeX"; type: "int" }
|
||||
Parameter { name: "relativeY"; type: "int" }
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user