2022/05/28(土) [n年前の日記]
#1 [xscreensaver] xscreensaver用のスクリーンセーバを作りたい
xscreensaver用のスクリーンセーバを自分で作れるのかどうか気になって、少し調べていたのでそのあたりをメモ。
公式サイトは以下。
_XScreenSaver
動作確認環境は、Ubuntu Linux 20.04 LTS。Windows10 x64 21H2 + VMware Workstation Player 16.2.3 build-19376536 上で動かしてる状態。
公式サイトは以下。
_XScreenSaver
動作確認環境は、Ubuntu Linux 20.04 LTS。Windows10 x64 21H2 + VMware Workstation Player 16.2.3 build-19376536 上で動かしてる状態。
◎ 公式リポジトリ版のインストール。 :
作り始める前に、まずは、Ubuntu公式リポジトリ版の xscreensaver をインストールできるか試す。
おそらく、端末上で以下を打てばインストールできるはず。
どんなパッケージがあるのかは、以下で確認できる…かな…。たぶん。
xscreensaver は、GNOME や Xfce4 が標準で持ってるスクリーンセーバと若干競合するらしいので、xscreensaver をインストールする際に、もしそれらのスクリーンセーバがインストールされているなら、アンインストールしておく。
ちなみに、xscreensaver の設定画面を出すのは以下。
xscreensaver が起動している状態で、xscreensaver のプロセスを終了させたいなら以下。
おそらく、端末上で以下を打てばインストールできるはず。
sudo apt install xscreensaver*
どんなパッケージがあるのかは、以下で確認できる…かな…。たぶん。
$ sudo apt install aptitude $ sudo aptitude search xscreensaver i A libopengl-xscreensaver-perl - Perl module for writing OpenGL-based XScreenSaver hacks i xscreensaver - X11 向けスクリーンセーバデーモンおよびフロントエンド i xscreensaver-data - Screen saver modules for screensaver frontends i xscreensaver-data-extra - スクリーンセーバーフロントエンド用の追加のスクリーンセーバーモジュール i xscreensaver-gl - GL(Mesa) screen saver modules for screensaver frontends i xscreensaver-gl-extra - Extra GL(Mesa) screen saver modules for screensaver frontends i xscreensaver-screensaver-bsod - XScreenSaver の BSOD スクリーンセーバーモジュール i xscreensaver-screensaver-dizzy - Graphics demo that makes you dizzy (XScreenSaver hack) i xscreensaver-screensaver-webcollage - Webcollage screen saver module from XScreenSaver
xscreensaver は、GNOME や Xfce4 が標準で持ってるスクリーンセーバと若干競合するらしいので、xscreensaver をインストールする際に、もしそれらのスクリーンセーバがインストールされているなら、アンインストールしておく。
sudo apt remove gnome-screensaver sudo apt remove xfce4-screensaver sudo apt remove cinnamon-screensaver
ちなみに、xscreensaver の設定画面を出すのは以下。
xscreensaver-settings &
xscreensaver が起動している状態で、xscreensaver のプロセスを終了させたいなら以下。
xscreensaver-command -exit
$ ps aux | grep xscreensaver username 1421 0.0 0.0 6920 3596 ? S 21:51 0:00 xscreensaver -no-splash username 1896 0.0 0.0 10084 720 pts/0 R+ 21:59 0:00 grep --color=auto xscreensaver $ xscreensaver-command -exit xscreensaver-command: exiting $ ps aux | grep xscreensaver username 1901 0.0 0.0 10084 652 pts/0 S+ 21:59 0:00 grep --color=auto xscreensaverxscreensaver-command -exit を実行すると、プロセスが無くなってることが分かるかなと。
◎ ソースからビルド。 :
ソースからビルドできるか試してみる。ソースは以下から入手できる。
_XScreenSaver: Download
Ubuntu Linux 20.04 LTS の場合、ソースからのビルドは以下のような感じでできそうな気配がする。本当にこれで合ってるのか分からないけれど。
ビルドした実行バイナリ群を所定の場所にインストールするなら以下。公式リポジトリ版 xscreensaver をインストール済みなら、それらが最新版のバイナリで上書きされる。
既に存在する設定ファイルを消去。
xscreensaver を再設定。設定すると、~/.xscreensaver が作られる。
ちなみに、./configure --prefix=/usr --libexecdir=/usr/lib を実行すると、ビルドに必要な Makefile を自動生成してくれるけど、その際表示されるメッセージの最後のあたりで、「ビルドした実行バイナリその他をコピーする場所はここだよ」と一覧表示してくれる。
何か妙なことになったら、このあたりの場所を眺めてみると、何か分かるかもしれない。
_XScreenSaver: Download
Ubuntu Linux 20.04 LTS の場合、ソースからのビルドは以下のような感じでできそうな気配がする。本当にこれで合ってるのか分からないけれど。
wget https://www.jwz.org/xscreensaver/xscreensaver-6.03.tar.gz tar zxvf xscreensaver-6.03.tar.gz cd xscreensaver-6.03 ./configure --prefix=/usr --libexecdir=/usr/lib make
ビルドした実行バイナリ群を所定の場所にインストールするなら以下。公式リポジトリ版 xscreensaver をインストール済みなら、それらが最新版のバイナリで上書きされる。
sudo make install
既に存在する設定ファイルを消去。
rm ~/.xscreensaver
xscreensaver を再設定。設定すると、~/.xscreensaver が作られる。
xscreensaver-settings &
ちなみに、./configure --prefix=/usr --libexecdir=/usr/lib を実行すると、ビルドに必要な Makefile を自動生成してくれるけど、その際表示されるメッセージの最後のあたりで、「ビルドした実行バイナリその他をコピーする場所はここだよ」と一覧表示してくれる。
... config.status: creating po/Makefile config.status: executing po/stamp-it commands ################################################################# 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/ 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/lib/xscreensaver/ Configuration: /usr/share/xscreensaver/config/ Extra Fonts: /usr/share/fonts/xscreensaver/ App Defaults: /etc/X11/app-defaults/
- xscreensaver本体がインストールされる場所 : /usr/bin/
- 各スクリーンセーバの実行バイナリが入る場所 : /usr/lib/xscreensaver/
- 各スクリーンセーバの設定画面定義ファイル (.xml) : /usr/share/xscreensaver/config/
- xscreensaverが使うフォント : /usr/share/fonts/xscreensaver/
- xscreensaver本体のデフォルト設定ファイル (XScreenSaver) : /etc/X11/app-defaults/
何か妙なことになったら、このあたりの場所を眺めてみると、何か分かるかもしれない。
◎ 新しいスクリーンセーバ用のファイルを追加する。 :
xscreensaver用の新しいスクリーンセーバを作る場合は、ソース群に同梱されている
_README.hacking
が参考になる。
例えば、ここでは helloxsaver という名前のスクリーンセーバを作ってみることにする。
必要になるファイルは、3つ。
それぞれ、以下の場所に追加する。
README.hacking の中で、「Greynetic と Deluxe がシンプルだから参考になるだろう」と書かれているので、deluxe.c、deluxe.man、deluxe.xml を、helloxsaver.c、helloxsaver.man、helloxsaver.xml として別名コピーして、それらのファイルの中身を書き換えて実験するのが良いのではないか、と思う。
例えば、ここでは helloxsaver という名前のスクリーンセーバを作ってみることにする。
必要になるファイルは、3つ。
- helloxsaver.c : スクリーンセーバの処理が書かれたC言語のソースファイル
- helloxsaver.man : マニュアルファイル
- helloxsaver.xml : 設定画面の項目等を定義したxmlファイル
それぞれ、以下の場所に追加する。
- *.c, *.man : hacks/ ディレクトリ内に入れる。
- *.xml : hacks/config/ ディレクトリ内に入れる。
README.hacking の中で、「Greynetic と Deluxe がシンプルだから参考になるだろう」と書かれているので、deluxe.c、deluxe.man、deluxe.xml を、helloxsaver.c、helloxsaver.man、helloxsaver.xml として別名コピーして、それらのファイルの中身を書き換えて実験するのが良いのではないか、と思う。
cp -v hacks/deluxe.c hacks/helloxsaver.c cp -v hacks/deluxe.man hacks/helloxsaver.man cp -v hacks/config/deluxe.xml hacks/config/helloxsaver.xml
◎ Makefileを修正。 :
追加した *.c をコンパイルしてくれるように、hacks/Makefile を ―― Makefileそのものは ./configure を実行すると自動生成されて修正内容が消えてしまうので、自動生成時の元になる hacks/Makefile.in を修正する。
念のために、別名コピーしてバックアップを取っておく。
エディタ(ここでは geditを使用)で開く。
ファイル内を、「deluxe」で検索。(gedit なら、Ctrl + F でファイル内検索ができる。)
「deluxe.c」「deluxe.o」「deluxe」「deluxe.man」等々の文字列が書かれてる場所が見つかるので、「helloxsaver.c」「helloxsaver.o」「helloxsaver」「helloxsaver.man」を追記してみたり、あるいは、行をコピーして、「deluxe」を「helloxsaver」に書き換えたりする。
書き換えが終わったら、./configure を実行して、Makefile を自動生成し直す。
hacks/Makefile をエディタで開いて、helloxsaver という文字列が入ってるようなら、Makefile の修正はOK。
一応、今回書き換えた部分も載せておく。
念のために、別名コピーしてバックアップを取っておく。
cp -v hacks/Makefile.in hacks/Makefile.in.orig
エディタ(ここでは geditを使用)で開く。
gedit hacks/Makefile.in &
ファイル内を、「deluxe」で検索。(gedit なら、Ctrl + F でファイル内検索ができる。)
「deluxe.c」「deluxe.o」「deluxe」「deluxe.man」等々の文字列が書かれてる場所が見つかるので、「helloxsaver.c」「helloxsaver.o」「helloxsaver」「helloxsaver.man」を追記してみたり、あるいは、行をコピーして、「deluxe」を「helloxsaver」に書き換えたりする。
書き換えが終わったら、./configure を実行して、Makefile を自動生成し直す。
./configure --prefix=/usr --libexecdir=/usr/lib
hacks/Makefile をエディタで開いて、helloxsaver という文字列が入ってるようなら、Makefile の修正はOK。
一応、今回書き換えた部分も載せておく。
--- Makefile.in.orig 2022-05-28 22:48:43.739400524 +0900 +++ Makefile.in 2022-05-28 22:55:42.960593626 +0900 @@ -105,7 +105,7 @@ SRCS = xscreensaver-getimage.c \ rotor.c ant.c xjack.c xlyap.c \ cynosure.c moire2.c flow.c epicycle.c interference.c \ truchet.c bsod.c crystal.c discrete.c distort.c kumppa.c \ - demon.c loop.c t3d.c penetrate.c deluxe.c compass.c \ + demon.c loop.c t3d.c penetrate.c deluxe.c helloxsaver.c compass.c \ squiral.c xflame.c wander.c spotlight.c critical.c \ phosphor.c xmatrix.c petri.c shadebobs.c xsublim.c ccurve.c \ blaster.c bumps.c ripples.c xspirograph.c \ @@ -144,7 +144,7 @@ OBJS = attraction.o blitspin.o bouboule rotor.o ant.o xjack.o xlyap.o xscreensaver-getimage.o \ cynosure.o moire2.o flow.o epicycle.o interference.o \ truchet.o bsod.o crystal.o discrete.o distort.o kumppa.o \ - demon.o loop.o t3d.o penetrate.o deluxe.o compass.o \ + demon.o loop.o t3d.o penetrate.o deluxe.o helloxsaver.o compass.o \ squiral.o xflame.o wander.o spotlight.o critical.o \ phosphor.o xmatrix.o petri.o shadebobs.o xsublim.o ccurve.o \ blaster.o bumps.o ripples.o xspirograph.o \ @@ -174,7 +174,7 @@ EXES = attraction blitspin bouboule bra fadeplot rdbomb coral mountain triangle \ xjack xlyap cynosure moire2 flow epicycle \ interference truchet bsod crystal discrete distort kumppa \ - demon loop penetrate deluxe compass squiral xflame \ + demon loop penetrate deluxe helloxsaver compass squiral xflame \ wander spotlight phosphor xmatrix petri shadebobs \ ccurve blaster bumps ripples xspirograph \ nerverot xrayswarm zoom whirlwindwarp rotzoomer \ @@ -216,7 +216,7 @@ MEN = anemone.man apollonian.man attrac blaster.man blitspin.man bouboule.man braid.man bsod.man \ bumps.man ccurve.man compass.man coral.man \ crystal.man cynosure.man decayscreen.man \ - deco.man deluxe.man demon.man discrete.man distort.man \ + deco.man deluxe.man helloxsaver.man demon.man discrete.man distort.man \ drift.man epicycle.man euler2d.man fadeplot.man \ flame.man flow.man fluidballs.man galaxy.man \ goop.man grav.man greynetic.man halo.man helix.man \ @@ -706,6 +706,9 @@ penetrate: penetrate.o $(HACK_OBJS) $(CO deluxe: deluxe.o $(HACK_OBJS) $(ALP) $(COL) $(DBE) $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ALP) $(COL) $(DBE) $(HACK_LIBS) +helloxsaver: helloxsaver.o $(HACK_OBJS) $(ALP) $(COL) $(DBE) + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(ALP) $(COL) $(DBE) $(HACK_LIBS) + compass: compass.o $(HACK_OBJS) $(DBE) $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(DBE) $(HACK_LIBS) @@ -1612,6 +1615,22 @@ deluxe.o: $(UTILS_SRC)/visual.h deluxe.o: $(UTILS_SRC)/xdbe.h deluxe.o: $(UTILS_SRC)/xft.h deluxe.o: $(UTILS_SRC)/yarandom.h +helloxsaver.o: ../config.h +helloxsaver.o: $(srcdir)/fps.h +helloxsaver.o: $(srcdir)/recanim.h +helloxsaver.o: $(srcdir)/screenhackI.h +helloxsaver.o: $(srcdir)/screenhack.h +helloxsaver.o: $(UTILS_SRC)/alpha.h +helloxsaver.o: $(UTILS_SRC)/colors.h +helloxsaver.o: $(UTILS_SRC)/font-retry.h +helloxsaver.o: $(UTILS_SRC)/grabscreen.h +helloxsaver.o: $(UTILS_SRC)/hsv.h +helloxsaver.o: $(UTILS_SRC)/resources.h +helloxsaver.o: $(UTILS_SRC)/usleep.h +helloxsaver.o: $(UTILS_SRC)/visual.h +helloxsaver.o: $(UTILS_SRC)/xdbe.h +helloxsaver.o: $(UTILS_SRC)/xft.h +helloxsaver.o: $(UTILS_SRC)/yarandom.h demon.o: $(srcdir)/automata.h demon.o: ../config.h demon.o: $(srcdir)/fps.h
◎ xscreensaverの設定ファイルを修正。 :
xscreensaver は、~/.xscreensaver を設定ファイルとして読み書きするけれど。元ファイルは /etc/X11/app-defaults/XScreenSaver。~/.xscreensaver が存在しない場合、/etc/X11/app-defaults/XScreenSaver を ~/.xscreensaver としてコピーする。
その、/etc/X11/app-defaults/XScreenSaver は、ソースファイル群の中の driver/XScreenSaver.ad が元になってる。更に、driver/XScreenSaver.ad は、driver/XScreenSaver.ad.in から自動生成される。
そんなわけで、XScreenSaver.ad.in に「helloxsaver」を追記すれば、xscreensaver の選択リストの中に「helloxsaver」も表示されるようにできる。
オリジナルをバックアップしておく。
エディタで開く。ちなみに、タブ文字幅は8。
「deluxe」で検索して、行を複製して、「helloxsaver」に書き換える。
書き換えが終わったら、./configure を実行して、XScreenSaver.ad を自動生成し直す。
driver/XScreenSaver.ad をエディタで開いて、「helloxsaver」の文字列があったら、修正はOK。
一応、今回書き換えた部分を載せておく。
その、/etc/X11/app-defaults/XScreenSaver は、ソースファイル群の中の driver/XScreenSaver.ad が元になってる。更に、driver/XScreenSaver.ad は、driver/XScreenSaver.ad.in から自動生成される。
そんなわけで、XScreenSaver.ad.in に「helloxsaver」を追記すれば、xscreensaver の選択リストの中に「helloxsaver」も表示されるようにできる。
オリジナルをバックアップしておく。
cp -v driver/XScreenSaver.ad.in driver/XScreenSaver.ad.in.orig
エディタで開く。ちなみに、タブ文字幅は8。
gedit driver/XScreenSaver.ad.in &
「deluxe」で検索して、行を複製して、「helloxsaver」に書き換える。
書き換えが終わったら、./configure を実行して、XScreenSaver.ad を自動生成し直す。
./configure --prefix=/usr --libexecdir=/usr/lib
driver/XScreenSaver.ad をエディタで開いて、「helloxsaver」の文字列があったら、修正はOK。
一応、今回書き換えた部分を載せておく。
--- XScreenSaver.ad.in.orig 2022-05-28 23:05:16.965155973 +0900 +++ XScreenSaver.ad.in 2022-05-28 23:07:40.161214058 +0900 @@ -397,6 +397,7 @@ XScreenSaver.bourneShell: /bin/sh ccurve -root \n\ compass -root \n\ deluxe -root \n\ + helloxsaver -root \n\ - demon -root \n\ @GLE_KLUDGE@ GL: extrusion -root \n\ - loop -root \n\
◎ *.c や *.man や *.xml を修正。 :
現在、helloxsaver.(c|man|xml) の中身は、deluxe.(c|man|xml) のままになっている。修正していく。
_README.hacking によると、xscreensaver用のスクリーンセーバ(のC言語ソース)は、以下が定義されている必要があるらしい。
つまり、今回、helloxsaver.c 内の、2つのグローバル変数の名前は以下になる。
5つの関数の名前は以下になる。
helloxsaver.c の中で「deluxe」で検索して、変数名、関数名、及び、一番最後の行を、「deluxe_xxxx」から「helloxsaver_xxxx」に書き換えておく。
同様に、helloxsaver.man や helloxsaver.xml も修正。中に書かれている「deluxe」「Deluxe」を「helloxsaver」「Helloxsaver」に書き換えておく。
_README.hacking によると、xscreensaver用のスクリーンセーバ(のC言語ソース)は、以下が定義されている必要があるらしい。
- 2つのグローバル変数。
- 5つの関数。
- 一番最後の行で、XSCREENSAVER_MODULE ("YourSaverName", yoursavername) が書かれていること。
つまり、今回、helloxsaver.c 内の、2つのグローバル変数の名前は以下になる。
- helloxsaver_defaults : 使用リソースのデフォルト値を列挙しておく。
- helloxsaver_options : 受け入れるコマンドラインオプションを列挙しておく。
5つの関数の名前は以下になる。
- helloxsaver_init : 初期化処理。グローバルな状態を保持するオブジェクトを返す。
- helloxsaver_draw : 1フレーム分の描画処理。
- helloxsaver_free : 処理に使っていたメモリ領域を全て解放。
- helloxsaver_reshape : ウィンドウサイズが変更されたときに呼び出される。
- helloxsaver_event : キーボードやマウスのイベントが発生したときに呼び出される。
helloxsaver.c の中で「deluxe」で検索して、変数名、関数名、及び、一番最後の行を、「deluxe_xxxx」から「helloxsaver_xxxx」に書き換えておく。
同様に、helloxsaver.man や helloxsaver.xml も修正。中に書かれている「deluxe」「Deluxe」を「helloxsaver」「Helloxsaver」に書き換えておく。
◎ makeする。 :
make を実行。
hacks/ディレクトリの中に、helloxsaver という、実行権限がついたファイルが生成されていたらビルドは成功。
make
hacks/ディレクトリの中に、helloxsaver という、実行権限がついたファイルが生成されていたらビルドは成功。
$ ls -al hacks/helloxsaver* -rwxrwxr-x 1 username username 328464 5月 28 23:37 hacks/helloxsaver -rw-rw-r-- 1 username username 14024 5月 28 23:35 hacks/helloxsaver.c -rw-rw-r-- 1 username username 1973 5月 28 23:35 hacks/helloxsaver.man -rw-rw-r-- 1 username username 64608 5月 28 23:37 hacks/helloxsaver.o
◎ インストールしてみる。 :
出来上がった実行バイナリ群をインストールしてみる。公式リポジトリ版がインストール済みの環境では、公式リポジトリ版が上書きされてしまうので注意。
自分のアカウント内に保存されている設定ファイルを削除。
xscreensaverの設定画面を出してみる。ここで、新しい ~/.xscreensaver がコピーされて作られる。
リストの中に「Helloxsaver」があれば上手く行ってる。選択して、「プレビュー」ボタンを押して動いてくれたら、更にOK。まあ、表示される画面は、「Deluxe」と同じなわけだけど…。
後は、helloxsaver.c を修正して、自分がやってみたい処理を書いてみて、以下を実行して動作確認していけばよい。
もっとも、その、「処理を書いていく」ところが、まだちょっと分からないわけだけど…。
sudo make install
自分のアカウント内に保存されている設定ファイルを削除。
rm ~/.xscreensaver
xscreensaverの設定画面を出してみる。ここで、新しい ~/.xscreensaver がコピーされて作られる。
xscreensaver-settings &
リストの中に「Helloxsaver」があれば上手く行ってる。選択して、「プレビュー」ボタンを押して動いてくれたら、更にOK。まあ、表示される画面は、「Deluxe」と同じなわけだけど…。
後は、helloxsaver.c を修正して、自分がやってみたい処理を書いてみて、以下を実行して動作確認していけばよい。
make sudo make install xscreensaver-settings &
もっとも、その、「処理を書いていく」ところが、まだちょっと分からないわけだけど…。
[ ツッコむ ]
以上です。