Initial release of Lumen Wallpaper
This commit is contained in:
Executable
+49
@@ -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"
|
||||
Executable
+189
@@ -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
|
||||
Executable
+34
@@ -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"
|
||||
Reference in New Issue
Block a user