きりかノート 3冊め

おあそびプログラミング

NSApplication を使うコードを簡単に

Cocoa では AppKit の多くの機能が、NSApplication に依存している。こういった処理を、RubyCocoa でのスクリプト(アプリケーションでなく)で動作させるのがめんどい。とくにテストコードを書くときに、こういう状況がけっこうある。

サンプルの HelloWorld.rb にあるように、

  1. delegate 用のオブジェクトを用意
  2. NSApplication.sharedApplication で アプリケーションを生成
  3. 2. のアプリケーションの delegate として 1. をセット
  4. アプリケーション を run で実行
  5. (処理が終わったら)アプリケーションを terminate: で終了

とするのがセオリー。これを簡単に扱う方法を、RubyCocoa 側で用意しておくといいかなと思って書いてみた。

 require 'osx/cocoa'

module OSX

class TempDelegate < OSX::NSObject
attr_accessor :proc
attr_reader :result

def initialize
@result = nil
end

def applicationDidFinishLaunching(notification)
begin
@result = @proc.call
ensure
OSX::NSApplication.sharedApplication.terminate(self)
end
end
end

def NSApplication.run_with_new_runloop(&proc)
delegate = TempDelegate.alloc.init
delegate.proc = proc
app = NSApplication.sharedApplication
app.setDelegate(delegate)
app.run
return delegate.result
end

end

使いかたはこんな感じ。

 OSX::NSApplication.run_with_new_runloop {
# your code
# :
}

ブロック付きメソッドてば便利。メソッドの名前をもうちょっと検討したら、devel で本体に取り込めるか提案してみよう。こういった細かいところも整備していきたいよな。