2004/09/28
スクリーンやウインドウの画像を撮りたいのだけどどうしたらよいの?
との質問を受けました。
Plan 9 はこのような問題をとても面白い方法で、そう、Plan 9 らしい方法で処理しています。それを紹介しましょう。
page
から紹介します。page
は実際には PS ファイルや PDF なども読み取りかなり守備範囲が広い。マニュアルには general purpose document viewer と書かれている。(詳しくはマニュアルを参照してください。)
page
には多くのオプションがあるが、普通はオプションなしの
page ファイル ...の形で使用する。ファイルは複数指定できる。
/dev/screenに置かれています。
page /dev/screenを実行しているとその事が確認できます。
/dev/windowであるが
page /dev/windowを実行しても何も見えないはずです。(なぜでしょう?)
cp /dev/window /tmp/a page /tmp/aを実行してみれば、ヒントがつかめます。(今度は
/tmp/a
に page
を実行する直前のウインドウの様子が画像ファイルとして記録されているのが確認されます。)
我々がウインドウの内容を画像ファイルとして記録したい場合には、たいていの場合、そのウインドウの中でコマンドを投入するわけには行きません。従って他のウインドウから目的のウインドウの内容をコピーすることになります。
/dev/wsysの下にはスクリーン上の全てのウインドウ情報が置かれています。
cat /dev/winidで確認できます。数字が表示されますが、ウインドウごとに異なる数字を表示するのが確認されるでしょう。
ls /dev/wsysを実行すると全てのウインドウの ID が表示されます。
N
を ID とします。ls /dev/wsys/Nを実行すると ID が
N
のウインドウに関する情報を収めたいろいろなファイルがあることが分かります。これらはもちろん仮想ファイルです。term% ls /dev/wsys/1 --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/cons ---w------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/consctl --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/cursor ---w------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/kbdin --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/label --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/mouse --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/screen --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/snarf --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/text --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/wctl --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/wdir --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/window --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/winid --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/winname d-r-x------ M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/wsys/dev/wsys/1/windowが ID が 1 のウインドウの画像です。実際他のウインドウから
page /dev/wsys/1/windowを実行してみるとそのことが確認されます。
/tmp/1.png
とすれば)topng /dev/wsys/1/window > /tmp/1.pngを実行します。
topng
で生成した PNG ファイルを page
が読み取れない事があります。page
は内部で png
を使用しており、png
に問題があると思えます。その場合でも topng
によって生成されたファイルは Mac OSX では正しく読み取れています。
PNG ファイルへの変換の他に GIF ファイルへ変換する事もできます。マニュアル jpg(1) を参照してください。残念ながら JPEG ファイルへの変換ツールは無いようです。
rio
はどういうわけか、その情報をユーザに提供しません。(もちろん rio
の内部ではその情報を持っているはずです。) その事が例えば acme
を複数個開いたときに plumping が全ての acme
で発生するなどの問題の原因になっています。rio
の現在の仕様ではウインドウを特定するのに/dev/wsys/*/labelが役に立つでしょう。この内容を読めば、そこで実行中のプログラムの名前が分かります。例えば
acme
のウインドウはgrep acme /dev/wsys/*/labelで分かります。
grep page /dev/wsys/*/labelでウインドウ ID を調べ (例えば 3 とします)
sleep 10; topng /dev/wsys/3/window >/tmp/a.pngで得られたものです。