2007年 03月 23日

RubyCocoa で AppleRemote リッスンして Safari のプレゼンツールうごかす

http://rubycocoa.com/appleremote/1 にあるとおりに framework をビルドして配置

require "osx/cocoa"
include OSX
OSX.require_framework "AppleRemote"
OSX.ns_import :AppleRemote

class AppleRemoteDelegate < NSObject

	addRubyMethod_withType('appleRemoteButton:pressedDown:', 'v@:ii')

	def appleRemoteButton_pressedDown(buttonIdentifier, pressedDown)
		puts "button #{buttonIdentifier}, pressed #{pressedDown}"
		return if pressedDown == 0
		case buttonIdentifier
		when 1 # down
			call_safari_js "$presentation.fold($presentation.page);$presentation.scrollTo($presentation.pages[$presentation.page]);"
		when 3, 4 # middle, right
			call_safari_js "$presentation.next();"
		when 5 # left
			call_safari_js "$presentation.prev();"
		end
	end
	
	def call_safari_js(script)
		errinfo = NSDictionary.alloc.init
		NSAppleScript.alloc.initWithSource(<<-EOS).executeAndReturnError(errinfo)
			tell application "Safari"
				do JavaScript "#{script.gsub(/¥n/, ";")}" in document 1
			end tell
		EOS
	end
end


a = AppleRemote.alloc.init
d = AppleRemoteDelegate.alloc.init
a.setDelegate d
a.startListening 0
trap (:INT) { exit }
NSApplication.sharedApplication.run

rbosa で JS 送ろうとおもったけど、in document の書きかたがわからなかったので NSAppleScript を読んでる。一応ストレスなしにうごくっぽい