Windows10でも出来るのに、Linuxで出来ないってなんかおかしくね?
ってところから始まったチャレンジ。
きっかけは、「そういやmplayerを壁紙にして動画壁紙にするって話があったなぁ」と過去の記憶を呼び覚まし。
「つまり、デスクトップのWindowIDが解れば解決しそう」って感じ。
では、WindowIDはどのように取得するのか?
xwininfoというコマンドがありました。
これにオプションをつけて、複数のデスクトップのWindowIDを取得します。
WindowIDというのは、固定されているものではなく、起動ごとに変更になります。
そのため、そのたびにIDも取得します。
さらに。
そのWindowIDを指定してスライドショーを動作させれば、Windows10ちっくなマルチディスプレイでのスライドショーが実現できるのではないか、と思って頑張って調べました。
スクリーンセーバーを利用するのが良さそうです。
今回はスライドショーなのでGLSlideshowを使用します。
インストールされていない場合があるので、以下のコマンドを実行します。
sudo apt-get install xscreensaver
sudo apt-get install xscreensaver-gl
端末から
xscreensaver-demo
を起動し、スライドショーに指定するディレクトリを指定します。

拡張オプション>画像の操作>画像をランダムに選択する、と参照ボタンを押してスライドショーに使用するディレクトリを選択します。
それで。
以下のスクリプトを作成
---------- ここから ----------
#!/bin/sh
echo $1
DESKTOP_ID=`xwininfo -root -tree | awk '{if($3 == "(\"nemo-desktop\""){print $1}}' | awk -v line=$1 'NR==line'`
echo $DESKTOP_ID
if [ -n $DESKTOP_ID ]; then
/usr/lib/xscreensaver/glslideshow -window-id $DESKTOP_ID -zoom 100 -duration 60&
fi
---------- ここまで ----------
slideshow.shとでもして、実行可能な場所に保存し、chmod +x slideshow.shとして実行可能属性をつけておきます。
これで準備は完了です、
このスクリプトは引数を取り、画面番号を指定します。
メイン画面が1、2、3と増やしていきます。
デュアルモニタなら以下のように端末から実行してください。
slideshow.sh 1
slideshow.sh 2
無事にスライドショーが開始されたでしょうか?
さあ問題は解決です!!
…とは問屋が降ろさないのがこういう場合のお約束。
デスクトップのアイコンが消えていますね?
そう。これを使うとデスクトップの表示を上書きしてしまうため、アイコンの表示も消えます。
しかしながら、デスクトップをクリックすると再度デスクトップが描画され、アイコンも表示され、デスクトップに配置したアイテムも使用可能にはなります。
なら問題ないんじゃ…と思った方。
問題はそれだけではないのです。
デスクトップをクリックしたとたん、従来のデスクトップの壁紙が表示されスライドショーで表示されていた壁紙が上書きされます。
まあ、こちらも時間が経過すれば、またスライドショーが実行されるのですけれども。
なお、スクリプトの-duration 60というのがスライドショーの間隔です。秒単位で指定します。
とりあえずCinnamonの設定でも壁紙をスライドショーにしておくと、なんとなくWindows10チックな動作にはなりますし、デスクトップのアイコンも使えないわけではないので、一応の目的は果たしたことになります。
なお、これはシェルスクリプトなので、基本ディストリビューションを選ばないところもメリットでしょうか。
毎回コマンドを叩くのが面倒な場合、自動起動にシェルスクリプトを仕込んでおくと幸せになれるかも知れません。
また、スライドショーの終了は端末から以下のコマンド
killall glslideshow
でスライドショーが終了します。
まあ、やりたいことは実現できたので、とりあえずなんとかなったかな、という感じですが、デスクトップクリックで画像が、とか、アイコン消えるとか、やはり不完全な感じは否めません。
標準で対応しているDEもあるようなので、この辺、Cinnamonも対応してくれないかなぁ。
----- 追記 -----
自動起動に設定してうまくglslideshowが起動しない場合、glslideshowの前にsleepを追加してみてください。
ワタクシの環境では5秒くらいで上手く行きました。
ついでに。
ワタクシの環境の場合、デュアルディスプレイなので、メインディスプレイはDEのスライドショーに任せてサブディスプレイの方だけ、GLSlideshowにすれば問題は、やや低下します。
もっとも元々デスクトップにいろいろ置かない性質なので、デスクトップが使えなくなっても問題ないのですが。
まあ、片方だけGLSlideshowにしても問題ないから、いったんこの運用で行くかな。
あるいは、Nemoにデスクトップを管理させない、Cinnamonにデスクトップを管理させない何かを実行するか。
この辺がまだ調べきれてないです。
----- 追記 -----
shell scriptをちょっと修正
----- 追記 -----
Ubuntu 19.04の場合は以下のShell Scriptで行けそう。
---------- ここから ----------
#!/bin/sh
echo $1
DESKTOP_ID=`xwininfo -root -tree | awk '{if($2 == "(\"mutter guard window\""){print $1}}' | awk -v line=$1 'NR==line'`
echo $DESKTOP_ID
if [ -n $DESKTOP_ID ]; then
/usr/lib/xscreensaver/glslideshow -window-id $DESKTOP_ID -zoom 100 -duration 60&
fi
---------- ここまで ----------
未検証。
仮想環境でデュアルディスプレイできないしなぁ。
----- 追記 -----
Ubuntu向けのShellScriptが間違ってました。
---------- ここから ----------
#!/bin/sh
echo $1
DESKTOP_ID=`xwininfo -root -tree | awk '{if($2 == "\"mutter"){print $1}}' | awk -v line=$1 'NR==line'`
echo $DESKTOP_ID
if [ -n $DESKTOP_ID ]; then
/usr/lib/xscreensaver/glslideshow -window-id $DESKTOP_ID -zoom 100 -duration 60&
fi
---------- ここまで ----------
でも仮想環境だと、glslideshowがエラー出して動作しない。
ん〜なんだろう?
最近のコメント