†Linuxなんて大キライ†

作成開始日
最終更新日

LXDEの壁紙にはオートチェンジャー機能がない。そんな程度のこと、適当なユーティリティを拾ってくれば簡単に解決…しなかったorz 仕方ないので、シェルスクリプトで自作することにした。ちなみに、LXDEの標準のデスクトップマネージャはpcmanfmなので、壁紙設定もpcmanfmで行うことになる。基本的な使い方は以下の通り;
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)


【Linuxなんて大キライ目次】 【ホーム】