RubyCocoaでスクリーンセーバを作る

MacOSのスクリーンセーバ

ScreenSaverViewクラスを 実装して.saverという拡張子を持つbundleを作る。

定期的に呼ばれる animateOneFrame メソッドを実装する。

このバンドルを/System/Library/Screen Saver/に置く。

RubyCocoaでの実装

まず以下のような WikipediaSaverLoader.m を作る。 RBBundleInit が RubyCocoaを初期化しRubyプログラムをロードする関数で、 Leopardの /Developer/Examples/RubyCocoa/RubyAnywhere/ などに使用例がある。

#import <Cocoa/Cocoa.h> #import <RubyCocoa/RBRuntime.h> #import <ScreenSaver/ScreenSaver.h> #import <WebKit/WebKit.h> @interface WikipediaSaverLoader : ScreenSaverView { id wikipediaSaver; } @end @implementation WikipediaSaverLoader - (id)initWithFrame:(NSRect)frameRect isPreview:(BOOL)preview { [super initWithFrame:frameRect isPreview:preview]; static int installed = 0; if (! installed) { if (RBBundleInit("WikipediaSaver.rb", [self class], nil)) NSLog(@"WikipediaSaverLoader.install: failed"); else { NSLog(@"WikipediaSaverLoader.install: success"); installed = 1; } Class rubyClass = NSClassFromString(@"WikipediaSaver"); NSAssert(nil != rubyClass, @"could not find Ruby class"); wikipediaSaver = [[rubyClass alloc] initWithFrame:frameRect isPreview:preview]; NSAssert(nil != wikipediaSaver, @"Ruby instance should not be nil"); [wikipediaSaver setSaver:self]; } return self; } - (NSTimeInterval) animationTimeInterval { return [wikipediaSaver animationTimeInterval]; } - (void)animateOneFrame { [wikipediaSaver animateOneFrame]; } @end

animateOneFrame

スクリーンセーバ本体の WikipediaSaver.rb は以下のようにRubyで記述することができる。 ここでは15秒おきにWikipediaのランダムページを表示するようにしている。

require 'osx/cocoa' include OSX require_framework 'ScreenSaver' require_framework 'Webkit' class WikipediaSaver < ScreenSaverView def initWithFrame_isPreview(frameRect,p) super_initWithFrame_isPreview(frameRect,p) end def animateOneFrame @webView.mainFrame.loadRequest(@request) end def animationTimeInterval 15 end def setSaver(saver) @saver = saver setup end def setup url = "http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:Random" @nsurl = NSURL.URLWithString(url) screenRect = NSScreen.mainScreen.frame @webView = WebView.alloc.initWithFrame(screenRect) @saver.addSubview(@webView) @request = NSURLRequest.requestWithURL(@nsurl) @webView.mainFrame.loadRequest(@request) end end

ダウンロード

2008/1/18 Toshiyuki Masui @ Pitecan.com