†Linuxなんて大キライ†
作成開始日
最終更新日
pcmanfm -w <画像ファイル名>ループを回して、この<画像ファイル名>の部分を定期的に変更すれば良い。もう少し具体的に考えると、所定のディレクトリ内にある《全ての画像ファイル》(*.jpg)の中から、《ランダムに選び出した》画像ファイルを、《一定時間ごと》に壁紙に設定する。
@所定のディレクトリ(ここでは/usr/share/backgrounds)の中にある、全ての「*.jpg」ファイルの名前を配列の中に格納する(シンボリックリンクは除く)。
もちろん、所定のディレクトリに複数枚のJpeg画像(*.jpg)が入っている事が大前提。デフォルトでは/usr/share/backgroundsにJpeg画像は入っていないので注意。
Aファイル名配列の中身をシャッフル(ランダム交換)する。単純な乱数指定ではファイルの重複がありうるが、シャッフル方式ならば重複なく全画像を表示できる。
B画像の枚数分だけループを回し、シャッフルされた画像配列を順次壁紙に設定。設定後一定時間(ここでは3600秒=1時間)の間を置く。
で、まあ、以下のようなカンジになったのだが、何しろbashのシェルスクリプトを書いた経験は殆どないので、ネット情報を頼りに手探り作業になった。変数参照めんどくさいよね〜
### LXDE壁紙オートチェンジャー wallpaper.sh
### 壁紙ファイルの読み込み
n=0
for img in /usr/share/backgrounds/*.jpg #シンボリックリンクは対象外
do
n=$((n+1))
wallpaper[$n]="$img"
done
nmax=$n
### 壁紙ファイルのシャッフル
for((n=1; n<=$nmax; n++)) #{1..$nmax}は使えない…
do
r=$((RANDOM % $nmax + 1))
wptmp=${wallpaper[$n]}
wallpaper[$n]=${wallpaper[$r]}
wallpaper[$r]=$wptmp
done
### 壁紙ファイルの変更
for((n=1; n<=$nmax; n++)) #{1..$nmax}は使えない…
do
tm=$(date +"%H:%M") #設定時刻を表示
echo $tm ${wallpaper[$n]}
pcmanfm -w ${wallpaper[$n]}
sleep 3600 #3600秒=1時間
done
exit
所定のディレクトリに画像が16枚入っていて、変更間隔が1時間ならば、16時間でこのスクリプトは終了する。私はPCを24時間稼動させているが、睡眠中に壁紙を変更しても仕方ないので、無限ループしない仕様とした。終了後は最後の画像が壁紙になる。
なお、壁紙の表示方法(原寸中央表示、拡大、タイル等)は、[デスクトップの設定]で指定されている形式が使用される。コマンドラインから設定することもできるが(pcmanfm --wallpaper-mode=MODE)、個人的には「はみ出し切り捨て」固定で問題ないと思う。
また、Jpeg以外の画像ファイル(シンボリックリンクを含む)に対応させることも難しくはない。最初の方にある「for img in /usr/share/backgrounds/*.jpg」の行の最後を「*.*」とするだけで良い。「*.jpg」に限定したのは、あくまでも私の個人的な都合。
上記のスクリプトは骨格部分だけなので、もうちょっと自分の都合に合わせた機能を付け加えてみた。その都合とは、1600x1200や1280x960と言った4:3比率の画像を、1280x968サイズのワークエリアの背景に表示したい、と言うもの。この「1280x968」は何ぞやというハナシは置いておく。それこそ、他人に話しても殆ど意味がないことなので。
ともあれ、領域が1280x968なんだから、1280x960サイズの画像は普通に表示できる。ただ、天地に4ドットずつの空きができてしまう。それが嫌なのだ。じゃあどうする?全体を少し(0.8%ほど)拡大して左右をちょっとカットするか…まあ、それでも良いのだが、できるだけ元の画像ファイルに手を加えたくない。1280x960なり1600x1200なりのサイズで保管・管理・運用したい。
そこで、ImageMagicのconvertを使って、サイズを微妙に変更したテンポラリ・ファイル(.wall-temp.jpg)を作成し、それを壁紙として表示することにした。
convert mypic.jpg -resize 1280x968! .wall-temp.jpgこれは、4:3比率の「mypic.jpg」ファイルを「1280x968」にリサイズして「.wall-temp.jpg」(隠しファイル)に出力する命令。ポイントは「968」の後に付いている「!」で、これがないとアスペクト比が保持されてしまい、「.wall-temp.jpg」は1280x960となってしまう。
逆に言うと、この変換はアスペクト比を保持しない。が、縦方向に0.8%延びるだけなので、目視では識別不可能。しかも、一時使用の使い捨てファイルで、元ファイルは何の影響も受けない。
すべての画像をこのようにリサイズ表示するのであれば処理は簡単だが、物によってはSXGA(1280x1024)フルサイズに表示したい画像もある。つまり、同じ1280x960ファイルでも、上記の方法でリサイズして「原寸表示」するファイルと、加工なしで「はみ出し切り捨て」表示するファイルの2種類がある。それは画像の構図によるもので、機械的には判別できない。
でも、機械的に判別できないとスクリプトでの自動処理は不可能なので、リサイズ表示するファイルにマークを付ける。ここでは、ファイル名の末尾を「_」で終らせるというルールにした。つまり、リサイズ表示するファイルには必ず「_.jpg」という文字列が含まれる。
if [[ ${wallpaper[$n]} = *"_.jpg" ]] ; then
#リサイズして[原寸中央表示]
else
#加工なしで[はみ出し切り捨て]
fi
以上を踏まえて、壁紙の変更部分を次のように改造した。
### 壁紙ファイルの変更
for((n=1; n<=$nmax; n++)) #{1..$nmax}は使えない…
do
tm=$(date +"%H:%M")
echo $tm "($n)" ${wallpaper[$n]}
if [[ ${wallpaper[$n]} = *"_.jpg" ]] ; then
#1280x960比率の画像のリサイズ(表示領域:1280x968)
convert ${wallpaper[$n]} -resize 1280x968! .wall-temp.jpg
wallpaper[$n]=".wall-temp.jpg"
pcmanfm --wallpaper-mode=center #原寸中央表示
else
#一般の画像は全画面表示で[はみ出し切り捨て]
pcmanfm --wallpaper-mode=crop #はみ出し切り捨て
fi
pcmanfm -w ${wallpaper[$n]}
sleep 900 #900秒=15分
done
exit
# --wallpaper-mode
# color (fill with solid color),
# stretch (stretch to fill entire monitor),
# fit (stretch to fit monitor size),
# center (place on center of monitor),
# tile (tile to fill entire monitor),
# crop (stretch and crop to fill monitor), or
# screen (stretch to fill entire screen)
もう一つは、壁紙変更時に確認ダイアログを表示することにした。なんか、オートチェンジャーの意義を根本的に否定するような改造だが、実際に運用していると、こちらの方が便利に感じる。要は貧乏症で、長時間離席中に勝手に変更されて、一目も見ることなく流れていく壁紙があるのが、生理的に許せないのだ(^_^; それが特にお気に入りの壁紙だったりすると…
ダイアログ表示にはzenityがお手軽だが、zenityは画面中央にしか表示できない(と思う)。できれば、壁紙の邪魔にならない画面右下に小さく表示してほしい。と言うことで、zenityの強化版であるyadをインストールして使用した。これならば、任意の位置にダイアログを表示できるし、見栄えも良い。ただし、使い方がイマイチ判り難いし、バグも残っている感じ。
### 壁紙ファイルの変更
for((n=1; n<=$nmax; n++)) #{1..$nmax}は使えない…
do
tm=$(date +"%H:%M") #変更時刻の表示
echo $tm "($n)" ${wallpaper[$n]}
#デフォルトは全画面表示で[はみ出し切り捨て]
wmode="crop"
#4:3画像をリサイズして1280x968エリアに表示(_)
if [[ ${wallpaper[$n]} = *"_.jpg" ]] ; then
convert ${wallpaper[$n]} -resize 1280x968! .wall-temp.jpg
wallpaper[$n]=".wall-temp.jpg"
wmode="center" #原寸中央表示
fi
#横長/縦長画像をカットなしでフィット表示(-)
if [[ ${wallpaper[$n]} = *"-.jpg" ]] ; then
wmode="fit" #縦横比を維持したまま画面いっぱいに
fi
pcmanfm -w ${wallpaper[$n]}
pcmanfm --wallpaper-mode=$wmode
sleep 3600
yad --posx 1181 --posy 915 --button=Change #SXGA画面の右下
done
exit