Avoid crash when selecting long text

In some (not yet understood) situations, the paragraph metrics cache
is empty in generateSyntheticMouseEvent(). We just avoid a crash in
this case, but there is probably an underlying problem that deserves
being fixed.

Fixes bug #10324.

(cherry picked from commit 4efb129ccb)
This commit is contained in:
Jean-Marc Lasgouttes 2017-06-19 12:23:17 +02:00
parent 9c0dd478df
commit 4fbb0f1770
3 changed files with 11 additions and 1 deletions

View File

@ -94,6 +94,8 @@ public:
bool redoParagraph(pit_type const pit);
/// Clear cache of paragraph metrics
void clear() { par_metrics_.clear(); }
/// Is cache of paragraph metrics empty ?
bool empty() const { return par_metrics_.empty(); }
///
int ascent() const { return dim_.asc; }

View File

@ -1009,12 +1009,18 @@ void GuiWorkArea::generateSyntheticMouseEvent()
// In which paragraph do we have to set the cursor ?
Cursor & cur = d->buffer_view_->cursor();
// FIXME: we don't know howto handle math.
// FIXME: we don't know how to handle math.
Text * text = cur.text();
if (!text)
return;
TextMetrics const & tm = d->buffer_view_->textMetrics(text);
// Quit gracefully if there are no metrics, since otherwise next
// line would crash (bug #10324).
// This situation seems related to a (not yet understood) timing problem.
if (tm.empty())
return;
pair<pit_type, const ParagraphMetrics *> pp = up ? tm.first() : tm.last();
ParagraphMetrics const & pm = *pp.second;
pit_type const pit = pp.first;

View File

@ -91,6 +91,8 @@ What's new
- Fix random crash when dissolving inset (bug 10667).
- Avoid crash when selecting long text (bug 10324).
- Avoid a case of stuck cursor after entering an inset (bug 10630).