summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <git@the-compiler.org>2015-02-26 20:41:04 +0100
committerFlorian Bruhin <git@the-compiler.org>2015-03-18 23:13:43 +0100
commitd929590cffcb90bc5b8f943aa7df48fbea6e2bee (patch)
tree15cfbd84bc59a79a4536a884825542bb6d4859a3
parent8291090b43b82115afbb42ce819c0e316ce0650b (diff)
downloadqutebrowser-d929590cffcb90bc5b8f943aa7df48fbea6e2bee.tar.gz
qutebrowser-d929590cffcb90bc5b8f943aa7df48fbea6e2bee.zip
Refactor how click/hint open targets are handled.
-rw-r--r--qutebrowser/browser/hints.py13
-rw-r--r--qutebrowser/browser/webpage.py35
-rw-r--r--qutebrowser/browser/webview.py38
3 files changed, 48 insertions, 38 deletions
diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py
index 8279c90c3..831eb9953 100644
--- a/qutebrowser/browser/hints.py
+++ b/qutebrowser/browser/hints.py
@@ -24,7 +24,8 @@ import functools
import subprocess
import collections
-from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QEvent, Qt, QUrl
+from PyQt5.QtCore import (pyqtSignal, pyqtSlot, QObject, QEvent, Qt, QUrl,
+ QTimer)
from PyQt5.QtGui import QMouseEvent, QClipboard
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebKit import QWebElement
@@ -108,7 +109,9 @@ class HintManager(QObject):
Signals:
mouse_event: Mouse event to be posted in the web view.
arg: A QMouseEvent
- set_open_target: Set a new target to open the links in.
+ start_hinting: Emitted when hinting starts, before a link is clicked.
+ arg: The hinting target name.
+ stop_hinting: Emitted after a link was clicked.
"""
HINT_TEXTS = {
@@ -129,7 +132,8 @@ class HintManager(QObject):
}
mouse_event = pyqtSignal('QMouseEvent')
- set_open_target = pyqtSignal(str)
+ start_hinting = pyqtSignal(str)
+ stop_hinting = pyqtSignal()
def __init__(self, win_id, tab_id, parent=None):
"""Constructor."""
@@ -373,6 +377,7 @@ class HintManager(QObject):
action = "Hovering" if target == Target.hover else "Clicking"
log.hints.debug("{} on '{}' at {}/{}".format(
action, elem, pos.x(), pos.y()))
+ self.start_hinting.emit(target.name)
if target in (Target.tab, Target.tab_bg, Target.window):
modifiers = Qt.ControlModifier
else:
@@ -382,7 +387,6 @@ class HintManager(QObject):
Qt.NoModifier),
]
if target != Target.hover:
- self.set_open_target.emit(target.name)
events += [
QMouseEvent(QEvent.MouseButtonPress, pos, Qt.LeftButton,
Qt.LeftButton, modifiers),
@@ -391,6 +395,7 @@ class HintManager(QObject):
]
for evt in events:
self.mouse_event.emit(evt)
+ QTimer.singleShot(0, self.stop_hinting.emit)
def _yank(self, url, context):
"""Yank an element to the clipboard or primary selection.
diff --git a/qutebrowser/browser/webpage.py b/qutebrowser/browser/webpage.py
index 8e6be0d11..4f944f481 100644
--- a/qutebrowser/browser/webpage.py
+++ b/qutebrowser/browser/webpage.py
@@ -41,6 +41,9 @@ class BrowserPage(QWebPage):
Attributes:
error_occured: Whether an error occured while loading.
+ open_target: Where to open the next navigation request.
+ ("normal", "tab", "tab_bg")
+ _hint_target: Override for open_target while hinting, or None.
_extension_handlers: Mapping of QWebPage extensions to their handlers.
_networkmnager: The NetworkManager used.
_win_id: The window ID this BrowserPage is associated with.
@@ -63,6 +66,8 @@ class BrowserPage(QWebPage):
}
self._ignore_load_started = False
self.error_occured = False
+ self.open_target = usertypes.ClickTarget.normal
+ self._hint_target = None
self._networkmanager = networkmanager.NetworkManager(
win_id, tab_id, self)
self.setNetworkAccessManager(self._networkmanager)
@@ -280,6 +285,24 @@ class BrowserPage(QWebPage):
else:
self.error_occured = False
+ @pyqtSlot(str)
+ def on_start_hinting(self, hint_target):
+ """Emitted before a hinting-click takes place.
+
+ Args:
+ hint_target: A string to set self._hint_target to.
+ """
+ t = getattr(usertypes.ClickTarget, hint_target)
+ log.webview.debug("Setting force target to {}/{}".format(
+ hint_target, t))
+ self._hint_target = t
+
+ @pyqtSlot()
+ def on_stop_hinting(self):
+ """Emitted when hinting is finished."""
+ log.webview.debug("Finishing hinting.")
+ self._hint_target = None
+
def userAgentForUrl(self, url):
"""Override QWebPage::userAgentForUrl to customize the user agent."""
ua = config.get('network', 'user-agent')
@@ -383,15 +406,17 @@ class BrowserPage(QWebPage):
return False
tabbed_browser = objreg.get('tabbed-browser', scope='window',
window=self._win_id)
- open_target = self.view().open_target
- self.view().open_target = usertypes.ClickTarget.normal
- if open_target == usertypes.ClickTarget.tab:
+ if self._hint_target is not None:
+ target = self._hint_target
+ else:
+ target = self.open_target
+ if target == usertypes.ClickTarget.tab:
tabbed_browser.tabopen(url, False)
return False
- elif open_target == usertypes.ClickTarget.tab_bg:
+ elif target == usertypes.ClickTarget.tab_bg:
tabbed_browser.tabopen(url, True)
return False
- elif open_target == usertypes.ClickTarget.window:
+ elif target == usertypes.ClickTarget.window:
main_window = objreg.get('main-window', scope='window',
window=self._win_id)
win_id = main_window.spawn()
diff --git a/qutebrowser/browser/webview.py b/qutebrowser/browser/webview.py
index c1229718c..8674c369c 100644
--- a/qutebrowser/browser/webview.py
+++ b/qutebrowser/browser/webview.py
@@ -55,7 +55,6 @@ class WebView(QWebView):
statusbar_message: The current javscript statusbar message.
inspector: The QWebInspector used for this webview.
load_status: loading status of this page (index into LoadStatus)
- open_target: Where to open the next tab ("normal", "tab", "tab_bg")
viewing_source: Whether the webview is currently displaying source
code.
registry: The ObjectRegistry associated with this tab.
@@ -64,7 +63,6 @@ class WebView(QWebView):
_has_ssl_errors: Whether SSL errors occured during loading.
_zoom: A NeighborList with the zoom levels.
_old_scroll_pos: The old scroll position.
- _force_open_target: Override for open_target.
_check_insertmode: If True, in mouseReleaseEvent we should check if we
need to enter/leave insert mode.
_default_zoom_changed: Whether the zoom was changed from the default.
@@ -99,8 +97,6 @@ class WebView(QWebView):
self.scroll_pos = (-1, -1)
self.statusbar_message = ''
self._old_scroll_pos = (-1, -1)
- self.open_target = usertypes.ClickTarget.normal
- self._force_open_target = None
self._zoom = None
self._has_ssl_errors = False
self.init_neighborlist()
@@ -124,7 +120,8 @@ class WebView(QWebView):
self.setPage(page)
hintmanager = hints.HintManager(win_id, self.tab_id, self)
hintmanager.mouse_event.connect(self.on_mouse_event)
- hintmanager.set_open_target.connect(self.set_force_open_target)
+ hintmanager.start_hinting.connect(page.on_start_hinting)
+ hintmanager.stop_hinting.connect(page.on_stop_hinting)
objreg.register('hintmanager', hintmanager, registry=self.registry)
mode_manager = objreg.get('mode-manager', scope='window',
window=win_id)
@@ -280,24 +277,18 @@ class WebView(QWebView):
Args:
e: The QMouseEvent.
"""
- if self._force_open_target is not None:
- self.open_target = self._force_open_target
- self._force_open_target = None
- log.mouse.debug("Setting force target: {}".format(
- self.open_target))
- elif (e.button() == Qt.MidButton or
- e.modifiers() & Qt.ControlModifier):
+ if e.button() == Qt.MidButton or e.modifiers() & Qt.ControlModifier:
background_tabs = config.get('tabs', 'background-tabs')
if e.modifiers() & Qt.ShiftModifier:
background_tabs = not background_tabs
if background_tabs:
- self.open_target = usertypes.ClickTarget.tab_bg
+ target = usertypes.ClickTarget.tab_bg
else:
- self.open_target = usertypes.ClickTarget.tab
- log.mouse.debug("Middle click, setting target: {}".format(
- self.open_target))
+ target = usertypes.ClickTarget.tab
+ self.page().open_target = target
+ log.mouse.debug("Middle click, setting target: {}".format(target))
else:
- self.open_target = usertypes.ClickTarget.normal
+ self.page().open_target = usertypes.ClickTarget.normal
log.mouse.debug("Normal click, setting normal target")
def shutdown(self):
@@ -435,17 +426,6 @@ class WebView(QWebView):
"left.".format(mode))
self.setFocusPolicy(Qt.WheelFocus)
- @pyqtSlot(str)
- def set_force_open_target(self, target):
- """Change the forced link target. Setter for _force_open_target.
-
- Args:
- target: A string to set self._force_open_target to.
- """
- t = getattr(usertypes.ClickTarget, target)
- log.webview.debug("Setting force target to {}/{}".format(target, t))
- self._force_open_target = t
-
def createWindow(self, wintype):
"""Called by Qt when a page wants to create a new window.
@@ -504,7 +484,7 @@ class WebView(QWebView):
This does the following things:
- Check if a link was clicked with the middle button or Ctrl and
- set the open_target attribute accordingly.
+ set the page's open_target attribute accordingly.
- Emit the editable_elem_selected signal if an editable element was
clicked.