2011年1月25日火曜日

MacRuby・Snatcher(^^;)

というわけで仮称Snatcher、初期段階の一区切り。デスクトップでマウスホイールをころころするとSpaces.appのworkspaceを切り替えられるようになった。快適。

イベント処理を含めた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 件のコメント:

コメントを投稿