イベント処理を含めたCustomViewのコードはたったこれだけ。
class CustomView < NSView def awakeFromNib super @my_space=Spaces.new @max_spaces=get_max @tmp_space_no=0 end def get_max CFPreferencesAppSynchronize("com.apple.dock") row=CFPreferencesGetAppIntegerValue("workspaces-rows", "com.apple.dock", nil) col=CFPreferencesGetAppIntegerValue("workspaces-cols", "com.apple.dock", nil); row * col end def set_space_no number=Pointer.new('i') number[0]=@my_space.spaceNumber number[0] end def move(muki) @tmp_space_no=set_space_no if muki=="left" then @tmp_space_no -= 1 @tmp_space_no=@max_spaces if @tmp_space_no == 0 else @tmp_space_no += 1 @tmp_space_no=1 if @tmp_space_no == @max_spaces+1 end @my_space.postNotification(@tmp_space_no-1) end def scrollWheel(event) if event.deltaY > 0 then move("left") else move("right") end end def mouseDown(event) ws=NSWorkspace.sharedWorkspace ws.launchApplication("Finder") end endSpacesっていうObjCで書いている(というかコピーしただけだけど)クラスがあって、そちらでCoreGraphicsの非公開APIを使う処理をしている。ただしそっちも素人が理解できる範囲なのでたいしたことをやっているわけではない。
今のところ使っている非公開APIはSpaces.appが現在表示しているworkspaceの番号を取得するCGSGetWorkspaceだけ。workspaceの切替そのものはSwitchSpacesNotificationをNSDistributedNotificationCenterに投げて実現している。つまりSpaces.appを使っているわけ。そのため動作が非常に安定している。
これをCGSSetWorkspaceを使って自前の切替にすると・・・Spaces.appとの兼ね合いで若干不審な点がある。要調査ということで。
ただし、視覚効果が全くない状態で自前の切替にするとすこぶる速い。一瞬で替わる。これも魅力的。
現在、使っていて感じる問題点は、
1,マウスホイールがちょっとでも動くとworkspaceが切り替わるので、その辺の感度調整が必要
2,視覚効果なしで自前で切り替えると何番目のworkspaceか一瞬迷う
その辺をどうにかするのを兼ねて、環境設定(プリファレンス)作りに今後挑戦する予定。
Viewのコーディング(って言うほどのものでもないけど)がすぐ終わったので、あとはxcatsan師匠のblogを読んで環境設定パネル作りの研究をした。いやー、しかし宝の山だな、xcatsan師匠のblogは。
0 件のコメント:
コメントを投稿