2026-03-09 00:07:31 -04:00

161 lines
3.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SCRIPT=$(basename "$0")
CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}"
VCONSOLE_UPDATE="$HOME/.local/bin/vconsole-colors.sh"
WALLPAPER="${CONFIG}/hypr/wallpaper"
QUIET_MODE=false
SKIP_VCONSOLE=false
SKIP_INITRAMFS=false
show_help() {
cat <<EOF
Usage: $0 [OPTIONS] <input_file>
A script to update system theme based on a wallpaper image.
Options:
-h, --help Show this help message and exit
-q, --quiet Quiet mode: Suppress output to the terminal
-n Skip prompting to regenerate initramfs
-nn Skip prompting to update vconsole.conf
Examples:
$0 /path/to/image/sunset.jpg # Normal theme update
$0 -q ~/wallpapers/night.jpg # Quiet mode theme update
$0 -q -n ~/Downloads/nature.jpg # Combine quiet mode and skip initramfs
Requirements:
- Requires an input image file
- Depends on pywal, wpg, swaync, pywalfox, and spicetify
EOF
exit 0
}
validate_image() {
local file="$1"
local mime_type
[[ -f "$file" ]] || die "File '$file' not found."
mime_type=$(file --mime-type -b "$file")
local allowed_types=(
"image/jpeg"
"image/png"
"image/gif"
"image/bmp"
"image/webp"
"image/tiff"
"image/x-icon"
"image/svg+xml"
)
local is_image=false
for type in "${allowed_types[@]}"; do
if [[ "$mime_type" == "$type" ]]; then
is_image=true
break
fi
done
if [[ "$is_image" == false ]]; then
die "File '$file' is not a valid image. Mime type detected: $mime_type"
fi
}
quiet_exec() {
if [[ "$QUIET_MODE" == true ]]; then
"$@" >/dev/null 2>&1 || return 1
else
"$@" || return 1
fi
}
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
show_help
;;
-q|--quiet)
QUIET_MODE=true
shift
;;
-n)
SKIP_INITRAMFS=true
shift
;;
-nn)
SKIP_VCONSOLE=true
shift
;;
*)
break
;;
esac
done
log() {
if [[ "$QUIET_MODE" == false ]]; then
logger -i -t "$SCRIPT" "$*"
fi
}
die() {
logger -i -t "$SCRIPT" ":Error:" "$*"
exit 1
}
[[ $# -eq 1 ]] || die "Usage: $0 [-h] [-q] [-n] [-nn] <input_file>"
IMAGE="$1"
validate_image "$IMAGE"
quiet_exec wal -i "$IMAGE" -n || die "Pywal update failed"
quiet_exec wpg -a "$(echo "$IMAGE")" || die "Pywal adding failed."
quiet_exec wpg -s "$(basename "$IMAGE")" || die "Pywal update failed."
quiet_exec ln -sf "$(realpath "$IMAGE")" "$WALLPAPER"
# quiet_exec eww reload
# quiet_exec swaync-client -R
# quiet_exec killall swaync
quiet_exec pywalfox update
quiet_exec spicetify apply
# quiet_exec swaync-client -rs
notify-send "New theme applied!"
if [[ "$SKIP_VCONSOLE" == false ]]; then
if [[ "$QUIET_MODE" == false ]]; then
read -rp "Update vconsole.conf? (y/N): " VCONSOLE
else
VCONSOLE="y"
fi
if [[ "${VCONSOLE,,}" =~ ^y(es)?$ ]]; then
[[ -f "$VCONSOLE_UPDATE" ]] || die "Vconsole update script not found"
log "Running vconsole-colors update script..."
quiet_exec sudo bash "$VCONSOLE_UPDATE"
if [[ "$SKIP_INITRAMFS" == false ]]; then
if [[ "$QUIET_MODE" == false ]]; then
read -rp "Regenerate initramfs? Colors won't apply until it is. (y/N): " INITRAMFS
else
INITRAMFS="y"
fi
if [[ "${INITRAMFS,,}" =~ ^y(es)?$ ]]; then
log "Regenerating initramfs from theme swap..."
quiet_exec sudo mkinitcpio -P
else
log "Not regenerating initramfs. New colors won't apply until it has been."
fi
fi
else
log "Skipping vconsole.conf update for new theme."
fi
fi
exit 0