詳解 Objective-C 2.0 改訂版
posted with amazlet at 11.01.22
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 3701
ソフトバンククリエイティブ
売り上げランキング: 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 件のコメント:
コメントを投稿