import gnome import deskbar from deskbar.Handler import SignallingHandler from deskbar.Match import Match import gobject from gettext import gettext as _ from os.path import expanduser HOME = expanduser ("~/") def _check_requirements (): try: import dbus try : if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): import dbus.glib except: return (deskbar.Handler.HANDLER_IS_NOT_APPLICABLE, "Python dbus.glib bindings not found.", None) return (deskbar.Handler.HANDLER_IS_HAPPY, None, None) except: return (deskbar.Handler.HANDLER_IS_NOT_APPLICABLE, "Python dbus bindings not found.", None) HANDLERS = { "TrackerFileSearchHandler" : { "name": "Search for files using Tracker", "description": _("Search all of your documents (using Tracker), as you type"), "requirements" : _check_requirements, } } class TrackerFileMatch (Match): def __init__(self, handler, **args): Match.__init__ (self, handler, **args) try: self._icon = deskbar.Utils.load_icon_for_file(self.name) except Exception: pass self.tracker_id = self.name self.name = self.calc_display_string () def get_verb(self): return "%(name)s" def action(self, text=None): print "Opening Tracker hit:", self.name gnome.url_show ("file://" + self.tracker_id) #args = ["gnome-open", str(self.name)] # FIXME for some odd reason we need the str() cast #gobject.spawn_async(args, flags=gobject.SPAWN_SEARCH_PATH) def get_category (self): return "files" def calc_display_string (self): dirname = self.name filename = "" # Don't include the /home/myuser part of the path if dirname.startswith (HOME): dirname = dirname [len(HOME):] filename = dirname last_dir_idx = filename.rfind("/") if last_dir_idx == -1: # There are no "/"s left in the path string, # this must be a file directly in the home folder return "" + filename +"\nin home folder" filename = filename[last_dir_idx+1:] dirname = dirname[:last_dir_idx] return "%s\nin folder %s" % (filename,dirname) class TrackerFileSearchHandler(SignallingHandler): def __init__(self): SignallingHandler.__init__(self, "stock_file") import dbus # We have to do this or it won't work if getattr(dbus, 'version', (0,0,0)) >= (0,41,0): import dbus.glib # Set up dbus conenction to trackerd self.bus = dbus.SessionBus() self.proxy_obj = self.bus.get_object('org.freedesktop.Tracker', '/org/freedesktop/tracker') self.tracker_iface = dbus.Interface(self.proxy_obj, 'org.freedesktop.Tracker') self.set_delay (500) def query (self, qstring, max): self.tracker_iface.SearchMetadataText ("Files", qstring, 100, False, reply_handler=lambda hits : self.__recieve_hits(qstring, hits, max), error_handler=self.__recieve_error) print "Tracker query:", qstring def __recieve_hits (self, qstring, hits, max): matches = [] for filename in hits: matches.append( TrackerFileMatch(self, name=filename) ) #if len (matches) > max: # break self.emit_query_ready(qstring, matches) print "Tracker response for %s, - %s hits returned, %s shown" % (qstring, len(hits), len(matches)) def __recieve_error (self, error): print "*** Tracker dbus error:", error