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"
|