41
46
class Daemon (object):
47
""" Manpages Daemon searches manpages for results matching query
42
49
def __init__(self):
43
50
""" Sets up the manpages scope
45
self.scope = Unity.Scope.new ("/net/launchpad/scope/help/manpages")
52
self.scope = Unity.Scope.new("/net/launchpad/scope/help/manpages")
47
54
# Listen for changes and requests
48
55
self.scope.props.search_in_global = False
49
self.scope.connect ("search-changed", self.on_search_changed)
50
self.scope.connect ("filters-changed", self.on_filters_changed)
51
self.scope.connect ("notify::active", self.on_lens_active)
56
self.scope.connect("search-changed", self.on_search_changed)
57
self.scope.connect("filters-changed", self.on_filters_changed)
58
self.scope.connect("notify::active", self.on_lens_active)
54
61
def on_filters_changed(self, *_):
55
62
""" Called when a filter is clicked. Queue's a new search
62
69
if self.scope.props.active:
63
70
self.scope.queue_search_changed(Unity.SearchType.DEFAULT)
65
def on_search_changed (self, scope, search=None, search_type=0, cancellable=None):
66
""" Called when the search is changed. Gets the search string and search
72
def on_search_changed(self, scope, search=None, search_type=0, cancellable=None):
73
""" Called when the search is changed. Gets the search string and search
67
74
type and passes it to update_results_model()
69
76
scope: a scope object
82
89
results = scope.props.global_results_model
84
91
print "Search changed to: '%s'" % search_string
85
self.update_results_model (search_string, results)
92
self.update_results_model(search_string, results)
86
93
if hasattr(search, "finished"):
102
109
scope_active = False
103
110
e = self.scope.get_filter("sources")
104
111
if not e.props.filtering:
106
113
for source in e.options:
107
if source.props.id == "manpages":
108
if source.props.active:
114
if source.props.id == "manpages":
115
if source.props.active:
113
icon_hint = Gio.ThemedIcon.new("text-x-generic").to_string()
115
if len(search) > 2: # don't run apropos for strings shorter than 3 chars
116
apropos = subprocess.Popen(["apropos", search], stdout=subprocess.PIPE)
117
os.waitpid(apropos.pid, 0)
118
out = apropos.communicate()[0]
119
for line in out.split("\n"):
120
regex_apropos = re.compile('^(.+?)\s+\((\d+)\)\s+-\s(.+?)$')
121
m = regex_apropos.match(line)
123
result.append((m.group(1), m.group(2), m.group(3)))
125
uri = 'man:' + res[0] + '(' + res[1] + ')'
126
icon_theme = Gtk.IconTheme()
127
icon_info = icon_theme.lookup_icon(res[0], 128, 0)
129
icon_hint = Gio.ThemedIcon.new(res[0]).to_string()
130
model.append(uri, icon_hint, TECHNICAL, 'x-scheme-handler/man', res[0], res[2], uri)
120
icon_hint = Gio.ThemedIcon.new("text-x-generic").to_string()
122
if len(search) > 2: # don't run apropos for strings shorter than 3 chars
123
apropos = subprocess.Popen(["apropos", search], stdout=subprocess.PIPE)
124
os.waitpid(apropos.pid, 0)
125
out = apropos.communicate()[0]
126
for line in out.split("\n"):
127
regex_apropos = re.compile('^(.+?)\s+\((\d+)\)\s+-\s(.+?)$')
128
m = regex_apropos.match(line)
130
result.append((m.group(1), m.group(2), m.group(3)))
132
uri = 'man:' + res[0] + '(' + res[1] + ')'
133
icon_theme = Gtk.IconTheme()
134
icon_info = icon_theme.lookup_icon(res[0], 128, 0)
136
icon_hint = Gio.ThemedIcon.new(res[0]).to_string()
137
model.append(uri, icon_hint, TECHNICAL, 'x-scheme-handler/man', res[0], res[2], uri)
132
139
if __name__ == "__main__":
133
140
session_bus_connection = Gio.bus_get_sync(Gio.BusType.SESSION, None)