forked from Shinonome/dots-hyprland
Feat: switch to video background and colorgen
This commit is contained in:
@@ -3,6 +3,81 @@
|
|||||||
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
|
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
|
||||||
CONFIG_DIR="$XDG_CONFIG_HOME/ags"
|
CONFIG_DIR="$XDG_CONFIG_HOME/ags"
|
||||||
|
|
||||||
|
THUMBNAIL_DIR="/tmp/mpvpaper_thumbnails"
|
||||||
|
CUSTOM_DIR="$XDG_CONFIG_HOME/hypr/custom"
|
||||||
|
RESTORE_SCRIPT_DIR="$CUSTOM_DIR/scripts"
|
||||||
|
RESTORE_SCRIPT="$RESTORE_SCRIPT_DIR/__restore_video_wallpaper.sh"
|
||||||
|
EXECS_CONF="$CUSTOM_DIR/execs.conf"
|
||||||
|
|
||||||
|
mkdir -p "$THUMBNAIL_DIR"
|
||||||
|
mkdir -p "$RESTORE_SCRIPT_DIR"
|
||||||
|
|
||||||
|
is_video() {
|
||||||
|
local extension="${1##*.}"
|
||||||
|
[[ "$extension" == "mp4" || "$extension" == "mkv" || "$extension" == "webm" ]] && return 0 || return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
kill_existing_mpvpaper() {
|
||||||
|
# Abort all mpvpapers' instance
|
||||||
|
pkill -f -9 mpvpaper || true
|
||||||
|
}
|
||||||
|
|
||||||
|
create_restore_script() {
|
||||||
|
local video_path=$1
|
||||||
|
local video_opts=${2:-"no-audio loop"}
|
||||||
|
|
||||||
|
cat > "$RESTORE_SCRIPT" << EOF
|
||||||
|
#!/bin/bash
|
||||||
|
# Generated by switchwall.sh - Don't modify it by yourself.
|
||||||
|
# Time: $(date)
|
||||||
|
|
||||||
|
pkill -f -9 mpvpaper
|
||||||
|
|
||||||
|
for monitor in \$(hyprctl monitors -j | jq -r '.[] | .name'); do
|
||||||
|
mpvpaper -f -o "$video_opts" "\$monitor" "$video_path" &
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x "$RESTORE_SCRIPT"
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_restore_exec() {
|
||||||
|
local restore_line="exec-once=bash $RESTORE_SCRIPT"
|
||||||
|
|
||||||
|
if [ ! -f "$EXECS_CONF" ]; then
|
||||||
|
echo "$restore_line" >> "$EXECS_CONF"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep -q "$restore_line" "$EXECS_CONF"; then
|
||||||
|
echo "$restore_line" >> "$EXECS_CONF"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_restore() {
|
||||||
|
if [ -f "$RESTORE_SCRIPT" ]; then
|
||||||
|
rm "$RESTORE_SCRIPT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$EXECS_CONF" ]; then
|
||||||
|
grep -v "exec-once=bash $RESTORE_SCRIPT" "$EXECS_CONF" > "$EXECS_CONF.tmp"
|
||||||
|
mv "$EXECS_CONF.tmp" "$EXECS_CONF"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
save_video_config() {
|
||||||
|
local path=$1
|
||||||
|
local opts=$2
|
||||||
|
local exec_cmd=$3
|
||||||
|
|
||||||
|
echo "VIDEO_PATH=$path" > "$VIDEO_CONFIG"
|
||||||
|
echo "VIDEO_OPTS=$opts" >> "$VIDEO_CONFIG"
|
||||||
|
|
||||||
|
if [ -n "$exec_cmd" ]; then
|
||||||
|
echo "EXEC_CMD=$exec_cmd" >> "$VIDEO_CONFIG"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
switch() {
|
switch() {
|
||||||
imgpath=$1
|
imgpath=$1
|
||||||
read scale screenx screeny screensizey < <(hyprctl monitors -j | jq '.[] | select(.focused) | .scale, .x, .y, .height' | xargs)
|
read scale screenx screeny screensizey < <(hyprctl monitors -j | jq '.[] | select(.focused) | .scale, .x, .y, .height' | xargs)
|
||||||
@@ -17,16 +92,65 @@ switch() {
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# agsv1 run-js "wallpaper.set('')"
|
kill_existing_mpvpaper
|
||||||
# sleep 0.1 && agsv1 run-js "wallpaper.set('${imgpath}')" &
|
|
||||||
swww img "$imgpath" --transition-step 100 --transition-fps 120 \
|
if is_video "$imgpath"; then
|
||||||
--transition-type grow --transition-angle 30 --transition-duration 1 \
|
missing_deps=()
|
||||||
--transition-pos "$cursorposx, $cursorposy_inverted"
|
if ! command -v mpvpaper &> /dev/null; then
|
||||||
|
missing_deps+=("mpvpaper")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v ffmpeg &> /dev/null; then
|
||||||
|
missing_deps+=("ffmpeg")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${#missing_deps[@]} -gt 0 ]; then
|
||||||
|
echo "Missing deps: ${missing_deps[*]}"
|
||||||
|
echo "Arch: "
|
||||||
|
echo " yay -S ${missing_deps[*]}"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
local video_path=$1
|
||||||
|
local video_opts=${2:-"no-audio loop hwdec=auto scale=bilinear interpolation=no video-sync=display-resample panscan=1.0 video-scale-x=1.0 video-scale-y=1.0 video-align-x=0.5 video-align-y=0.5"}
|
||||||
|
|
||||||
|
monitors=$(hyprctl monitors -j | jq -r '.[] | .name')
|
||||||
|
|
||||||
|
for monitor in $monitors; do
|
||||||
|
mpvpaper -o "$video_opts" "$monitor" "$video_path" &
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
|
||||||
|
# We take the first frame of video to colorgen
|
||||||
|
thumbnail="$THUMBNAIL_DIR/$(basename $"imgpath").jpg"
|
||||||
|
ffmpeg -y -i "$imgpath" -vframes 1 "$thumbnail" 2>/dev/null
|
||||||
|
|
||||||
|
if [ -f "$thumbnail" ]; then
|
||||||
|
"$CONFIG_DIR"/scripts/color_generation/colorgen.sh "$thumbnail" --apply --smart
|
||||||
|
create_restore_script "$video_path" "$video_opts"
|
||||||
|
ensure_restore_exec
|
||||||
|
else
|
||||||
|
echo "Cannot create image to colorgen"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# agsv1 run-js "wallpaper.set('')"
|
||||||
|
# sleep 0.1 && agsv1 run-js "wallpaper.set('${imgpath}')" &
|
||||||
|
swww img "$imgpath" --transition-step 100 --transition-fps 120 \
|
||||||
|
--transition-type grow --transition-angle 30 --transition-duration 1 \
|
||||||
|
--transition-pos "$cursorposx, $cursorposy_inverted"
|
||||||
|
|
||||||
|
"$CONFIG_DIR"/scripts/color_generation/colorgen.sh "$imgpath" --apply --smart
|
||||||
|
remove_restore
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ "$1" == "--noswitch" ]; then
|
if [ "$1" == "--noswitch" ]; then
|
||||||
imgpath=$(swww query | awk -F 'image: ' '{print $2}')
|
if pgrep -f mpvpaper > /dev/null; then
|
||||||
# imgpath=$(agsv1 run-js 'wallpaper.get(0)')
|
imgpath=$(ps -eo cmd | grep mpvpaper | grep -v grep | awk '{for(i=NF;i>0;i--) if($i!~/^-/) {print $i; break}}')
|
||||||
|
else
|
||||||
|
imgpath=$(swww query | awk -F 'image: ' '{print $2}')
|
||||||
|
# imgpath=$(agsv1 run-js 'wallpaper.get(0)')
|
||||||
|
fi
|
||||||
elif [[ "$1" ]]; then
|
elif [[ "$1" ]]; then
|
||||||
switch "$1"
|
switch "$1"
|
||||||
else
|
else
|
||||||
@@ -35,6 +159,3 @@ else
|
|||||||
cd "$(xdg-user-dir PICTURES)/Wallpapers" || cd "$(xdg-user-dir PICTURES)" || return 1
|
cd "$(xdg-user-dir PICTURES)/Wallpapers" || cd "$(xdg-user-dir PICTURES)" || return 1
|
||||||
switch "$(yad --width 1200 --height 800 --file --add-preview --large-preview --title='Choose wallpaper')"
|
switch "$(yad --width 1200 --height 800 --file --add-preview --large-preview --title='Choose wallpaper')"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Generate colors for ags n stuff
|
|
||||||
"$CONFIG_DIR"/scripts/color_generation/colorgen.sh "${imgpath}" --apply --smart
|
|
||||||
|
|||||||
Reference in New Issue
Block a user