Initial commit: Motion Wallpaper installer for Omarchy/Hyprland
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
commit
65d721c0fc
1 changed files with 219 additions and 0 deletions
219
wallpaper.sh
Normal file
219
wallpaper.sh
Normal file
|
|
@ -0,0 +1,219 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
echo "=== Motion wallpaper installer for Omarchy / Hyprland ==="
|
||||
|
||||
# 1) Check for required commands
|
||||
if ! command -v pacman >/dev/null 2>&1; then
|
||||
echo "This script expects a pacman-based system (Arch/Omarchy). Aborting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2) Install required packages from official repos
|
||||
echo "Installing required packages: mpv jq zenity"
|
||||
sudo pacman -S --needed mpv jq zenity
|
||||
|
||||
# 3) Install mpvpaper from AUR
|
||||
echo
|
||||
echo "Installing mpvpaper from AUR..."
|
||||
|
||||
# Check for AUR helper
|
||||
AUR_HELPER=""
|
||||
if command -v yay >/dev/null 2>&1; then
|
||||
AUR_HELPER="yay"
|
||||
elif command -v paru >/dev/null 2>&1; then
|
||||
AUR_HELPER="paru"
|
||||
fi
|
||||
|
||||
if [ -n "$AUR_HELPER" ]; then
|
||||
echo "Using $AUR_HELPER to install mpvpaper..."
|
||||
$AUR_HELPER -S --needed mpvpaper
|
||||
else
|
||||
echo "⚠️ No AUR helper (yay/paru) found."
|
||||
echo
|
||||
echo "Please install mpvpaper manually:"
|
||||
echo " 1. Install an AUR helper first:"
|
||||
echo " sudo pacman -S --needed base-devel git"
|
||||
echo " git clone https://aur.archlinux.org/yay.git"
|
||||
echo " cd yay && makepkg -si"
|
||||
echo
|
||||
echo " 2. Then install mpvpaper:"
|
||||
echo " yay -S mpvpaper"
|
||||
echo
|
||||
read -p "Press Enter after installing mpvpaper to continue..."
|
||||
fi
|
||||
|
||||
# Verify mpvpaper is installed
|
||||
if ! command -v mpvpaper >/dev/null 2>&1; then
|
||||
echo "ERROR: mpvpaper is not installed. Cannot continue."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 4) Create ~/.local/bin if it doesn't exist
|
||||
mkdir -p "$HOME/.local/bin"
|
||||
|
||||
# 5) Create the toggle script
|
||||
cat << 'EOF' > "$HOME/.local/bin/motion-wallpaper-toggle"
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
APP_NAME="Motion Wallpaper"
|
||||
|
||||
# Helper to show an error dialog (falls back to echo)
|
||||
zen_err() {
|
||||
if command -v zenity >/dev/null 2>&1; then
|
||||
zenity --error --title="$APP_NAME" --text="$1" || true
|
||||
else
|
||||
echo "ERROR: $1" >&2
|
||||
fi
|
||||
}
|
||||
|
||||
zen_info() {
|
||||
if command -v zenity >/dev/null 2>&1; then
|
||||
zenity --info --title="$APP_NAME" --text="$1" || true
|
||||
else
|
||||
echo "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
zen_question() {
|
||||
if command -v zenity >/dev/null 2>&1; then
|
||||
zenity --question --title="$APP_NAME" --text="$1"
|
||||
return $?
|
||||
else
|
||||
# No zenity, default to "yes"
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
# 1) If mpvpaper is already running, offer to stop it (toggle OFF)
|
||||
if pgrep -x mpvpaper >/dev/null 2>&1; then
|
||||
if zen_question "Motion wallpaper is currently running.\n\nDo you want to stop it and return to your normal wallpaper?"; then
|
||||
pkill mpvpaper || true
|
||||
zen_info "Motion wallpaper stopped."
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 2) No mpvpaper → toggle ON
|
||||
|
||||
# 2a) Check hyprctl
|
||||
if ! command -v hyprctl >/dev/null 2>&1; then
|
||||
zen_err "hyprctl not found. Are you running Hyprland?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2b) Get monitor list
|
||||
MON_JSON="$(hyprctl monitors -j 2>/dev/null || true)"
|
||||
if [ -z "$MON_JSON" ]; then
|
||||
zen_err "Could not get monitor info from hyprctl."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v jq >/dev/null 2>&1; then
|
||||
zen_err "jq is not installed. Please install jq and try again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
MONITORS="$(printf '%s\n' "$MON_JSON" | jq -r '.[].name')"
|
||||
if [ -z "$MONITORS" ]; then
|
||||
zen_err "No monitors detected."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
MON_COUNT="$(printf '%s\n' "$MONITORS" | wc -l)"
|
||||
|
||||
# 2c) Choose monitor (if more than one)
|
||||
SELECTED_MON=""
|
||||
if [ "$MON_COUNT" -eq 1 ]; then
|
||||
SELECTED_MON="$MONITORS"
|
||||
else
|
||||
# Build a list for Zenity
|
||||
MON_LIST=$(printf '%s\n' "$MONITORS" | awk '{print NR, $1}')
|
||||
SELECTED_MON=$(echo "$MON_LIST" | zenity --list \
|
||||
--title="$APP_NAME - Select monitor" \
|
||||
--column="ID" --column="Monitor" \
|
||||
--height=300 \
|
||||
--print-column=2)
|
||||
fi
|
||||
|
||||
if [ -z "${SELECTED_MON:-}" ]; then
|
||||
# User cancelled
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 2d) Choose video file
|
||||
if ! command -v zenity >/dev/null 2>&1; then
|
||||
zen_err "Zenity is not installed but is required for file selection."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
VIDEO="$(zenity --file-selection \
|
||||
--title="$APP_NAME - Choose motion wallpaper video" \
|
||||
--file-filter="Video files | *.mp4 *.mkv *.webm *.mov *.avi")" || exit 0
|
||||
|
||||
if [ -z "$VIDEO" ]; then
|
||||
# User cancelled
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -f "$VIDEO" ]; then
|
||||
zen_err "Selected file does not exist:\n$VIDEO"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2e) Start mpvpaper
|
||||
nohup mpvpaper -o "--loop --no-audio --vo=gpu --profile=high-quality --keep-open=yes" \
|
||||
"$SELECTED_MON" "$VIDEO" >/dev/null 2>&1 &
|
||||
|
||||
zen_info "Motion wallpaper started on $SELECTED_MON."
|
||||
EOF
|
||||
|
||||
chmod +x "$HOME/.local/bin/motion-wallpaper-toggle"
|
||||
|
||||
# 6) Create desktop entry for app menu
|
||||
mkdir -p "$HOME/.local/share/applications"
|
||||
|
||||
cat << EOF > "$HOME/.local/share/applications/motion-wallpaper-toggle.desktop"
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Name=Motion Wallpaper
|
||||
Comment=Toggle animated video wallpaper on/off
|
||||
Exec=$HOME/.local/bin/motion-wallpaper-toggle
|
||||
Icon=preferences-desktop-wallpaper
|
||||
Terminal=false
|
||||
Categories=Utility;Settings;DesktopSettings;
|
||||
Keywords=wallpaper;video;animated;background;
|
||||
EOF
|
||||
|
||||
echo
|
||||
echo "=== Install complete ==="
|
||||
echo
|
||||
echo "✓ Motion Wallpaper has been added to your application menu"
|
||||
echo " Search for 'Motion Wallpaper' in your app launcher"
|
||||
|
||||
# Check if ~/.local/bin is in PATH
|
||||
if [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then
|
||||
echo
|
||||
echo "⚠️ NOTE: ~/.local/bin is not in your PATH."
|
||||
echo "Add this to your ~/.bashrc or ~/.zshrc:"
|
||||
echo
|
||||
echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
|
||||
echo
|
||||
echo "Then reload your shell with: source ~/.bashrc"
|
||||
echo
|
||||
echo "For now, run with full path:"
|
||||
echo " ~/.local/bin/motion-wallpaper-toggle"
|
||||
else
|
||||
echo
|
||||
echo "Run this to toggle motion wallpaper on/off:"
|
||||
echo
|
||||
echo " motion-wallpaper-toggle"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Optional Hyprland keybind (add to your hyprland.conf):"
|
||||
echo
|
||||
echo " bind = SUPER, W, exec, ~/.local/bin/motion-wallpaper-toggle"
|
||||
echo
|
||||
Loading…
Add table
Reference in a new issue