イベント処理を含めた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
end
Spacesっていう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 件のコメント:
コメントを投稿