swwwを使った背景制御ツールをbashで作る
環境
OS: Arch Linux x86_64
WM: Hyprland 0.54.2 (Wayland)
Kernel: Linux 6.19.9-arch1-1
Wallpaper_Manager: swww
Daemon_Manager: systemd
仕様
仕様というほどじゃないですが、動作に関する概要を。
- 指定のフォルダ内の画像を順
seq,逆rev,ランダムrndの順で背景に設定する - user systemdを使って15分毎に自動切り替え
もっと具体的な仕組みについては以下のリストとフローチャートを。
- 壁紙の操作は
cycle_wallpapaer.sh内でswwwコマンドを用いる - スクリプトはモードとして順
seq,逆rev,ランダムrnd,スライドのポーズpseの4つpseはsystemdのstart, stopをトグルする
- 15分(:00,15,30,45分)ごとにランダムで切り替わるようにuser systemdでスクリプトを叩く
- 現在の壁紙のパスは
$HOME/dotfiles/.config/hypr/env/CURRENT_PAPERにテキストとして保持
flowchart TD
TIMER["🕐 cycle_wallpaper.timer
15分ごとに自動実行"]
SERVICE["⚙️ cycle_wallpaper.service
Type=oneshot / rnd モードで起動"]
SCRIPT["📄 cycle_wallpaper.sh
引数によって処理を分岐"]
TIMER -->|Requires + OnCalendar| SERVICE
SERVICE -->|ExecStart で呼び出し| SCRIPT
SCRIPT --> CASE{引数 $1 の値は?}
CASE -->|seq| SOR0["seq_or_rev / rev_mode=0
ファイルを順番に進める"]
CASE -->|rev| SOR1["seq_or_rev / rev_mode=1
ファイルを逆順に戻る"]
CASE -->|rnd| RND["random_paper
shuf -n 1 でランダム選択"]
CASE -->|pse| PSE["toggle_systemtimer
タイマーの一時停止・再開"]
SOR0 & SOR1 --> CP{"CURRENT_PAPER を確認
~/.config/hypr/env/"}
CP -->|ファイルが存在して有効| GETALL["get_all
find + sort で一覧を取得"]
CP -->|ファイルなし・パス無効| FIRST["get_first_path
一覧の先頭 head -1 を返す"]
GETALL --> NEXT["get_next_path
grep -A1 / -B1 で隣接行を取得"]
NEXT -->|マッチ行の次が存在| WRITE
NEXT -->|末尾・先頭に達したら折り返し| WRITE
FIRST --> WRITE["CURRENT_PAPER に書き込み
次回のために現在地を保存"]
RND --> WRITE
WRITE --> SWWW["🖼️ swww img [path]
--transition-type center
--transition-duration 0.5"]
PSE --> END["systemctl --user start/stop
タイマー状態を切り替えて終了"]
ちなみにhyprlandの設定で以下のようにして手動でも操作できるようにしてます。
# wallpapers
bind = $mainMod, W, exec, ~/dotfiles/script/cycle_wallpaper.sh "seq"
bind = $mainMod SHIFT, W, exec, ~/dotfiles/script/cycle_wallpaper.sh "rev"
bind = CONTROL ALT, W, exec, ~/dotfiles/script/cycle_wallpaper.sh "rnd"
bind = $mainMod CTRL, W, exec, ~/dotfiles/script/cycle_wallpaper.sh "pse"
ソースコード
https://github.com/Uliboooo/dotfiles/blob/main/script/cycle_wallpaper.sh https://github.com/Uliboooo/dotfiles/blob/main/.config/systemd/user/cycle_wallpaper.service https://github.com/Uliboooo/dotfiles/blob/main/.config/systemd/user/cycle_wallpaper.timer