2022/05/31(火) [n年前の日記]
#1 [xscreensaver] xscreensaver用のスクリーンセーバを作りたい。その4
_昨日
に続いて、xscreensaver用のスクリーンセーバを自分で作れないか実験中。
_README.hacking
に新しいスクリーンセーバを作る際に意識することが書かれてあるので眺めながら作業。
環境は Ubuntu Linxu 20.04 LTS。Windows10 x64 21H2 + VMware Player 上で動かしてる。
円だの線だの四角だのを描画するだけではなくて、画像を描画するスクリーンセーバを作りたい。noseguy.(c|man|xml) と deluxe.(c|man|xml) を参考にして実験をした。
とりあえず、一応、画像描画できてるような感じにはなった。
環境は Ubuntu Linxu 20.04 LTS。Windows10 x64 21H2 + VMware Player 上で動かしてる。
円だの線だの四角だのを描画するだけではなくて、画像を描画するスクリーンセーバを作りたい。noseguy.(c|man|xml) と deluxe.(c|man|xml) を参考にして実験をした。
とりあえず、一応、画像描画できてるような感じにはなった。
◎ ソース。 :
ソースは以下。
_helloimgdraw.c
相変わらず長い。長いけど、「obj」で検索すれば、肝心の処理部分だけを追えるかなと。
.man と .xml は以下。
_helloimgdraw.man
_helloimgdraw.xml
一応簡単に解説。
「#include "ximage-loader.h"」と書いて、ximage-loader.h をインクルードすれば、画像バイナリを Pixmap や XImage に変換する関数が使えるようになる。
ソースの最初のあたりに、「#include "images/gen/ufoimage256c_png.h"」を記述しているけれど、これで、ufoimage256c.png のバイナリに、ufoimage256c_png という変数を通じてアクセスできるようになる。
ちなみに images/gen/*.h は、make をすると自動生成される。そのあたりのルール(?)は、 _2022/05/29の日記 にメモしてある。
画像バイナリから Pixmap への変換は、image_data_to_pixmap() で行うことができる。
_helloimgdraw.c
相変わらず長い。長いけど、「obj」で検索すれば、肝心の処理部分だけを追えるかなと。
.man と .xml は以下。
_helloimgdraw.man
_helloimgdraw.xml
- .c と .man は、hacks/ 以下に置く。
- .xml は、hacks/config/ 以下に置く。
一応簡単に解説。
「#include "ximage-loader.h"」と書いて、ximage-loader.h をインクルードすれば、画像バイナリを Pixmap や XImage に変換する関数が使えるようになる。
ソースの最初のあたりに、「#include "images/gen/ufoimage256c_png.h"」を記述しているけれど、これで、ufoimage256c.png のバイナリに、ufoimage256c_png という変数を通じてアクセスできるようになる。
ちなみに images/gen/*.h は、make をすると自動生成される。そのあたりのルール(?)は、 _2022/05/29の日記 にメモしてある。
画像バイナリから Pixmap への変換は、image_data_to_pixmap() で行うことができる。
◎ Makefile.in を修正。 :
hacks/Makefile.in を書き換えて、helloimgdraw.c もコンパイルできるようにする。
_Makefile.in.patch
_Makefile.in
「noseguy」で検索して、その周辺に helloimgdraw.* を追加していけばいい。具体的には…。
他に、以下の行を、noseguy 関係の記述行のすぐ下のあたりに追加。
注意点。noseguyの指定と比べて、一部、必要になるライブラリ(?)が違ってる。
noseguy はテキストメッセージを表示する処理が入っているので、$(TEXT) や $(TEXT_LIBS) が必要になるけれど、今回のソースはテキストメッセージを表示しないので、そのあたりの記述は無くていいはず。また、deluxe.c の中身をコピペしていたりもするので、deluxe.c が必要としていた $(COL) や $(DBE) や $(HACK_LIBS) も追加してみた。
_Makefile.in.patch
_Makefile.in
「noseguy」で検索して、その周辺に helloimgdraw.* を追加していけばいい。具体的には…。
- SRCS に helloimgdraw.c を追記。
- OBJS に helloimgdraw.o を追記。
- EXES に helloimgdraw を追記。
- MEN に helloimgdraw.man を追記。
他に、以下の行を、noseguy 関係の記述行のすぐ下のあたりに追加。
helloimgdraw: helloimgdraw.o $(HACK_OBJS) $(COL) $(PNG) $(DBE) $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(PNG) $(PNG_LIBS) $(DBE) $(HACK_LIBS)
helloimgdraw.o: ../config.h helloimgdraw.o: $(srcdir)/fps.h helloimgdraw.o: images/gen/ufoimage256c_png.h helloimgdraw.o: $(srcdir)/recanim.h helloimgdraw.o: $(srcdir)/screenhackI.h helloimgdraw.o: $(srcdir)/screenhack.h helloimgdraw.o: $(UTILS_SRC)/colors.h helloimgdraw.o: $(UTILS_SRC)/font-retry.h helloimgdraw.o: $(UTILS_SRC)/grabscreen.h helloimgdraw.o: $(UTILS_SRC)/hsv.h helloimgdraw.o: $(UTILS_SRC)/resources.h helloimgdraw.o: $(UTILS_SRC)/textclient.h helloimgdraw.o: $(UTILS_SRC)/usleep.h helloimgdraw.o: $(UTILS_SRC)/visual.h helloimgdraw.o: $(UTILS_SRC)/xdbe.h helloimgdraw.o: $(UTILS_SRC)/xft.h helloimgdraw.o: $(UTILS_SRC)/yarandom.h helloimgdraw.o: $(srcdir)/ximage-loader.h
注意点。noseguyの指定と比べて、一部、必要になるライブラリ(?)が違ってる。
noseguy: noseguy.o $(HACK_OBJS) $(PNG) $(TEXT) $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(PNG) $(TEXT) $(PNG_LIBS) $(TEXT_LIBS) helloimgdraw: helloimgdraw.o $(HACK_OBJS) $(COL) $(PNG) $(DBE) $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(PNG) $(PNG_LIBS) $(DBE) $(HACK_LIBS)
noseguy はテキストメッセージを表示する処理が入っているので、$(TEXT) や $(TEXT_LIBS) が必要になるけれど、今回のソースはテキストメッセージを表示しないので、そのあたりの記述は無くていいはず。また、deluxe.c の中身をコピペしていたりもするので、deluxe.c が必要としていた $(COL) や $(DBE) や $(HACK_LIBS) も追加してみた。
◎ XScreenSaver.ad.in を修正。 :
スクリーンセーバのリストに、Helloimgdraw も追加したい。driver/XScreenSaver.ad.in も修正する。
_XScreenSaver.ad.in.patch
_XScreenSaver.ad.in
「 deluxe -root \n\」と書かれた行のすぐ下にでも、「 helloimgdraw -root \n\」を追加しておけばいいのではないかと思う。
_XScreenSaver.ad.in.patch
_XScreenSaver.ad.in
「 deluxe -root \n\」と書かれた行のすぐ下にでも、「 helloimgdraw -root \n\」を追加しておけばいいのではないかと思う。
◎ make等を実行。 :
ここまでできたら、Makefile 等を自動生成し直し。
そして、make してビルド。エラーが出ずにビルドができたら、インストール。
xscreensaver の設定ファイルを削除してから、設定画面を表示して動作確認。
./configure --prefix=/usr --libexecdir=/usr/lib
そして、make してビルド。エラーが出ずにビルドができたら、インストール。
make sudo make install
xscreensaver の設定ファイルを削除してから、設定画面を表示して動作確認。
rm ~/.xscreensaver xscreensaver-settings &
◎ 問題点。 :
一見すると、画像が描画できてるように見えるし、透過部分もちゃんと透過になっているので、これで目的は果たせたぞ、と思ったのだけど。設定ダイアログを出して、オブジェクトの数を増やしてみたところ、画面がやたらとちらつくことに気づいてしまった。
どう見ても、どこかで何かがバグってる。
もしかすると、ダブルバッファ描画処理のあたりで頓珍漢なことをしている予感。仕組みも分からないまま deluxe.c からコピペしてきたけど、その際、妙なところを書き換えてしまったのかもしれない…。
仮想PC (VMware Player) 上で動かしてるからこうなるのだろうか、実機で動かしたら違う見た目になるのかなと、Core2Duo E8400(2コア2スレッド、3.0GHz) + Ubuntu Linux 20.04 LTS上でも動かしてみたけれど、そちらでも同様に画面がちらついた。やはりプログラムがバグってるな…。
どう見ても、どこかで何かがバグってる。
もしかすると、ダブルバッファ描画処理のあたりで頓珍漢なことをしている予感。仕組みも分からないまま deluxe.c からコピペしてきたけど、その際、妙なところを書き換えてしまったのかもしれない…。
仮想PC (VMware Player) 上で動かしてるからこうなるのだろうか、実機で動かしたら違う見た目になるのかなと、Core2Duo E8400(2コア2スレッド、3.0GHz) + Ubuntu Linux 20.04 LTS上でも動かしてみたけれど、そちらでも同様に画面がちらついた。やはりプログラムがバグってるな…。
◎ バグを修正できた。 :
ダブルバッファを使っているらしい、deluxe.c や anemone.c を眺めながらコピペを繰り返していたら、画面のちらつきは治った模様。やはりダブルバッファ関連がおかしかったらしい。
_helloimgdraw.c
_helloimgdraw.man
_helloimgdraw.xml
どこらへんがおかしかったのかはさっぱり分かってない…。まだバグがあるかも…。でもまあ、ダブルバッファで処理すればちらつかない状態が実現できるし、ちらついたらどこかでバグってる、ということだけは分かった。
_helloimgdraw.c
_helloimgdraw.man
_helloimgdraw.xml
どこらへんがおかしかったのかはさっぱり分かってない…。まだバグがあるかも…。でもまあ、ダブルバッファで処理すればちらつかない状態が実現できるし、ちらついたらどこかでバグってる、ということだけは分かった。
◎ xscreensaverのビルドに必要なパッケージについて。 :
OSインストール直後の状態に比較的近い Ubuntu Linxu 20.04 LTS上で、xscreensaver 6.03 をソースからビルドしようとして以下を打ってみたら、警告がたくさん出てきてしまった。
Gtk、Xt、XFreeType、OpenGL等々が見つからねえぞと言われてしまっている…。今ままでは色々なパッケージをインストールした環境で試してたから、こういう状況に遭遇しなかったのだな…。
解消できないものかと、関係がありそうな気配がするパッケージを片っ端からインストールしていったら、警告数は少なくなった。
ただ、どのパッケージが何と関係しているのか、そのあたりが分かってない。でもまあ、とりあえず、インストールしたパッケージを一応メモしておく。不要なパッケージもインストールしちゃってるはずだけど、気にしないことにする。
それでもまだ、以下の警告が出てるけど…。
ここまでメモしてから気が付いたけど、README の最初のあたりで、必要なパッケージについて書いてあった…。そっちを見てから試せば良かった。
もっとも、README には、Ubuntu (Debian) には存在していないパッケージ名ばかりが書かれているようで…。
README に従ったら、ほとんど全滅。
「Debian は古いバージョンの xscreensaver を配布しているから警告メッセージ出して嫌がらせしてやる!」とかやっておきながら、その Debian でビルドするための情報をまとめておかないあたり、なんだかちょっと引っ掛かるなあ…。
_Debian 8 jessie + xfce 4 で xscreensaver から light-locker に移行する方法 - 怠惰の形而上学
ちなみに、(Ubuntu|Debian) の場合、おそらく上記のパッケージ名の後ろに「-dev」とつければ、それっぽいパッケージが見つかりそうな気配はあるなと…。
ただ、これで本当にビルドできる状態になるのか分からない。別途、Ubuntu をインストールし直して、ほとんどの素の状態から試さないと分からんなと…。そりゃまあ、xscreensaver の作者様も、一々そんな検証作業をやってられないよな…。
Debian や Ubuntu の xscreensaver パッケージ説明に、ビルド時に必要になる依存パッケージが書かれてたりしないのだろうか。自分、そのあたりの取り決めが分かってないので、なんとも…。
_Debian -- bullseye の xscreensaver パッケージに関する詳細
_Ubuntu - focal の xscreensaver パッケージに関する詳細
ここで出現するパッケージ名の後ろに「-dev」をつけて探してみればいいのだろうか。
./configure --prefix=/usr --libexecdir=/usr/lib
Warning: The GTK libraries do not seem to be available; the `xscreensaver-settings' program requires them. Warning: The Xt library was not found. It is required. Warning: The XFreeType library was not found. It is required. 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. Note: The OpenGL 3D library was not found. Those demos which use 3D will not be built or installed. That is most of them. Warning: Your system seems to have PAM, but PAM is not being used. That is probably not going to work out well.
Gtk、Xt、XFreeType、OpenGL等々が見つからねえぞと言われてしまっている…。今ままでは色々なパッケージをインストールした環境で試してたから、こういう状況に遭遇しなかったのだな…。
解消できないものかと、関係がありそうな気配がするパッケージを片っ端からインストールしていったら、警告数は少なくなった。
ただ、どのパッケージが何と関係しているのか、そのあたりが分かってない。でもまあ、とりあえず、インストールしたパッケージを一応メモしておく。不要なパッケージもインストールしちゃってるはずだけど、気にしないことにする。
intltool libsdl2-dev libgimp2.0-dev libxml2-dev libgtkextra-dev libgtkmm-2.4-dev libgtkmm-3.0-dev python3-dev python3-setuptools libjpeg-dev zlib1g-dev libfreetype6-dev python-pygame python3-pygame libgles2-mesa-dev mesa-utils libgdk-pixbuf2.0-dev
それでもまだ、以下の警告が出てるけど…。
################################################################# 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/
ここまでメモしてから気が付いたけど、README の最初のあたりで、必要なパッケージについて書いてあった…。そっちを見てから試せば良かった。
=============================================================================== To compile for a Unix system with X11: =============================================================================== ./configure --help ./configure --prefix=/usr make sudo make install make clean xscreensaver & xscreensaver-settings There are many compilation dependencies. The configure script will tell you what is missing. At the least, you will need development versions of these libraries: perl pkg-config gettext intltool libx11 libxext libxi libxt libxft libxinerama libxrandr libxxf86vm libgl libglu libgle libgtk2 gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 libxml2 libpam dbus libsystemd elogind BSD systems might need gmake instead of make.
もっとも、README には、Ubuntu (Debian) には存在していないパッケージ名ばかりが書かれているようで…。
E: パッケージ libx11 が見つかりません E: パッケージ libxext が見つかりません E: パッケージ libxi が見つかりません E: パッケージ libxt が見つかりません E: パッケージ libxft が見つかりません E: パッケージ libxinerama が見つかりません E: パッケージ libxrandr が見つかりません E: パッケージ libxxf86vm が見つかりません E: パッケージ libgl が見つかりません E: パッケージ libglu が見つかりません E: パッケージ libgle が見つかりません E: パッケージ libgtk2 が見つかりません E: パッケージ gdk-pixbuf-2.0 が見つかりません E: パッケージ gdk-pixbuf-xlib-2.0 が見つかりません E: パッケージ libpam が見つかりません E: パッケージ libsystemd が見つかりません E: パッケージ 'elogind' にはインストール候補がありません パッケージ elogind は使用できませんが、別のパッケージから参照されます。これは、パッケージが欠落しているか、廃止されたか、または別のソースからのみ利用可能であることを意味します。
README に従ったら、ほとんど全滅。
「Debian は古いバージョンの xscreensaver を配布しているから警告メッセージ出して嫌がらせしてやる!」とかやっておきながら、その Debian でビルドするための情報をまとめておかないあたり、なんだかちょっと引っ掛かるなあ…。
_Debian 8 jessie + xfce 4 で xscreensaver から light-locker に移行する方法 - 怠惰の形而上学
ちなみに、(Ubuntu|Debian) の場合、おそらく上記のパッケージ名の後ろに「-dev」とつければ、それっぽいパッケージが見つかりそうな気配はあるなと…。
sudo apt install libx11-dev libxext-dev libxi-dev libxt-dev libxft-dev libxinerama-dev sudo apt install libxrandr-dev libxxf86vm-dev libgl-dev libglu-dev libgle-dev libgtk2.0-dev sudo apt install libgdk-pixbuf2.0-dev sudo apt install libpam-dev
ただ、これで本当にビルドできる状態になるのか分からない。別途、Ubuntu をインストールし直して、ほとんどの素の状態から試さないと分からんなと…。そりゃまあ、xscreensaver の作者様も、一々そんな検証作業をやってられないよな…。
Debian や Ubuntu の xscreensaver パッケージ説明に、ビルド時に必要になる依存パッケージが書かれてたりしないのだろうか。自分、そのあたりの取り決めが分かってないので、なんとも…。
_Debian -- bullseye の xscreensaver パッケージに関する詳細
_Ubuntu - focal の xscreensaver パッケージに関する詳細
ここで出現するパッケージ名の後ろに「-dev」をつけて探してみればいいのだろうか。
◎ 2022/06/01追記。 :
VMware Player上で Ubuntu Linux 20.04 LTS を新規にインストールして、xscreensaver 6.04 のビルドに必要になるパッケージを確認してみた。
ちなみに、公式サイトからソース群をDLしようとしたら、6.03 が 6.04 に更新されてた。
_jwz: XScreenSaver 6.04 out now
さておき。Ubuntu Linux 20.04 LTS の場合、xscreensaver 6.04 のビルドに必要になりそうなパッケージは以下の模様。これで全部の警告が消えるわけではないけれど、ある程度は消えてくれた。
ソース群を入手。
以下を打って、Makefile を自動生成。ビルド。インストール。設定画面を表示して動作確認。
ちなみに、公式サイトからソース群をDLしようとしたら、6.03 が 6.04 に更新されてた。
_jwz: XScreenSaver 6.04 out now
さておき。Ubuntu Linux 20.04 LTS の場合、xscreensaver 6.04 のビルドに必要になりそうなパッケージは以下の模様。これで全部の警告が消えるわけではないけれど、ある程度は消えてくれた。
sudo apt install build-essential make git wget intltool sudo apt install libx11-dev libxext-dev libxi-dev libxt-dev libxft-dev libxinerama-dev sudo apt install libxrandr-dev libxxf86vm-dev libgl-dev libglu-dev libgle-dev sudo apt install libgtk2.0-dev libgdk-pixbuf2.0-dev libpam-dev libxml2-dev libjpeg-dev
ソース群を入手。
wget https://www.jwz.org/xscreensaver/xscreensaver-6.04.tar.gz tar zxvf xscreensaver-6.04.tar.gz cd xscreensaver-6.04
以下を打って、Makefile を自動生成。ビルド。インストール。設定画面を表示して動作確認。
./configure --prefix=/usr --libexecdir=/usr/lib make sudo make install xscreensaver-settings &
[ ツッコむ ]
以上です。