« NSTreeController + NSPredicate なサンプル FilteringOutlineEdit | トップページ | Rabbit の Portfile を wiki に登録 »

2006.04.26

NSApplication を使うコードを簡単に #2

あー、こないだのだと NSApplication#terminate: でプロセスが終了しちゃうのか。ブロックの返り値を持たせてるところを検証しようとしたら、そこまで実行されないことに気づいた。stop: でも runloop が完全に止まるわけでもないしなあ。

うーん、どうするのがいいんだろ?

  • あきらめる(ブロックの実行後、必ず終了する)
  • すごいがんばる

前者かなあ。

名前空間に delegate のクラスがわざわざ作成されるのが気持ち悪いような気もするので、無名クラスを使うように変えてみた。

 require 'osx/cocoa'
 
 module OSX
 
   def NSApplication.run_with_temp_app(&proc)
     # create delegate of NSApplication
     delegate = Class.new(OSX::NSObject).alloc.init
     def delegate.applicationDidFinishLaunching(sender)
       begin
         @proc.call
       ensure
         OSX::NSApplication.sharedApplication.terminate(self)
       end
     end
     def delegate.proc=(block)
       @proc = block
     end
     delegate.proc = proc
     # run new app
     app = NSApplication.sharedApplication
     app.setDelegate(delegate)
     app.run
   end
 
 end
 

ホントは NSObject のインスタンスの特異メソッドにしたかったのだけど、RubyCocoa では、ruby で定義したメソッドが呼ばれるのは、ruby で定義したクラスだけなので。

|

« NSTreeController + NSPredicate なサンプル FilteringOutlineEdit | トップページ | Rabbit の Portfile を wiki に登録 »