ScreenSaver.framework の API


HOME > TIPS > How to make a ScreenSaver > ScreenSaver.framework の API

スクリーンセイバーをつくろう

ScreenSaver.framework の API

ここでは、ScreenSaver.framework の API を調べてみよう。ただし、ドキュメントが公開されているわけではないので(たぶん)、すべて想像と憶測と希望(!)がないまぜになっているものだ。そこんとこよろしく。

ScreenSaver.framework では 3 つのヘッダファイルが提供されている。

・ScreenSaver.h

・ScreenSaverView.h

・ScreenSaverDefault.h

最初の ScreenSaver.h は、下の 2 つをまとめて import するためだけのヘッダだ。ScreenSaverView は、NSView を継承したクラスで、スクリーンセイバーの、挙動の中心となるクラスだ。ScreenSaverDefault は、NSUserDefault を継承していて、ユーザの初期設定を保存するために使うクラスだな。

※2006/5/23 付けでリファレンスが公開されたみたいだ。
Screen Saver Framework Reference



ScreenSaverView.h

ScreenSaverView は NSView を継承したクラスだ。その目的は、実際にスクリーンセイバーを描画する View を提供することだ。ScreenSaverView.h では、2 つのクラスメソッドと、12 のメソッド、あと 4 つのユーティリティ関数が提供されている。



backingStoreType

ScreenSaver/ScreenSaverView.h

+ (NSBackingStoreType)backingStoreType;

スクリーンセイバーを動かす際の NSBackingStoreType を取得する。調べるのはいいけど、どんな場面で使用するんだ?


performGammaFade

ScreenSaver/ScreenSaverView.h

+ (BOOL)performGammaFade;

想像だけど、セイバーの開始、終了時にフェードイン、アウトするかどうかを調べるメソッドだと思う。逆に、それを設定できるメソッドってないんだよね。


initWithFrame

ScreenSaver/ScreenSaverView.h

- (id)initWithFrame:(NSRect)frame;
- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview;

初期化メソッドだ。モジュールで、初期化したい内容があるときは、これをオーバーライドするんだ。2 種類あって、前者の方は、普通の NSView の初期化と一緒。後者の方は、プレビュー用の初期化か、ほんちゃん用の初期化かが分かるようになってるんだ。プレビューのときに、違うことをやりたいときは、後者を使おう。


animationTimeInterval, setAnimationTimeInterval

ScreenSaver/ScreenSaverView.h

- (NSTimeInterval)animationTimeInterval;
- (void)setAnimationTimeInterval:(NSTimeInterval)timeInterval;

アニメーションの時間間隔を設定する。NSTimeInterval は double 型で、単位は秒だ。animationTimetInterval をオーバーライドして好きな値を返すことで設定できるんだ。


startAnimation, stopAnimation, isAnimating

ScreenSaver/ScreenSaverView.h

- (void)startAnimation;
- (void)stopAnimation;
- (BOOL)isAnimating;

最初の 2 つは、おもにユーザがオーバーライドして使うメソッドだ。startAnimation をオーバーライドすると、アニメーションが始まる前に呼び出される。stopAnimation はアニメーションがストップするときに呼び出されるわけだ。

isAnimating は現在アニメーション中かどうかを返してくれる。


drawRect, animateOneFrame

ScreenSaver/ScreenSaverView.h

- (void)drawRect:(NSRect)rect;
- (void)animateOneFrame;

これは描画系のメソッドだね。drawRect: は、おなじみの、NSView の実際の描画を行うメソッド。アニメーションを実装するには animateOneFrame をオーバーライドする。このメソッドは一定間隔でくり返し呼び出されるんだ。さらに、フォーカスの当たった状態になっている。


hasConfigureSheet, configureSheet

ScreenSaver/ScreenSaverView.h

- (BOOL)hasConfigureSheet;
- (NSWindow*)configureSheet;

設定シート関連のメソッドっす。hasConfigureSheet はユーザがオーバーライドして使うんだ。YES を返すようにすると、設定シートが使えるようになる。スクリーンセイバーパネルの“設定”ボタンが active になるんだ。デフォルトでは NO を返す。

設定ボタンを押すと、configureSheet が呼ばれて、NSWindow を要求される。ユーザはこれをオーバーライドして、適当なシートを作って返すようにしなきゃいけないんだ。普通は .nib をロードして返すわけね。


isPreview

ScreenSaver/ScreenSaverView.h

- (BOOL)isPreview;

これは、プレビュー中かどうか?を調べるメソッド。たとえば Randomizer モジュールとかは、プレビューとほんちゃんで、描画する内容が違うわけだ。プレビューのときは、Randomzier って表示するだけだからね。そんなとき、これが使える。


SSRandomIntBetween, SSRandomFloatBetween

ScreenSaver/ScreenSaverView.h

static __inline__ int SSRandomIntBetween(int a, int b)
{
  int range = b - a < 0 ? b - a - 1 : b - a + 1;
  int value = range * ((float)random() / (float) LONG_MAX);
  return value == range ? a : a + value;
}

static __inline__ float SSRandomFloatBetween(float a, float b)
{
  return a + (b - a) * ((float)random() / (float) LONG_MAX);
}

ある範囲の乱数を発生させるユーティリティ関数。int 型を発生させる SSRandomIntBetween() と float を発生させる SSRandomFloatBetween() がある。たいしたことはやってないけど、せっかくあるんだから、便利に使わせてもらいましょう。


SSRandomPointForSizeWithinRect

ScreenSaver/ScreenSaverView.h

static __inline__ NSPoint SSRandomPointForSizeWithinRect(
    NSSize size, NSRect rect)
{
  return NSMakePoint(
    floor(SSRandomFloatBetween(
      rect.origin.x, rect.origin.x + rect.size.width - size.width)),
    floor(SSRandomFloatBetween(
      rect.origin.y, rect.origin.y + rect.size.height - size.height)));
}

ある NSRect があったとしようじゃないか。その中に、それより小さい NSRect をランダムに配置したいとしよう。ただし、はみ出ないですっぽり収まるようにね。そなんとき使えるのがこの関数だ。小さい NSRect のサイズと、大きい方の NSRect を渡してやれば、小さい NSRect の配置先が NSPoint の形で出てくる。


SSCenteredRectInRect

ScreenSaver/ScreenSaverView.h

static __inline__ NSRect SSCenteredRectInRect(
    NSRect innerRect, NSRect outerRect)
{
  innerRect.origin.x =
    floor((outerRect.size.width - innerRect.size.width) / 2);
  innerRect.origin.y =
    floor((outerRect.size.height - innerRect.size.height) / 2);
  return innerRect;
}

ある NSRect を、ある NSRect のまん中に配置するための関数だ。そんだけ。


ScreenSaverDefaults.h

ScreenSaverDefaults は NSUserDefaults を継承したクラスだ。これを使えば、セイバーモジュールの固有の情報を保存しておけるわけだ。このクラスでは、クラスメソッドが 1 個提供されてる。


defaultsForModuleWithName

ScreenSaver/ScreenSaverDefaults.h

+ (id)defaultsForModuleWithName:(NSString*)moduleName;

モジュールの名前を指定して、NSUserDefault を取得するためのメソッドだ。これを使って NSUserDefault を取って、情報を保存するのに使えばいい。