From a80c61e78a70014dda51a62b456015e2f391af78 Mon Sep 17 00:00:00 2001 From: Martin Tournoij Date: Fri, 18 Sep 2015 02:18:54 +0200 Subject: [PATCH 1/4] Use a single search term per-window Previously, every tab had its own search term. This sets single search term per window. using `/hello`, `gt`, and `n` will search for `hello` in the 2nd tab. This fixes issue #940 --- qutebrowser/browser/commands.py | 37 ++++++++++++++++++++++------ qutebrowser/mainwindow/mainwindow.py | 2 ++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 2ac5149f9..be8c0bc26 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1269,6 +1269,15 @@ class CommandDispatcher: except webelem.IsNullError: raise cmdexc.CommandError("Element vanished while editing!") + def _clear_search(self, text): + """Clear existing search string & highlights for the current view if + it's different from text.""" + view = self._current_widget() + if view.search_text is not None and view.search_text != text: + # We first clear the marked text, then the highlights + view.search('', 0) + view.search('', QWebPage.HighlightAllOccurrences) + @cmdutils.register(instance='command-dispatcher', scope='window', maxsplit=0) def search(self, text="", reverse=False): @@ -1279,11 +1288,7 @@ class CommandDispatcher: reverse: Reverse search direction. """ view = self._current_widget() - if view.search_text is not None and view.search_text != text: - # We first clear the marked text, then the highlights - view.search('', 0) - view.search('', QWebPage.HighlightAllOccurrences) - + self._clear_search(text) flags = 0 ignore_case = config.get('general', 'ignore-case') if ignore_case == 'smart': @@ -1301,6 +1306,10 @@ class CommandDispatcher: view.search(text, flags | QWebPage.HighlightAllOccurrences) view.search_text = text view.search_flags = flags + main_window = objreg.get('main-window', scope='window', + window=self._win_id) + main_window.search_text = text + main_window.search_flags = flags @cmdutils.register(instance='command-dispatcher', hide=True, scope='window', count='count') @@ -1311,7 +1320,14 @@ class CommandDispatcher: count: How many elements to ignore. """ view = self._current_widget() - if view.search_text is not None: + main_window = objreg.get('main-window', scope='window', + window=self._win_id) + + self._clear_search(main_window.search_text) + + if main_window.search_text is not None: + view.search_text = main_window.search_text + view.search_flags = main_window.search_flags for _ in range(count): view.search(view.search_text, view.search_flags) @@ -1324,8 +1340,13 @@ class CommandDispatcher: count: How many elements to ignore. """ view = self._current_widget() - if view.search_text is None: - return + main_window = objreg.get('main-window', scope='window', + window=self._win_id) + self._clear_search(main_window.search_text) + + if main_window.search_text is not None: + view.search_text = main_window.search_text + view.search_flags = main_window.search_flags # The int() here serves as a QFlags constructor to create a copy of the # QFlags instance rather as a reference. I don't know why it works this # way, but it does. diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py index 8b13f4e24..460207329 100644 --- a/qutebrowser/mainwindow/mainwindow.py +++ b/qutebrowser/mainwindow/mainwindow.py @@ -109,6 +109,8 @@ class MainWindow(QWidget): self._commandrunner = None self.win_id = next(win_id_gen) self.registry = objreg.ObjectRegistry() + self.search_text = None + self.search_flags = 0 objreg.window_registry[self.win_id] = self objreg.register('main-window', self, scope='window', window=self.win_id) From 72cddb290b7b2127aaf97ee0a77af13a13980621 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 18 Sep 2015 06:55:17 +0200 Subject: [PATCH 2/4] Cleanups --- qutebrowser/browser/commands.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index be8c0bc26..6e1edc328 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1269,10 +1269,12 @@ class CommandDispatcher: except webelem.IsNullError: raise cmdexc.CommandError("Element vanished while editing!") - def _clear_search(self, text): - """Clear existing search string & highlights for the current view if - it's different from text.""" - view = self._current_widget() + def _clear_search(self, view, text): + """Clear search string/highlights for the given view. + + This does nothing if the view's search text is the same as the given + text. + """ if view.search_text is not None and view.search_text != text: # We first clear the marked text, then the highlights view.search('', 0) @@ -1288,7 +1290,7 @@ class CommandDispatcher: reverse: Reverse search direction. """ view = self._current_widget() - self._clear_search(text) + self._clear_search(view, text) flags = 0 ignore_case = config.get('general', 'ignore-case') if ignore_case == 'smart': @@ -1321,9 +1323,9 @@ class CommandDispatcher: """ view = self._current_widget() main_window = objreg.get('main-window', scope='window', - window=self._win_id) + window=self._win_id) - self._clear_search(main_window.search_text) + self._clear_search(view, main_window.search_text) if main_window.search_text is not None: view.search_text = main_window.search_text @@ -1342,7 +1344,7 @@ class CommandDispatcher: view = self._current_widget() main_window = objreg.get('main-window', scope='window', window=self._win_id) - self._clear_search(main_window.search_text) + self._clear_search(view, main_window.search_text) if main_window.search_text is not None: view.search_text = main_window.search_text From f62bf099a0105f9792f9789a36880096204769be Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 18 Sep 2015 06:58:05 +0200 Subject: [PATCH 3/4] Also re-highlight text when restarting search. --- qutebrowser/browser/commands.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 6e1edc328..2176e31fc 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1330,6 +1330,8 @@ class CommandDispatcher: if main_window.search_text is not None: view.search_text = main_window.search_text view.search_flags = main_window.search_flags + view.search(view.search_text, + view.search_flags | QWebPage.HighlightAllOccurrences) for _ in range(count): view.search(view.search_text, view.search_flags) @@ -1349,6 +1351,8 @@ class CommandDispatcher: if main_window.search_text is not None: view.search_text = main_window.search_text view.search_flags = main_window.search_flags + view.search(view.search_text, + view.search_flags | QWebPage.HighlightAllOccurrences) # The int() here serves as a QFlags constructor to create a copy of the # QFlags instance rather as a reference. I don't know why it works this # way, but it does. From 841e8fbbd19858628c0e9633af5f0fe2bcb4ecf9 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 18 Sep 2015 07:01:51 +0200 Subject: [PATCH 4/4] Save search parameters in tabbed_browser. --- qutebrowser/browser/commands.py | 26 ++++++++++--------------- qutebrowser/mainwindow/mainwindow.py | 2 -- qutebrowser/mainwindow/tabbedbrowser.py | 4 ++++ 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 2176e31fc..58df2bfd8 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1308,10 +1308,8 @@ class CommandDispatcher: view.search(text, flags | QWebPage.HighlightAllOccurrences) view.search_text = text view.search_flags = flags - main_window = objreg.get('main-window', scope='window', - window=self._win_id) - main_window.search_text = text - main_window.search_flags = flags + self._tabbed_browser.search_text = text + self._tabbed_browser.search_flags = flags @cmdutils.register(instance='command-dispatcher', hide=True, scope='window', count='count') @@ -1322,14 +1320,12 @@ class CommandDispatcher: count: How many elements to ignore. """ view = self._current_widget() - main_window = objreg.get('main-window', scope='window', - window=self._win_id) - self._clear_search(view, main_window.search_text) + self._clear_search(view, self._tabbed_browser.search_text) - if main_window.search_text is not None: - view.search_text = main_window.search_text - view.search_flags = main_window.search_flags + if self._tabbed_browser.search_text is not None: + view.search_text = self._tabbed_browser.search_text + view.search_flags = self._tabbed_browser.search_flags view.search(view.search_text, view.search_flags | QWebPage.HighlightAllOccurrences) for _ in range(count): @@ -1344,13 +1340,11 @@ class CommandDispatcher: count: How many elements to ignore. """ view = self._current_widget() - main_window = objreg.get('main-window', scope='window', - window=self._win_id) - self._clear_search(view, main_window.search_text) + self._clear_search(view, self._tabbed_browser.search_text) - if main_window.search_text is not None: - view.search_text = main_window.search_text - view.search_flags = main_window.search_flags + if self._tabbed_browser.search_text is not None: + view.search_text = self._tabbed_browser.search_text + view.search_flags = self._tabbed_browser.search_flags view.search(view.search_text, view.search_flags | QWebPage.HighlightAllOccurrences) # The int() here serves as a QFlags constructor to create a copy of the diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py index 460207329..8b13f4e24 100644 --- a/qutebrowser/mainwindow/mainwindow.py +++ b/qutebrowser/mainwindow/mainwindow.py @@ -109,8 +109,6 @@ class MainWindow(QWidget): self._commandrunner = None self.win_id = next(win_id_gen) self.registry = objreg.ObjectRegistry() - self.search_text = None - self.search_flags = 0 objreg.window_registry[self.win_id] = self objreg.register('main-window', self, scope='window', window=self.win_id) diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 2f1bd1f5f..14817ac30 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -54,6 +54,8 @@ class TabbedBrowser(tabwidget.TabWidget): emitted if the signal occurred in the current tab. Attributes: + search_text/search_flags: Search parameters which are shared between + all tabs. _win_id: The window ID this tabbedbrowser is associated with. _filter: A SignalFilter instance. _now_focused: The tab which is focused now. @@ -108,6 +110,8 @@ class TabbedBrowser(tabwidget.TabWidget): self._undo_stack = [] self._filter = signalfilter.SignalFilter(win_id, self) self._now_focused = None + self.search_text = None + self.search_flags = 0 objreg.get('config').changed.connect(self.update_favicons) objreg.get('config').changed.connect(self.update_window_title) objreg.get('config').changed.connect(self.update_tab_titles)