diff --git a/python/deskbar-handler/Makefile.am b/python/deskbar-handler/Makefile.am index 7bd5de9..e7c4c89 100644 --- a/python/deskbar-handler/Makefile.am +++ b/python/deskbar-handler/Makefile.am @@ -1,7 +1,7 @@ if USING_DESKBAR_HANDLER handlerdir = $(DESKBAR_HANDLER_DIR) -handler_DATA = tracker-handler.py +handler_DATA = tracker-handler.py tracker-handler-static.py endif if USING_DESKBAR_MODULE @@ -11,5 +11,6 @@ endif EXTRA_DIST = \ tracker-handler.py \ + tracker-handler-static.py \ tracker-module.py \ README diff --git a/python/deskbar-handler/tracker-handler-static.py b/python/deskbar-handler/tracker-handler-static.py new file mode 100644 index 0000000..a87956c --- /dev/null +++ b/python/deskbar-handler/tracker-handler-static.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# This handler was originaly created by Mikkel Kamstrup (c) 2006 and updated by Eugenio Cutolo (eulin) +# +# The static search Handler was splitted to a separate file by Marcus Fritzsch +# +# This program can be distributed under the terms of the GNU GPL version 2 or later. +# See the file COPYING. +# + +import sys +import os.path +import gnome +import gobject + +import gettext +gettext.install('tracker') + +import deskbar.Handler +import deskbar.Match + + + + +class TrackerSearchToolMatch (deskbar.Match.Match): + + def __init__(self, backend, **args): + deskbar.Match.Match.__init__(self, backend, **args) + self._icon = deskbar.Utils.load_icon ('tracker') + + def action(self, text=None): + gobject.spawn_async(['tracker-search-tool', self.name], flags=gobject.SPAWN_SEARCH_PATH) + + def get_verb(self): + return _('Search for %s with Tracker Search Tool') % ('%(name)s') + + def get_category (self): + return 'actions' + + def get_hash (self, text=None): + return 'tst-more-hits-action-'+self.name + + + + +class TrackerSearchToolHandler(deskbar.Handler.Handler): + + def __init__(self): + deskbar.Handler.Handler.__init__(self, 'tracker') + + def query(self, query): + return [TrackerSearchToolMatch(self, name=query)] + + @staticmethod + def requirements (): + if deskbar.Utils.is_program_in_path ('tracker-search-tool'): + return (deskbar.Handler.HANDLER_IS_HAPPY, None, None) + return (deskbar.Handler.HANDLER_IS_NOT_APPLICABLE, 'tracker-search-tool seems not to be installed properly.', None) + + + + +HANDLERS = { + 'TrackerSearchToolHandler': { + 'name': 'Search for files using Tracker Search Tool', + 'description': _('Search all of your documents with Tracker Search Tool'), + 'requirements': TrackerSearchToolHandler.requirements, # XXX makes deskbar 2.18.1 not load the handler!! + }, +} diff --git a/python/deskbar-handler/tracker-handler.py b/python/deskbar-handler/tracker-handler.py index 89f99b0..d12b200 100644 --- a/python/deskbar-handler/tracker-handler.py +++ b/python/deskbar-handler/tracker-handler.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- # This handler was originaly created by Mikkel Kamstrup (c) 2006 and updated by Eugenio Cutolo (eulin) # +# The handler was rewritten and splitted into live and static search by Marcus Fritzsch +# # This program can be distributed under the terms of the GNU GPL version 2 or later. # See the file COPYING. # @@ -32,7 +34,6 @@ TYPES = { 'Applications': { 'description': (_('Launch %s (%s)') % ('%(name)s', '%(app_name)s')), 'category': 'actions', - #'icon': 'stock_run', }, 'GaimConversations': { @@ -44,26 +45,28 @@ TYPES = { 'Emails': { 'description': (_('Email from %s') % '%(publisher)s' ) + '\n%(title)s', 'category': 'emails', - 'action': 'evolution %(uri)s', + 'action': { # more actions for different MUAs + 'key': 'mua', # see TrackerLiveSearchMatch.action for a demo + 'Evolution': 'evolution %(uri)s', + 'Thunderbird/Email': 'thunderbird -viewbeagle %(uri)s', + 'KMail': 'kmail --view %(uri)s', + }, 'icon': 'stock_mail', }, 'Music': { 'description': _('Listen to music %s\nin %s') % ('%(base)s', '%(dir)s'), 'category': 'music', - #'icon': 'audio', }, 'Documents': { 'description': _('See document %s\nin %s') % ('%(base)s', '%(dir)s'), 'category': 'documents', - #'icon': 'file', }, 'Development': { 'description': _('Open file %s\nin %s') % ('%(base)s', '%(dir)s'), 'category': 'develop', - #'icon': 'file', }, 'Images': { @@ -81,7 +84,6 @@ TYPES = { 'Files': { 'description': _('Open file %s\nin %s') % ('%(base)s', '%(dir)s'), 'category': 'files', - #'icon': 'file', }, 'Folders': { @@ -89,53 +91,11 @@ TYPES = { 'category': 'places', 'icon': 'stock_folder', }, - - 'Extra': { - 'description': _('Search for %s with Tracker Search Tool') % ('%(name)s'), - }, } -class TrackerSearchToolMatch (deskbar.Match.Match): - - def __init__(self, backend, **args): - deskbar.Match.Match.__init__(self, backend, **args) - self._icon = deskbar.Utils.load_icon ('tracker') - - def action(self, text=None): - gobject.spawn_async(['tracker-search-tool', self.name], flags=gobject.SPAWN_SEARCH_PATH) - - def get_verb(self): - return TYPES['Extra']['description'] % { 'name': self.name } - - def get_category (self): - return 'actions' - - def get_hash (self, text=None): - return 'tst-more-hits-action-'+self.name - - - - -class TrackerSearchToolHandler(deskbar.Handler.Handler): - - def __init__(self): - deskbar.Handler.Handler.__init__(self, 'tracker') - - def query(self, query): - return [TrackerSearchToolMatch(self, name=query)] - - @staticmethod - def requirements (): - if deskbar.Utils.is_program_in_path ('tracker-search-tool'): - return (deskbar.Handler.HANDLER_IS_HAPPY, None, None) - return (deskbar.Handler.HANDLER_IS_NOT_APPLICABLE, 'tracker-search-tool not found', None) - - - - class TrackerLiveSearchMatch (deskbar.Match.Match): def __init__(self, handler,result=None, **args): @@ -169,7 +129,15 @@ class TrackerLiveSearchMatch (deskbar.Match.Match): def action(self, text=None): if TYPES[self.result['type']].has_key('action'): - cmd = TYPES[self.result['type']]['action'] + if isinstance (TYPES[self.result['type']]['action'], dict): + try: + key = TYPES[self.result['type']]['action']['key'] + cmd = TYPES[self.result['type']]['action'][self.result[key]] + except: + print >> sys.stderr, "Unknown action for URI %s (Error: %s)" % (self.result['uri'], sys.exc_info()[1]) + return + else: + cmd = TYPES[self.result['type']]['action'] cmd = map(lambda arg : arg % self.result, cmd.split()) # we need this to handle spaces correctly print 'Opening Tracker hit with command:', cmd @@ -178,7 +146,7 @@ class TrackerLiveSearchMatch (deskbar.Match.Match): deskbar.Utils.spawn_async(cmd) except AttributeError: # deskbar <= 2.16 - gobject.spawn_async(args, flags=gobject.SPAWN_SEARCH_PATH) + gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH) else: if self.result.has_key ('desktop'): self.result['desktop'].launch([]) @@ -223,11 +191,13 @@ class TrackerLiveSearchHandler(deskbar.Handler.SignallingHandler): self.tracker = self.search_iface = self.keywords_iface = self.files_iface = None self.set_delay (500) self.conv_re = re.compile (r'^.*?/logs/([^/]+)/([^/]+)/([^/]+)/(.+?)\.(:?txt|html)$') # all, proto, account, to-whom, time - self.have_tst = deskbar.Utils.is_program_in_path ('tracker-search-tool') def handle_email_hits (self, info, output): output['title'] = cgi.escape(info[3]) output['publisher'] = cgi.escape(info[4]) + output['mua'] = info[2] + if output['mua'] == 'Thunderbird/Email': + output['uri'] = info[0] def handle_conversation_hits (self, info, output): m = self.conv_re.match (output['escaped_uri']) @@ -282,7 +252,7 @@ class TrackerLiveSearchHandler(deskbar.Handler.SignallingHandler): info = [str (i) for i in info] output['escaped_uri'] = cgi.escape (info[0]) - output['uri'] = urllib.quote (info[0]) + output['uri'] = urllib.quote (info[0], ';?:@&=+$,./') output['name'] = os.path.basename(output['escaped_uri']) output['type'] = info[1] @@ -325,14 +295,11 @@ class TrackerLiveSearchHandler(deskbar.Handler.SignallingHandler): except: print >> sys.stderr, '*** DBus connection to tracker failed, check your settings.' return - for service in [key for key in TYPES.iterkeys () if key != 'Extra']: + for service in TYPES.iterkeys (): self.search_iface.TextDetailed (-1, service, qstring, 0, max, \ reply_handler = lambda hits: self.receive_hits (qstring, hits, max), \ error_handler = self.recieve_error) print 'Tracker query:', qstring - if self.have_tst: - # explicitly add one hit to search with t-s-t - self.emit_query_ready (qstring, [TrackerSearchToolMatch (self, name=qstring)]) @staticmethod def requirements (): @@ -388,12 +355,6 @@ def time_from_purple_log (instr): HANDLERS = { - 'TrackerSearchToolHandler': { - 'name': 'Search for files using Tracker Search Tool', - 'description': _('Search all of your documents with Tracker Search Tool'), - #'requirements': TrackerSearchToolHandler.requirements, # XXX makes deskbar 2.18.1 not load the handler!! - }, - 'TrackerLiveSearchHandler': { 'name': 'Search for files using Tracker', 'description': _('Search all of your documents, as you type'), diff --git a/python/deskbar-handler/tracker-module.py b/python/deskbar-handler/tracker-module.py index 90a9ccb..14dfb86 100644 --- a/python/deskbar-handler/tracker-module.py +++ b/python/deskbar-handler/tracker-module.py @@ -1,3 +1,5 @@ +# This deskbar module was ported from deskbar <= 2.18 handler by Marcus Fritzsch + import gnome import gobject import re @@ -103,7 +105,12 @@ TYPES = { 'Emails': { 'description': (_('Email from %s') % '%(publisher)s' ) + '\n%(title)s', 'category': 'emails', - 'action' : 'evolution %(uri)s', + 'action': { # more actions for different MUAs + 'key': 'mua', # see TrackerLiveSearchAction.action for a demo + 'Evolution': 'evolution %(uri)s', + 'Thunderbird/Email': 'thunderbird -viewbeagle %(uri)s', + 'KMail': 'kmail --view %(uri)s', + }, }, 'Music': { @@ -210,7 +217,7 @@ class TrackerLiveSearchAction (deskbar.interfaces.Action): self.name = result['name'] self.desktop = desktop self.result = result - self.init_names (result['unquoted_uri']) + self.init_names (result['uri']) def get_name(self, text=None): return self.result @@ -229,7 +236,15 @@ class TrackerLiveSearchAction (deskbar.interfaces.Action): def activate (self, text=None): if TYPES[self.result['type']].has_key('action'): - cmd = TYPES[self.result['type']]['action'] + if isinstance (TYPES[self.result['type']]['action'], dict): + try: + key = TYPES[self.result['type']]['action']['key'] + cmd = TYPES[self.result['type']]['action'][self.result[key]] + except: + print >> sys.stderr, "Unknown action for URI %s (Error: %s)" % (self.result['uri'], sys.exc_info()[1]) + return + else: + cmd = TYPES[self.result['type']]['action'] cmd = map(lambda arg : arg % self.result, cmd.split()) # we need this to handle spaces correctly print 'Opening Tracker hit with command:', cmd @@ -238,8 +253,8 @@ class TrackerLiveSearchAction (deskbar.interfaces.Action): if self.desktop: self.desktop.launch ([]) else: - deskbar.core.Utils.url_show ('file://'+urllib.quote (self.result['uri'])) - print 'Opening Tracker hit:', urllib.quote (self.result['uri']) + deskbar.core.Utils.url_show ('file://'+urllib.quote (self.result['uri'], ';?:@&=+$,./')) + print 'Opening Tracker hit:', urllib.quote (self.result['uri'], ';?:@&=+$,./') def init_names (self, fullpath): dirname, filename = os.path.split(fullpath) @@ -309,11 +324,11 @@ class TrackerLiveSearchHandler(deskbar.interfaces.Module): # initing on search request, see self.query self.tracker = self.search_iface = self.keywords_iface = self.files_iface = None self.conv_re = re.compile (r'^.*?/logs/([^/]+)/([^/]+)/([^/]+)/(.+?)\.(:?txt|html)$') # all, proto, account, to-whom, time - self.have_tst = is_program_in_path ('tracker-search-tool') def handle_email_hits (self, info, output): output['title'] = info[3] output['publisher'] = info[4] + output['mua'] = info[2] def handle_conversation_hits (self, info, output): output ['uri'] = info [0] @@ -365,8 +380,8 @@ class TrackerLiveSearchHandler(deskbar.interfaces.Module): info = [str (i) for i in info] - output['unquoted_uri'] = output['uri'] = info[0] - output['name'] = os.path.basename(output['unquoted_uri']) + output['uri'] = info[0] + output['name'] = os.path.basename(output['uri']) output['type'] = info[1] if not TYPES.has_key(output['type']): @@ -417,8 +432,6 @@ class TrackerLiveSearchHandler(deskbar.interfaces.Module): reply_handler = lambda hits: self.recieve_hits(qstring, hits, max), error_handler = self.recieve_error) print 'Tracker query:', qstring - if self.have_tst: - self._emit_query_ready (qstring, [TrackerSearchToolMatch (name=qstring, priority=self.get_priority ())])