2022/05/26(木) [n年前の日記]
#1 [xscreensaver][linux][ubuntu] xscreensaverについてまだ調べてる
Ubuntu Linux 20.04 LTS + Xfce で、xscreensaver や xfce4-screensaver をインストールした際に、どこに何が置かれるのか調べているところ。
xscreensaver から呼び出される各プログラム、というか、それぞれの実行バイナリは、/usr/lib/xscreensaver/ 以下に置いてある模様。
/etc/X11/app-defaults/XScreenSaver は、デフォルトの設定ファイルだろうか。
/usr/share/xscreensaver/config/*.xml が、各モジュールの設定関連ファイルっぽい。もしかすると、ここにファイルを追加してやれば、スクリーンセーバの設定画面のリスト項目が増えるのだろうか。
xscreensaver から呼び出される各プログラム、というか、それぞれの実行バイナリは、/usr/lib/xscreensaver/ 以下に置いてある模様。
/etc/X11/app-defaults/XScreenSaver は、デフォルトの設定ファイルだろうか。
/usr/share/xscreensaver/config/*.xml が、各モジュールの設定関連ファイルっぽい。もしかすると、ここにファイルを追加してやれば、スクリーンセーバの設定画面のリスト項目が増えるのだろうか。
◎ README.hacking を眺めてる。 :
xscreensaver の公式サイトで、「新しいスクリーンセーバを作りたいなら README.hacking を読め」と書いてあった気がするので、xscreensaver-6.03.tar.gz をDLして解凍して、中に入ってた README.hacking を自動翻訳を通しつつ眺めてみた。
たぶんコレ、わざわざDLして解凍して取り出して読むのは面倒だろうから、一応、 _ココ にも置いてみる。日本語部分は utf8n で記述。
ざっと眺めてみたけれど、コレは困った。先日試してたチュートリアル記事の内容とは、結構異なることが書いてあるように見える。
例えば、「hoge_draw という関数を作れ」「その関数には、1フレーム分だけ描画する処理を書け」「usleep()は呼ぶなよ。絶対呼ぶなよ」と書いてある。先日のチュートリアルのサンプルソースでは、while(1) { } でメインループを書いて、その中で usleep() を呼んで時間待ちをしていたわけで。全然違うやん。やったらダメな書き方やん。みたいな。
それはともかく。以下の3つが「非常にシンプル」なので参考になるであろう、とも書いてあるのだけど。
眺めてみたら、「どこがシンプルやねん!」と床に叩きつけたくなるソースのように思えた。作者様の「は? こんなソースも読めないの?」的嘲笑が聞こえてくる…(幻聴)。いやまあ、Netscape Navigator を作って世界を変えてみせたプログラマーさんの作だから、自分のようなゴミカス底辺プログラマーがスラスラ読めるわけもないのですけど。
せめて雛形でもあればなあ…。helloworld ならぬ helloxsaver.c とか無いのかな。無いだろうな。
たぶんコレ、わざわざDLして解凍して取り出して読むのは面倒だろうから、一応、 _ココ にも置いてみる。日本語部分は utf8n で記述。
ざっと眺めてみたけれど、コレは困った。先日試してたチュートリアル記事の内容とは、結構異なることが書いてあるように見える。
例えば、「hoge_draw という関数を作れ」「その関数には、1フレーム分だけ描画する処理を書け」「usleep()は呼ぶなよ。絶対呼ぶなよ」と書いてある。先日のチュートリアルのサンプルソースでは、while(1) { } でメインループを書いて、その中で usleep() を呼んで時間待ちをしていたわけで。全然違うやん。やったらダメな書き方やん。みたいな。
それはともかく。以下の3つが「非常にシンプル」なので参考になるであろう、とも書いてあるのだけど。
- hacks/greynetic.c
- hacks/deluxe.c
- hacks/glx/dangerball.c
眺めてみたら、「どこがシンプルやねん!」と床に叩きつけたくなるソースのように思えた。作者様の「は? こんなソースも読めないの?」的嘲笑が聞こえてくる…(幻聴)。いやまあ、Netscape Navigator を作って世界を変えてみせたプログラマーさんの作だから、自分のようなゴミカス底辺プログラマーがスラスラ読めるわけもないのですけど。
せめて雛形でもあればなあ…。helloworld ならぬ helloxsaver.c とか無いのかな。無いだろうな。
◎ ビルドを試した。 :
Ubuntu Linux 20.04 LTS上で、xscreensaver-6.03.tar.gz のビルドができそうか試してみた。
./configure を実行した際、最後のあたりで、以下のメッセージが出てきた。
「systemdが見つからない」「xscreensaverがインストール済みなんだけど?」みたいなことを言ってるのだろうか。
それでも一応 make を走らせてみたら、hacks/ 以下に実行バイナリが出来上がったように見えた。
sudo make install は怖いからやってない。前述のメッセージからすると、/usr/lib/xscreensaver/ に入れなきゃいけないのに /usr/libexec/xscreensaver/ に入れてしまいそうでもあるし…。
もしかして、./configure --prefix=/usr --libexecdir=/usr/lib と打てば、インストール先が Ubuntu のソレと一致するのだろうか。Linuxのこういうのって、よく分からん…。
tar zxvf xscreensaver-6.03.tar.gz cd xscreensaver-6.03 ./configure --prefix=/usr make
./configure を実行した際、最後のあたりで、以下のメッセージが出てきた。
################################################################# Warning: The systemd library was not found. This means that xscreensaver-systemd won't be built. Without that, xscreensaver will not be able to auto-lock before the system is suspended (e.g., closing laptop lid) and might activate while video playback is in progress. Warning: Your system seems to have PAM, but PAM is not being used. That is probably not going to work out well. ################################################################# Warning: There is already an installed package of xscreensaver version "5.42+dfsg1-1ubuntu1", in these directories: User programs: /usr/bin/ Screen savers: /usr/lib/xscreensaver/ (DIFFERS) Configuration: /usr/share/xscreensaver/config/ Extra fonts: none App Defaults: /etc/X11/app-defaults/ ################################################################# XScreenSaver will be installed in these directories: User programs: /usr/bin/ Screen savers: /usr/libexec/xscreensaver/ (DIFFERS) Configuration: /usr/share/xscreensaver/config/ Extra Fonts: /usr/share/fonts/xscreensaver/ App Defaults: /etc/X11/app-defaults/
「systemdが見つからない」「xscreensaverがインストール済みなんだけど?」みたいなことを言ってるのだろうか。
それでも一応 make を走らせてみたら、hacks/ 以下に実行バイナリが出来上がったように見えた。
sudo make install は怖いからやってない。前述のメッセージからすると、/usr/lib/xscreensaver/ に入れなきゃいけないのに /usr/libexec/xscreensaver/ に入れてしまいそうでもあるし…。
もしかして、./configure --prefix=/usr --libexecdir=/usr/lib と打てば、インストール先が Ubuntu のソレと一致するのだろうか。Linuxのこういうのって、よく分からん…。
◎ 仮で新しいスクリーンセーバを置いてみた。 :
hacks/deluxe.c をコピーして、hacks/helloxsaver.c というファイルを作成してみることにする。加えて、マニュアルに相当するらしい .man や、設定ダイアログを定義する .xml も同様に増やす。
それぞれ、エディタで中を開いて、「deluxe」「Deluxe」と書かれた、それらしい文字列を、「helloxsaver」「Helloxsaver」に書き換えてみた。
後は、これらのファイルをコンパイルする Makefile があればいいはず。
./configure --prefix=/usr --libexecdir=/usr/lib を実行したら、自動で hacks/Makefile に追加してくれないかなと期待したけど、そんなことはなかった。
どうやら、hacks/Makefile.in を、手作業で書き換えないといけないっぽい。
hacks/Makefile.in をエディタで開いて、「deluxe」で検索。見つかった場所の最後のあたりに、「helloxsaver.c」「helloxsaver.o」「helloxsaver」等々を追加してみた。
この状態で、make clean をして作業用ファイルを削除してから、./configure --prefix=/usr --libexecdir=/usr/lib を実行。Makefile.in の内容に従って Makefile が生成された。と思う。たぶん。この状態で、make。
一応、hacks/helloxsaver という実行バイナリが出来上がったように見える。
cp hacks/deluxe.c hacks/helloxsaver.c cp hacks/deluxe.man hacks/helloxsaver.man cp hacks/config/deluxe.xml hacks/config/helloxsaver.xml
それぞれ、エディタで中を開いて、「deluxe」「Deluxe」と書かれた、それらしい文字列を、「helloxsaver」「Helloxsaver」に書き換えてみた。
後は、これらのファイルをコンパイルする Makefile があればいいはず。
./configure --prefix=/usr --libexecdir=/usr/lib を実行したら、自動で hacks/Makefile に追加してくれないかなと期待したけど、そんなことはなかった。
どうやら、hacks/Makefile.in を、手作業で書き換えないといけないっぽい。
hacks/Makefile.in をエディタで開いて、「deluxe」で検索。見つかった場所の最後のあたりに、「helloxsaver.c」「helloxsaver.o」「helloxsaver」等々を追加してみた。
この状態で、make clean をして作業用ファイルを削除してから、./configure --prefix=/usr --libexecdir=/usr/lib を実行。Makefile.in の内容に従って Makefile が生成された。と思う。たぶん。この状態で、make。
一応、hacks/helloxsaver という実行バイナリが出来上がったように見える。
◎ インストールしてみた。 :
Ubuntu Linux 20.04 LTS 上で作業しているけれど、どうせ VMware Player上で仮想PCとして動かしているわけだし、もし環境が壊れたらまた再インストールすればいいや、ぐらいのノリで sudo make install をして、公式リポジトリ版 xscreensaver に上書きしてみた。
xscreensaver & を打った時点で、スプラッシュ画面が表示されて、「XScreenSaver 2022, V6.03」と表示された。おそらく最新版で置き換わったのだろう…。更に、xscreensaver-settings & と打ったら、スクリーンセーバの種類が選べるウインドウが表示された。
しかし、自分で勝手に追加した helloxsaver (Helloxsaver) は、リストの中に表示されていなかった。
古い ~/.xscreensaver が残っているせいだろうか。rm ~/.xscreensaver で削除。xscreensaver-settings & を打ってみたけど、やはりリストに登録されない。
これはもしかして、別のどこかでリストに登録されるべき項目が記述されているのではなかろうか。それはどこだ。なんというファイルなのか。分からん。
とりあえず、自分で、~/.xscreensaver を編集して、programs: の最後のあたりに、「 helloxsaver -root \n\」を追加してみた。
この状態なら、リストに Helloxsaver が出てくる。
tar zxvf xscreensaver-6.03.tar.gz cd xscreensaver-6.03 (helloxsaver.c 等を追加。Makefile.in を修正。) ./configure --prefix=/usr --libexecdir=/usr/lib make sudo make install killall xscreensaver xscreensaver & xscreensaver-settings &
xscreensaver & を打った時点で、スプラッシュ画面が表示されて、「XScreenSaver 2022, V6.03」と表示された。おそらく最新版で置き換わったのだろう…。更に、xscreensaver-settings & と打ったら、スクリーンセーバの種類が選べるウインドウが表示された。
しかし、自分で勝手に追加した helloxsaver (Helloxsaver) は、リストの中に表示されていなかった。
古い ~/.xscreensaver が残っているせいだろうか。rm ~/.xscreensaver で削除。xscreensaver-settings & を打ってみたけど、やはりリストに登録されない。
これはもしかして、別のどこかでリストに登録されるべき項目が記述されているのではなかろうか。それはどこだ。なんというファイルなのか。分からん。
とりあえず、自分で、~/.xscreensaver を編集して、programs: の最後のあたりに、「 helloxsaver -root \n\」を追加してみた。
programs: \ maze -root \n\ GL: superquadrics -root \n\ ... ... GL: squirtorus -root \n\ helloxsaver -root \n\
この状態なら、リストに Helloxsaver が出てくる。
◎ 2022/05/27追記。 :
~/.xscreensaver を削除しても、helloxsaver がリストに登録されない理由が分かった。
つまり、driver/XScreenSaver.ad.in に、" helloxsaver -root \n\" を追記しておく必要があった。「deluxe」で検索してみて、その行を複製して、「deluxe」を「helloxsaver」に書き換えておけばいい。
driver/XScreenSaver.ad.in を修正後、以下を打つ。
これでリストに Helloxsaver が出現してくれた。
- ./configure --prefix=/usr --libexecdir=/usr/lib を実行すると、driver/XScreenSaver.ad.in から、driver/XScreenSaver.ad が作られる。
- sudo make install をすると、driver/XScreenSaver.ad が、/etc/X11/app-defaults/XScreenSaver にコピーされる。
- xscreensaver-settings を起動した際、~/.xscreensaver が存在しなければ、/etc/X11/app-defaults/XScreenSaver が ~/.xscreensaver としてコピーされる。
つまり、driver/XScreenSaver.ad.in に、" helloxsaver -root \n\" を追記しておく必要があった。「deluxe」で検索してみて、その行を複製して、「deluxe」を「helloxsaver」に書き換えておけばいい。
driver/XScreenSaver.ad.in を修正後、以下を打つ。
make clean ./configure --prefix=/usr --libexecdir=/usr/lib make sudo make install rm ~/.xscreensaver xscreensaver-settings &
これでリストに Helloxsaver が出現してくれた。
[ ツッコむ ]
以上です。