diff --git a/doc/help/commands.asciidoc b/doc/help/commands.asciidoc index 8d48490b5..c1fe9ef9e 100644 --- a/doc/help/commands.asciidoc +++ b/doc/help/commands.asciidoc @@ -145,6 +145,7 @@ Start hinting. - `tab`: Open the link in a new tab. - `tab-bg`: Open the link in a new background tab. - `window`: Open the link in a new window. + - `hover` : Hover over the link. - `yank`: Yank the link to the clipboard. - `yank-primary`: Yank the link to the primary selection. - `fill`: Fill the commandline with the command given as diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index c990b5b32..4e8415bf6 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -40,7 +40,7 @@ ElemTuple = collections.namedtuple('ElemTuple', ['elem', 'label']) Target = usertypes.enum('Target', ['normal', 'tab', 'tab_bg', 'window', 'yank', - 'yank_primary', 'fill', 'rapid', + 'yank_primary', 'fill', 'hover', 'rapid', 'rapid_win', 'download', 'userscript', 'spawn']) @@ -115,6 +115,7 @@ class HintManager(QObject): Target.yank: "Yank hint to clipboard...", Target.yank_primary: "Yank hint to primary selection...", Target.fill: "Set hint in commandline...", + Target.hover: "Hover over a hint", Target.rapid: "Follow hint (rapid mode)...", Target.rapid_win: "Follow hint in new window (rapid mode)...", Target.download: "Download hint...", @@ -354,6 +355,25 @@ class HintManager(QObject): for evt in events: self.mouse_event.emit(evt) + def _hover(self, elem): + """Hover over an element. + + Args: + elem: The QWebElement to hover. + """ + target = self._context.target + self.set_open_target.emit(target.name) + # FIXME Instead of clicking the center, we could have nicer heuristics. + # e.g. parse (-webkit-)border-radius correctly and click text fields at + # the bottom right, and everything else on the top left or so. + # https://github.com/The-Compiler/qutebrowser/issues/70 + pos = elem.rect_on_view().center() + log.hints.debug("Hovering on '{}' at {}/{}".format( + elem, pos.x(), pos.y())) + event = QMouseEvent( + QEvent.MouseMove, pos, Qt.NoButton, Qt.NoButton, Qt.NoModifier) + self.mouse_event.emit(event) + def _yank(self, url): """Yank an element to the clipboard or primary selection. @@ -685,6 +705,7 @@ class HintManager(QObject): Target.window: self._click, Target.rapid: self._click, Target.rapid_win: self._click, + Target.hover: self._hover, # _download needs a QWebElement to get the frame. Target.download: self._download, } diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index eba965ad1..dd0faea75 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -923,6 +923,7 @@ KEY_DATA = collections.OrderedDict([ ('hint all tab', ['F']), ('hint all window', ['wf']), ('hint all tab-bg', [';b']), + ('hint all hover', ['e']), ('hint images', [';i']), ('hint images tab', [';I']), ('hint images tab-bg', ['.i']), diff --git a/qutebrowser/utils/usertypes.py b/qutebrowser/utils/usertypes.py index c21b7febf..cdb2da0df 100644 --- a/qutebrowser/utils/usertypes.py +++ b/qutebrowser/utils/usertypes.py @@ -220,7 +220,8 @@ PromptMode = enum('PromptMode', ['yesno', 'text', 'user_pwd', 'alert']) # Where to open a clicked link. -ClickTarget = enum('ClickTarget', ['normal', 'tab', 'tab_bg', 'window']) +ClickTarget = enum('ClickTarget', ['normal', 'tab', 'tab_bg', 'window', + 'hover']) # Key input modes