Work around segfault in hintmanager
This commit is contained in:
parent
b2888bf6ca
commit
0b3854bff1
@ -48,6 +48,7 @@ class HintManager(QObject):
|
|||||||
HINT_CSS: The CSS template to use for hints.
|
HINT_CSS: The CSS template to use for hints.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
_started: Whether we started hinting at the moment.
|
||||||
_frames: The QWebFrames to use.
|
_frames: The QWebFrames to use.
|
||||||
_elems: A mapping from keystrings to (elem, label) namedtuples.
|
_elems: A mapping from keystrings to (elem, label) namedtuples.
|
||||||
_baseurl: The URL of the current page.
|
_baseurl: The URL of the current page.
|
||||||
@ -99,7 +100,9 @@ class HintManager(QObject):
|
|||||||
self._target = None
|
self._target = None
|
||||||
self._baseurl = None
|
self._baseurl = None
|
||||||
self._to_follow = None
|
self._to_follow = None
|
||||||
|
self._started = False
|
||||||
self._frames = []
|
self._frames = []
|
||||||
|
self._connected_frames = []
|
||||||
modeman.instance().left.connect(self.on_mode_left)
|
modeman.instance().left.connect(self.on_mode_left)
|
||||||
|
|
||||||
def _hint_strings(self, elems):
|
def _hint_strings(self, elems):
|
||||||
@ -397,8 +400,20 @@ class HintManager(QObject):
|
|||||||
for e, string in zip(visible_elems, strings):
|
for e, string in zip(visible_elems, strings):
|
||||||
label = self._draw_label(e, string)
|
label = self._draw_label(e, string)
|
||||||
self._elems[string] = ElemTuple(e, label)
|
self._elems[string] = ElemTuple(e, label)
|
||||||
|
self._started = True
|
||||||
for f in self._frames:
|
for f in self._frames:
|
||||||
|
# For some reason we get segfaults sometimes when calling
|
||||||
|
# frame.contentsSizeChanged.disconnect() later, maybe because Qt
|
||||||
|
# already deleted the frame?
|
||||||
|
# We work around this by never disconnecting this signal, and here
|
||||||
|
# making sure we don't connect a frame which already was connected
|
||||||
|
# at some point earlier.
|
||||||
|
if f in self._connected_frames:
|
||||||
|
logging.debug("Frame {} already connected!".format(f))
|
||||||
|
else:
|
||||||
|
logging.debug("Connecting frame {}".format(f))
|
||||||
f.contentsSizeChanged.connect(self.on_contents_size_changed)
|
f.contentsSizeChanged.connect(self.on_contents_size_changed)
|
||||||
|
self._connected_frames.append(f)
|
||||||
self.hint_strings_updated.emit(strings)
|
self.hint_strings_updated.emit(strings)
|
||||||
modeman.enter('hint', 'HintManager.start')
|
modeman.enter('hint', 'HintManager.start')
|
||||||
|
|
||||||
@ -496,6 +511,12 @@ class HintManager(QObject):
|
|||||||
@pyqtSlot('QSize')
|
@pyqtSlot('QSize')
|
||||||
def on_contents_size_changed(self, _size):
|
def on_contents_size_changed(self, _size):
|
||||||
"""Reposition hints if contents size changed."""
|
"""Reposition hints if contents size changed."""
|
||||||
|
if not self._started:
|
||||||
|
# We got here because of some earlier hinting, but we can't simply
|
||||||
|
# disconnect frames as this leads to occasional segfaults :-/
|
||||||
|
logging.debug("Not hinting!")
|
||||||
|
return
|
||||||
|
logging.debug("Contents size changed...!")
|
||||||
for elems in self._elems.values():
|
for elems in self._elems.values():
|
||||||
css = self._get_hint_css(elems.elem, elems.label)
|
css = self._get_hint_css(elems.elem, elems.label)
|
||||||
elems.label.setAttribute('style', css)
|
elems.label.setAttribute('style', css)
|
||||||
@ -505,17 +526,10 @@ class HintManager(QObject):
|
|||||||
"""Stop hinting when hinting mode was left."""
|
"""Stop hinting when hinting mode was left."""
|
||||||
if mode != 'hint':
|
if mode != 'hint':
|
||||||
return
|
return
|
||||||
|
self._started = False
|
||||||
for elem in self._elems.values():
|
for elem in self._elems.values():
|
||||||
if not elem.label.isNull():
|
if not elem.label.isNull():
|
||||||
elem.label.removeFromDocument()
|
elem.label.removeFromDocument()
|
||||||
if self._frames is not None:
|
|
||||||
for frame in self._frames:
|
|
||||||
if frame is not None:
|
|
||||||
# The frame which was focused in start() might not be
|
|
||||||
# available anymore, since Qt might already have deleted it
|
|
||||||
# (e.g. when a new page is loaded).
|
|
||||||
frame.contentsSizeChanged.disconnect(
|
|
||||||
self.on_contents_size_changed)
|
|
||||||
self._elems = {}
|
self._elems = {}
|
||||||
self._to_follow = None
|
self._to_follow = None
|
||||||
self._target = None
|
self._target = None
|
||||||
|
Loading…
Reference in New Issue
Block a user