tmytのらくがき

個人の日記レベルです

fireflies

なんだかGIGAZINEできれいなスクリーンセーバーが紹介されてたので使ってみた。

OpenGLを使ったキレイな無料のスクリーンセーバーで、色とりどりの光が飛び回るような雰囲気を再現しています。Windows版だけでなく、LinuxMac OS X版もあります。

http://gigazine.net/index.php?/news/comments/20071005_fireflies/

うん、きれいだ。でもなんでこれデュアルディスプレイのときプライマリにしか描画されねえんだっっ!!


そのときこう思った。
「そうだよ。ソース公開されてんだから自分で変更すればいいんだよ。」


思ったことは即実行。ということでソースをダウンロード。
とりあえずgrepしてソース眺める。
メインらしきところでもGetClientRectしてるだけだったのでちょいとぐぐる。


なんだかlibscrnsaveなるものがあるらしくそいつが必要に応じてユーザが実装した事実上のメインを呼んでくれる仕様らしい。
ではそいつにバグがっっ


そう思ってsf.netへ行ってMingWのwin32api用ライブラリのソースをゲット。
とりあえずconfigureしてmakefileに手を加えて-mno-cygwinするようにしてmake。
何となく通ったのでlibscrnsaveのソースを眺める。
とりあえずCreateWindowで検索してヒットした付近をみてると

rc.right = GetSystemMetrics(SM_CXSCREEN);
rc.bottom = GetSystemMetrics(SM_CYSCREEN);

って個所を見つけた。
まぁ大体想像はついているけども

SM_CXSCREEN,SM_CYSCREEN
プライマリモニタの画面全体の幅と高さを取得します。
これらは、GetDeviceCaps(hdcPrimaryMonitor, HORZRES/VERTRES) を呼び出して取得するのと同じ値です。

http://msdn.microsoft.com/library/ja/jpsysinf/html/_win32_getsystemmetrics.asp?frame=true

ということでちゃんと全体を取得できるやつに変更。

SM_CXVIRTUALSCREEN,SM_CYVIRTUALSCREEN
Windows 98Windows 2000:仮想画面の幅と高さをピクセル単位で取得します。
仮想画面とは、すべてのモニタを囲む境界長方形のことです。
SM_XVIRTUALSCREEN および SM_YVIRTUALSCREEN の各値は、仮想画面の左上隅の座標を表します。

http://msdn.microsoft.com/library/ja/jpsysinf/html/_win32_getsystemmetrics.asp?frame=true


出来上がったやつを再コンパイルして、libscrnsave2.a あたりでlibディレクトリに入れといて、
fileflies.scr 本体を再コンパイル。
ライブラリ名変えたけどなんとも怒られずにちゃんとmake通った。


デュアルディスプレイな環境があるのはデスクトップPCだけなので、
とりあえずもってって実行してみると、あらびっくりちゃんとデュアルディスプレイに対応されてる。
まぁびっくりもなにもこれで対応できなかったらどうせいっちゅうねん。って感じだけども。


成果物はほしい人がいればそのうち撒きます。