Initial release of Lumen Wallpaper

This commit is contained in:
emil28092005
2026-10-25 17:29:16 +03:00
commit 2a77fc6546
31 changed files with 3393 additions and 0 deletions
+49
View File
@@ -0,0 +1,49 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
BUILD_DIR=${BUILD_DIR:-"$ROOT/build"}
PACKAGE_ID=dev.emil.lumen
for command_name in busctl plasmashell nohup; do
command -v "$command_name" >/dev/null 2>&1 || {
printf 'Lumen activation: missing command: %s\n' "$command_name" >&2
exit 1
}
done
if ! busctl --user call org.kde.plasmashell /PlasmaShell \
org.kde.PlasmaShell wallpaper u 0 >/dev/null 2>&1; then
printf 'Lumen activation: no running Plasma session was found\n' >&2
exit 1
fi
BACKUP_DIR="$BUILD_DIR/activation-backup-$(date +%Y%m%d-%H%M%S)-$$"
mkdir -p "$BACKUP_DIR" "$HOME/.config/plasma-workspace/env"
: > "$BACKUP_DIR/wallpaper-plugins.txt"
for ((screen = 0; ; ++screen)); do
if ! description=$(busctl --user call org.kde.plasmashell /PlasmaShell \
org.kde.PlasmaShell wallpaper u "$screen" 2>/dev/null); then
break
fi
printf '%s\n' "$description" > "$BACKUP_DIR/wallpaper-screen-$screen.txt"
if [[ $description =~ \"wallpaperPlugin\"\ s\ \"([^\"]+)\" ]]; then
printf '%d %s\n' "$screen" "${BASH_REMATCH[1]}" \
>> "$BACKUP_DIR/wallpaper-plugins.txt"
else
break
fi
done
if [[ ! -s "$BACKUP_DIR/wallpaper-plugins.txt" ]]; then
printf 'Lumen activation: could not back up the current wallpaper plugins\n' >&2
exit 1
fi
printf '%s\n' 'export QSG_RHI_BACKEND=vulkan' \
> "$HOME/.config/plasma-workspace/env/lumen-vulkan.sh"
busctl --user call org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell evaluateScript s \
"desktops().forEach(function(d) { d.wallpaperPlugin = '$PACKAGE_ID'; });"
QSG_RHI_BACKEND=vulkan nohup plasmashell --replace \
> "$BACKUP_DIR/plasmashell.log" 2>&1 &
printf 'Lumen Wallpaper activated. Backup: %s\n' "$BACKUP_DIR"
+189
View File
@@ -0,0 +1,189 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
PREFIX=${PREFIX:-"$HOME/.local"}
BUILD_DIR=${BUILD_DIR:-"$ROOT/build"}
INSTALL_DEPS=0
ACTIVATE=0
ASSUME_YES=0
MINIMUM_RUST=1.87.0
usage() {
cat <<'EOF'
Usage: scripts/install.sh [options]
Options:
--deps Offer to install missing build dependencies
--no-deps Do not install dependencies (default)
--activate Activate Lumen in the running Plasma session
--no-activate Build and install only (default)
--yes, -y Assume yes for dependency installation prompts
--help Show this help
Environment:
PREFIX Installation prefix (default: ~/.local)
BUILD_DIR Build directory (default: ./build)
LUMEN_STATE_DIR Activation backups and logs (default: PREFIX/share/lumen-wallpaper)
EOF
}
log() {
printf 'Lumen installer: %s\n' "$*"
}
fail() {
printf 'Lumen installer: %s\n' "$*" >&2
exit 1
}
while (($#)); do
case "$1" in
--deps) INSTALL_DEPS=1 ;;
--no-deps) INSTALL_DEPS=0 ;;
--activate) ACTIVATE=1 ;;
--no-activate) ACTIVATE=0 ;;
--yes|-y) ASSUME_YES=1 ;;
--help)
usage
exit 0
;;
*) fail "Unknown option: $1" ;;
esac
shift
done
confirm() {
local prompt=$1
local answer
if ((ASSUME_YES)); then
return 0
fi
if [[ ! -t 0 ]]; then
return 1
fi
read -r -p "$prompt [y/N] " answer
[[ $answer == y || $answer == Y || $answer == yes || $answer == YES ]]
}
rust_version_ok() {
command -v rustc >/dev/null 2>&1 || return 1
local version
version=$(rustc --version 2>/dev/null | awk '{print $2}')
[[ -n $version ]] || return 1
printf '%s\n%s\n' "$MINIMUM_RUST" "$version" | sort -V -C
}
ecm_available() {
local probe_dir
probe_dir=$(mktemp -d "${TMPDIR:-/tmp}/lumen-ecm-probe.XXXXXX")
if (cd "$probe_dir" && cmake --find-package \
-DNAME=ECM -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=EXIST \
>/dev/null 2>&1); then
rm -rf -- "$probe_dir"
return 0
fi
rm -rf -- "$probe_dir"
return 1
}
dependencies_ready() {
local command_name
for command_name in cmake ninja c++ cargo rustc pkg-config; do
command -v "$command_name" >/dev/null 2>&1 || return 1
done
rust_version_ok || return 1
pkg-config --exists Qt6Core Qt6Gui Qt6Qml Qt6Quick || return 1
ecm_available || return 1
}
run_as_root() {
if ((EUID == 0)); then
"$@"
else
command -v sudo >/dev/null 2>&1 || fail "sudo is required for system packages"
sudo "$@"
fi
}
install_dependencies() {
if dependencies_ready; then
log "Build dependencies are already available"
return
fi
((INSTALL_DEPS)) || return
confirm "Install missing build dependencies with the system package manager?" \
|| fail "Build dependencies are required; install them manually or rerun with --deps"
if command -v dnf >/dev/null 2>&1; then
run_as_root dnf install -y \
gcc-c++ cargo rustc cmake ninja-build extra-cmake-modules pkgconf-pkg-config curl \
qt6-qtbase-devel qt6-qtdeclarative-devel vulkan-loader-devel vulkan-headers \
kf6-kirigami plasma-workspace
elif command -v apt-get >/dev/null 2>&1; then
run_as_root apt-get update
run_as_root apt-get install -y \
build-essential cargo rustc cmake ninja-build extra-cmake-modules pkg-config curl \
qt6-base-dev qt6-declarative-dev libvulkan-dev \
qml6-module-org-kde-kirigami plasma-workspace
elif command -v pacman >/dev/null 2>&1; then
run_as_root pacman -Sy --needed --noconfirm \
base-devel cargo cmake ninja extra-cmake-modules pkgconf curl \
qt6-base qt6-declarative vulkan-headers kirigami plasma-workspace
else
fail "Unsupported package manager. Install CMake, Ninja, a C++ compiler, Rust, Qt6, ECM, Vulkan, Kirigami, and Plasma Workspace manually"
fi
}
ensure_rust() {
if rust_version_ok; then
return
fi
((INSTALL_DEPS)) || return
confirm "Rust $MINIMUM_RUST or newer is required. Install/update it with rustup in your home directory?" \
|| fail "Rust $MINIMUM_RUST or newer is required"
if command -v rustup >/dev/null 2>&1; then
rustup toolchain install stable --profile minimal
else
command -v curl >/dev/null 2>&1 || fail "curl is required to download rustup"
local rustup_script
rustup_script=$(mktemp "${TMPDIR:-/tmp}/lumen-rustup.XXXXXX")
curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs -o "$rustup_script"
sh "$rustup_script" -y --profile minimal --no-modify-path
rm -f -- "$rustup_script"
fi
export PATH="$HOME/.cargo/bin:$PATH"
export RUSTUP_TOOLCHAIN=stable
rust_version_ok || fail "The Rust toolchain is still older than $MINIMUM_RUST"
}
preflight() {
local command_name
for command_name in cmake ninja c++ cargo rustc pkg-config; do
command -v "$command_name" >/dev/null 2>&1 \
|| fail "Missing required command: $command_name"
done
rust_version_ok || fail "Rust $MINIMUM_RUST or newer is required"
pkg-config --exists Qt6Core Qt6Gui Qt6Qml Qt6Quick \
|| fail "Qt6 development packages are required"
ecm_available || fail "Extra CMake Modules (ECM) are required"
}
install_dependencies
ensure_rust
preflight
cmake -S "$ROOT" -B "$BUILD_DIR" -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="$PREFIX"
cmake --build "$BUILD_DIR"
cmake --install "$BUILD_DIR"
log "Installed Lumen Wallpaper to $PREFIX"
if ((ACTIVATE)); then
BUILD_DIR=${LUMEN_STATE_DIR:-"$PREFIX/share/lumen-wallpaper"} \
"$ROOT/scripts/activate.sh"
else
log "Activate it with scripts/activate.sh or choose Lumen Wallpaper in KDE settings"
fi
+34
View File
@@ -0,0 +1,34 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
VERSION=$(awk -F'"' '/^version =/{print $2; exit}' "$ROOT/Cargo.toml")
REF=${1:-HEAD}
DIST_DIR=${DIST_DIR:-"$ROOT/dist"}
SOURCE_ARCHIVE="$DIST_DIR/lumen-wallpaper-$VERSION-source.tar.gz"
INSTALLER="$DIST_DIR/lumen-wallpaper-$VERSION-installer.run"
command -v git >/dev/null 2>&1 || {
printf 'Release packaging requires git\n' >&2
exit 1
}
git -C "$ROOT" rev-parse --verify "$REF^{commit}" >/dev/null
mkdir -p "$DIST_DIR"
git -C "$ROOT" archive --format=tar.gz \
--prefix="Lumen-wallpaper-$VERSION/" "$REF" -o "$SOURCE_ARCHIVE"
if tar -tzf "$SOURCE_ARCHIVE" | grep -E '(^|/)(build|target|dist|\.env)(/|$)|\.(log|swp|tmp)$' >/dev/null; then
printf 'Release archive contains a forbidden local artifact\n' >&2
exit 1
fi
sed "s/@LUMEN_VERSION@/$VERSION/g" "$ROOT/packaging/installer-stub.sh" > "$INSTALLER"
base64 "$SOURCE_ARCHIVE" >> "$INSTALLER"
chmod +x "$INSTALLER"
(
cd "$DIST_DIR"
sha256sum "$(basename "$SOURCE_ARCHIVE")" "$(basename "$INSTALLER")" > SHA256SUMS
)
printf 'Created %s\nCreated %s\n' "$SOURCE_ARCHIVE" "$INSTALLER"