#!/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"