mieki256's diary



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 上で動かしてる状態。

公式リポジトリ版のインストール。 :

作り始める前に、まずは、Ubuntu公式リポジトリ版の 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 xscreensaver
xscreensaver-command -exit を実行すると、プロセスが無くなってることが分かるかなと。

ソースからビルド。 :

ソースからビルドできるか試してみる。ソースは以下から入手できる。

_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つ。
  • 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 を修正する。

念のために、別名コピーしてバックアップを取っておく。
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」も表示されるようにできる。

オリジナルをバックアップしておく。
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言語ソース)は、以下が定義されている必要があるらしい。
  • 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 を実行。
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

インストールしてみる。 :

出来上がった実行バイナリ群をインストールしてみる。公式リポジトリ版がインストール済みの環境では、公式リポジトリ版が上書きされてしまうので注意。
sudo make install

自分のアカウント内に保存されている設定ファイルを削除。
rm ~/.xscreensaver

xscreensaverの設定画面を出してみる。ここで、新しい ~/.xscreensaver がコピーされて作られる。
xscreensaver-settings &

リストの中に「Helloxsaver」があれば上手く行ってる。選択して、「プレビュー」ボタンを押して動いてくれたら、更にOK。まあ、表示される画面は、「Deluxe」と同じなわけだけど…。

後は、helloxsaver.c を修正して、自分がやってみたい処理を書いてみて、以下を実行して動作確認していけばよい。
make
sudo make install
xscreensaver-settings &

もっとも、その、「処理を書いていく」ところが、まだちょっと分からないわけだけど…。

以上です。

過去ログ表示

Prev - 2022/05 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project