2006年 11月 04日

Ruby/Cocoa でステータスアイテムを追加してみる

メニューバーの右のほうのアイコンとかのことをステータスアイテムというらしい。Windows でいうところのタスクトレイ?

require 'osx/cocoa'

include OSX

class Test < NSObject

	def applicationDidFinishLaunching(aNotification)
		menu = NSMenu.alloc.initWithTitle "TEST"
		menu.setDelegate self
		menu.setAutoenablesItems false

		item = menu.addItemWithTitle "TEST", :action, "menuclicked_", :keyEquivalent, ""
		item.setEnabled true

		# new image and resize
		img = NSWorkspace.sharedWorkspace.iconForFileType "unknown"
		size = NSSize.new
		size.width = 16
		size.height = 16
		img.setSize size

		# create status item
		bar = NSStatusBar.systemStatusBar
		item = bar.statusItemWithLength -1
		item.setTitle "Test"
		item.setToolTip "TESTEST"
		item.setImage img
		item.setHighlightMode true
		item.setMenu menu
	end

	def menuclicked(sender)
		p sender
		true
	end
end


app = NSApplication.sharedApplication
app.setDelegate(Test.alloc.init)
p app

trap('SIGINT') { exit }
app.run

ちょーかんたん!!

Ruby/Cocoa menu

growlremote で飛んで来たやつに URL があったらメニューに追加していくのを作ろうと思ったんだけど、どうも DRb と app.run を組み合わせると BUS Error で落ちる。
delegate 版の growlremote も不定期に落ちるのでどうしよもないなぁ(Growl.rb に依存しているほう使ってる)。うーん

openmenu


http://lab.lowreal.net/trac/browser/c/mac/openmenu.rb
仕方ないのでプロセス分離した。なのでこれは単にあるディレクトリ以下のファイルを見てメニューを作り、クリックするとそのファイルを開くというだけのもの。
ただし古いファイルは表示せず、無言でファイルを削除する。こわいね!

でもって

./growlserver.rb -c ~/openmenu

で growlremote を起動しておくと webloc を作りまくるのでいい感じ


ポイントは、setMenu で直接メニューを表示させないで、アイテムのクリックを拾ってから popUpStatusItemMenu でメニューを表示させるところかしら。こうするとメニューを表示するまえに処理を挟めるので動的にメニューを表示させられる。AirMac のメニューみたいな。