=== modified file 'terminatorlib/searchbar.py' --- terminatorlib/searchbar.py 2017-02-01 08:51:37 +0000 +++ terminatorlib/searchbar.py 2017-07-20 00:19:55 +0000 @@ -5,7 +5,7 @@ from gi.repository import Gtk, Gdk from gi.repository import GObject -import re +from gi.repository import GLib from translation import _ from config import Config @@ -19,7 +19,6 @@ } entry = None - reslabel = None next = None prev = None wrap = None @@ -52,10 +51,6 @@ label = Gtk.Label(label=_('Search:')) label.show() - # Result label - self.reslabel = Gtk.Label(label='') - self.reslabel.show() - # Close Button close = Gtk.Button() close.set_relief(Gtk.ReliefStyle.NONE) @@ -89,7 +84,6 @@ self.pack_start(label, False, True, 0) self.pack_start(self.entry, True, True, 0) - self.pack_start(self.reslabel, False, True, 0) self.pack_start(self.prev, False, False, 0) self.pack_start(self.next, False, False, 0) self.pack_start(self.wrap, False, False, 0) @@ -99,12 +93,18 @@ self.set_no_show_all(True) def wrap_toggled(self, toggled): - if self.searchrow is None: - self.prev.set_sensitive(False) - self.next.set_sensitive(False) - elif toggled: + self.vte.search_set_wrap_around(toggled.get_active()) + self.set_nextprev_active() + + def set_nextprev_active(self): + if not self.wrap.get_active(): + self.next.set_sensitive(self.vte.search_find_next()) + self.vte.search_find_previous() + self.prev.set_sensitive(self.vte.search_find_previous()) + self.vte.search_find_next() + else: + self.next.set_sensitive(True) self.prev.set_sensitive(True) - self.next.set_sensitive(True) def get_vte(self): """Find our parent widget""" @@ -137,93 +137,30 @@ return if searchtext != self.searchstring: - self.searchrow = self.get_vte_buffer_range()[0] - 1 self.searchstring = searchtext - self.searchre = re.compile(searchtext) + self.searchre = GLib.Regex(searchtext, 0, 0) + self.vte.search_set_gregex(self.searchre, 0) - self.reslabel.set_text(_("Searching scrollback")) self.next.set_sensitive(True) self.prev.set_sensitive(True) self.next_search(None) def next_search(self, widget): """Search forwards and jump to the next result, if any""" - startrow,endrow = self.get_vte_buffer_range() - found = startrow <= self.searchrow and self.searchrow < endrow - row = self.searchrow - while True: - row += 1 - if row >= endrow: - if found and self.wrap.get_active(): - row = startrow - 1 - else: - self.prev.set_sensitive(found) - self.next.set_sensitive(False) - self.reslabel.set_text(_('No more results')) - return - buffer = self.vte.get_text_range(row, 0, row + 1, 0, self.search_character) - - buffer = buffer[0] - buffer = buffer[:buffer.find('\n')] - matches = self.searchre.search(buffer) - if matches: - self.searchrow = row - self.prev.set_sensitive(True) - self.search_hit(self.searchrow) - return + self.vte.search_find_next() + self.set_nextprev_active() + return def prev_search(self, widget): """Jump back to the previous search""" - startrow,endrow = self.get_vte_buffer_range() - found = startrow <= self.searchrow and self.searchrow < endrow - row = self.searchrow - while True: - row -= 1 - if row <= startrow: - if found and self.wrap.get_active(): - row = endrow - else: - self.next.set_sensitive(found) - self.prev.set_sensitive(False) - self.reslabel.set_text(_('No more results')) - return - buffer = self.vte.get_text_range(row, 0, row + 1, 0, self.search_character) - - buffer = buffer[0] - buffer = buffer[:buffer.find('\n')] - matches = self.searchre.search(buffer) - if matches: - self.searchrow = row - self.next.set_sensitive(True) - self.search_hit(self.searchrow) - return - - def search_hit(self, row): - """Update the UI for a search hit""" - self.reslabel.set_text("%s %d" % (_('Found at row'), row)) - self.get_parent().scrollbar_jump(row) - self.next.show() - self.prev.show() - - def search_character(self, widget, col, row): - """We have to have a callback for each character""" - return(True) - - def get_vte_buffer_range(self): - """Get the range of a vte widget""" - column, endrow = self.vte.get_cursor_position() - if self.config['scrollback_infinite']: - startrow = 0 - else: - startrow = max(0, endrow - self.config['scrollback_lines']) - return(startrow, endrow) + self.vte.search_find_previous() + self.set_nextprev_active() + return def end_search(self, widget=None): """Trap and re-emit the end-search signal""" - self.searchrow = 0 self.searchstring = None self.searchre = None - self.reslabel.set_text('') self.emit('end-search') def get_search_term(self):