2011年1月22日土曜日

MacRuby・Spacesその5・Notification

本日はNotificationの勉強をする。
詳解 Objective-C 2.0 改訂版
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 3701

この本でおおまかに勉強。さらにWeb上のあちこちをさまよい、Postするだけなら簡単そう、ということがわかって最終的にはいつもの

MacRuby: The Definitive Guide

でMacRubyでのお作法を確かめる。この本によると、
center = NSNotificationCenter.defaultCenter
notification_handler = NotificationHandler.new

center.addObserver( notification_handler,
                    selector: "tea_time:",
                    name: 'tea_time_reminder',
                    object: nil )

center.postNotificationName("tea_time_reminder", object:self)

って感じでいいらしい。そこで、Spaces.appにworkspaceが切り替えられたことを通知するのに、

def post_notification(space_no)
  
  center = NSNotificationCenter.defaultCenter
  center.postNotificationName("com.apple.switchSpaces",object:space_no.to_s)
  
 end
と書いてみたが、これが全然働いていない。なぜだろー。"com.apple.switchSpaces"って文字列、NSStringのポインタが必要みたいなんだけど、あれこれやってみたかぎりどうもうまくいかない。

試しにCoreGraphics関連のメソッドを書いているObjCのclassで、
NSString *SwitchSpacesNotification = @"com.apple.switchSpaces";
- (void)postNotification:(NSInteger)object{
 [[NSDistributedNotificationCenter defaultCenter] postNotificationName:SwitchSpacesNotification object:[NSString stringWithFormat:@"%d", object]];
}

と書いたらこれはちゃんと働く。なんか悔しい。
ObjCのclassのメソッドを呼び出せ、無事workspaceの切替を通知できているみたいなのでいちおうこれでよし、とするけど、どうやればMacRubyからSpace関連の通知ができるのか、もう少し研究だなー。

addObserverのほうも本当はやっておきたい(Spaces.appの設定が変わったら通知を受ける、という風に)けれど、Spaces.app関連はすべてプライベート関数を使わねばならず、そうするとMacRuby側で直接呼び出せないようなのであきらめる。
MacRubyのControllerの中で
CGSRegisterConnectionNotifyProc(_CGSDefaultConnection(), spacesSwitchCallback, CGSWorkspaceChangedEvent, (void *)self);
とかって書くのは無理、と。

以上、偉そうにかいているけれど知識のほとんどはWarpのソースから得たものです。

0 件のコメント:

コメントを投稿