mieki256's diary



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) を参考にして実験をした。

とりあえず、一応、画像描画できてるような感じにはなった。

ソース。 :

ソースは以下。

_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.* を追加していけばいい。具体的には…。
  1. SRCS に helloimgdraw.c を追記。
  2. OBJS に helloimgdraw.o を追記。
  3. EXES に helloimgdraw を追記。
  4. 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\」を追加しておけばいいのではないかと思う。

make等を実行。 :

ここまでできたら、Makefile 等を自動生成し直し。
./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 や anemone.c を眺めながらコピペを繰り返していたら、画面のちらつきは治った模様。やはりダブルバッファ関連がおかしかったらしい。




_helloimgdraw.c
_helloimgdraw.man
_helloimgdraw.xml

どこらへんがおかしかったのかはさっぱり分かってない…。まだバグがあるかも…。でもまあ、ダブルバッファで処理すればちらつかない状態が実現できるし、ちらついたらどこかでバグってる、ということだけは分かった。

xscreensaverのビルドに必要なパッケージについて。 :

OSインストール直後の状態に比較的近い Ubuntu Linxu 20.04 LTS上で、xscreensaver 6.03 をソースからビルドしようとして以下を打ってみたら、警告がたくさん出てきてしまった。

./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 のビルドに必要になりそうなパッケージは以下の模様。これで全部の警告が消えるわけではないけれど、ある程度は消えてくれた。

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 &

以上です。

過去ログ表示

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