# N900 focus button Media Player control # thp 2010-05-31 # # The last press must be held for about 1 second, # so for a three-press, you would do short-short-long. # # two-press: next # three-press: previous # four-press: toggle pause # import gtk import gobject import dbus import dbus.glib import hildon FOCUS_FILE = '/sys/devices/platform/camera_button/bus/devices/cam_focus/state' TIMEOUT = 1000 MAFW_OBJECT = 'com.nokia.mafw.renderer.Mafw-Gst-Renderer-Plugin.gstrenderer' MAFW_PATH = '/com/nokia/mafw/renderer/gstrenderer' MAFW_INTF = 'com.nokia.mafw.renderer' METHODS = [None, 'next', 'previous', 'pause'] class FocusMonitor(object): def __init__(self): self.fp = open(FOCUS_FILE, 'r') self.fp.read() self.source_id = gobject.io_add_watch(self.fp, \ gobject.IO_PRI, \ self.on_state_changed) self.timeout_id = None self.active = False self.event_count = 0 self.session_bus = dbus.SessionBus() self.widget = gtk.Label() def on_state_changed(self, source, cb_condition): self.fp.seek(0, 0) self.active = (self.fp.read().strip() == 'active') if self.active: self.event_count += 1 if self.timeout_id is not None: gobject.source_remove(self.timeout_id) self.timeout_id = gobject.timeout_add(TIMEOUT, self.on_timeout) return True def banner(self, message): hildon.hildon_banner_show_information(self.widget, '', message) def on_timeout(self): if not self.active: self.event_count = 0 self.timeout_id = None return False if self.event_count > 1 and self.event_count <= len(METHODS): o = self.session_bus.get_object(MAFW_OBJECT, MAFW_PATH) i = dbus.Interface(o, MAFW_INTF) method_name = METHODS[self.event_count-1] method = getattr(i, method_name) try: method() self.banner(method_name) except Exception, e: if method_name == 'pause': try: i.play() self.banner('play') except: pass self.event_count = 0 self.timeout_id = None return False FocusMonitor() gtk.main()