summaryrefslogtreecommitdiff
path: root/scripts/switch_wallpaper.sh
blob: a499d45e7bdd43796484be754e7642b8e572e057 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/bin/bash

# 壁纸切换:noctalia 优先,否则回退到 wofi 选择 -> 写入 current_wallpaper -> 重载 swaybg

WALLPAPER_DIR="/home/catilgrass/图片/Wallpapers"
CURRENT_FILE="/home/catilgrass/.config/hypr/current_wallpaper"
THUMB_DIR="/tmp/wallpaper_thumbs"

# 如果 noctalia 正在运行,直接调用其消息接口
if pgrep -x noctalia > /dev/null 2>&1; then
    noctalia msg panel-open wallpaper
    exit $?
fi

# 检查壁纸目录
if [ ! -d "$WALLPAPER_DIR" ]; then
    echo "错误: 壁纸目录不存在: $WALLPAPER_DIR"
    exit 1
fi

# 获取壁纸文件列表(按文件名排序,支持空格/中文路径)
mapfile -d '' wallpapers < <(find "$WALLPAPER_DIR" -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.webp" \) -print0 | sort -z)

if [ ${#wallpapers[@]} -eq 0 ]; then
    echo "错误: 在 $WALLPAPER_DIR 中没有找到壁纸文件"
    exit 1
fi

# 生成缩略图并组装 wofi 项
# wofi 图片格式:img:缩略图路径:text:显示文本(wofi 会自动缩放到 image_size)
mkdir -p "$THUMB_DIR"
items=()
for wallpaper in "${wallpapers[@]}"; do
    filename=$(basename "$wallpaper")
    thumb="$THUMB_DIR/$filename.jpg"

    # 缩略图不存在或壁纸文件更新时重新生成
    if [ ! -f "$thumb" ] || [ "$wallpaper" -nt "$thumb" ]; then
        convert "$wallpaper" -resize 256x256^ -gravity center -extent 256x256 "$thumb" 2>/dev/null
    fi

    if [ -f "$thumb" ]; then
        items+=("img:$thumb:text:$filename")
    else
        items+=("text:$filename")
    fi
done

# wofi 选择
# dmenu-parse_action=true:选中后输出只保留 text 部分(即文件名),去掉图片转义
selected=$(printf '%s\n' "${items[@]}" | wofi --dmenu -I -i -p "选择壁纸" -W 600 -b \
    -k /dev/null -D dmenu-parse_action=true -D image_size=96)

# 用户取消
if [ -z "$selected" ]; then
    exit 0
fi

# 根据文件名找到完整路径
selected_wallpaper=""
for wallpaper in "${wallpapers[@]}"; do
    if [ "$(basename "$wallpaper")" = "$selected" ]; then
        selected_wallpaper="$wallpaper"
        break
    fi
done

if [ -z "$selected_wallpaper" ]; then
    echo "错误: 找不到选择的壁纸文件: $selected"
    exit 1
fi

# 写入当前壁纸路径(startup.lua 下次启动时读取)
printf '%s\n' "$selected_wallpaper" > "$CURRENT_FILE"

# 重载 swaybg
pkill -x swaybg 2>/dev/null
sleep 0.2
swaybg -i "$selected_wallpaper" -m fill > /dev/null 2>&1 &

echo "壁纸已切换到: $selected"