mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-25 22:06:15 +00:00
Fix assertion in caret display code
It is not a good idea to call caretPosAndHeight when the caret is in a paragraph that is not in cached metrics. This can happen when not using "cursor follows scrollbar". This commit refactor things a bit so that testing is done in BufferView. This bug is not in 2.3.x.
This commit is contained in:
parent
321923444a
commit
e6b54ea4d2
@ -3044,11 +3044,16 @@ void BufferView::caretPosAndHeight(Point & p, int & h) const
|
||||
}
|
||||
|
||||
|
||||
bool BufferView::cursorInView(Point const & p, int h) const
|
||||
bool BufferView::caretInView() const
|
||||
{
|
||||
Cursor const & cur = cursor();
|
||||
if (!paragraphVisible(cursor()))
|
||||
return false;
|
||||
Point p;
|
||||
int h;
|
||||
caretPosAndHeight(p, h);
|
||||
|
||||
// does the cursor touch the screen ?
|
||||
if (p.y_ + h < 0 || p.y_ >= workHeight() || !paragraphVisible(cur))
|
||||
if (p.y_ + h < 0 || p.y_ >= workHeight())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
@ -307,8 +307,8 @@ public:
|
||||
Point getPos(DocIterator const & dit) const;
|
||||
/// is the paragraph of the cursor visible ?
|
||||
bool paragraphVisible(DocIterator const & dit) const;
|
||||
/// is the cursor currently visible in the view
|
||||
bool cursorInView(Point const & p, int h) const;
|
||||
/// is the caret currently visible in the view
|
||||
bool caretInView() const;
|
||||
/// get the position and height of the caret
|
||||
void caretPosAndHeight(Point & p, int & h) const;
|
||||
|
||||
|
@ -439,11 +439,8 @@ void GuiWorkArea::startBlinkingCaret()
|
||||
if (view().busy())
|
||||
return;
|
||||
|
||||
Point p;
|
||||
int h = 0;
|
||||
d->buffer_view_->caretPosAndHeight(p, h);
|
||||
// Don't start blinking if the cursor isn't on screen.
|
||||
if (!d->buffer_view_->cursorInView(p, h))
|
||||
if (!d->buffer_view_->caretInView())
|
||||
return;
|
||||
|
||||
d->showCaret();
|
||||
@ -583,10 +580,7 @@ void GuiWorkArea::Private::resizeBufferView()
|
||||
// Warn our container (GuiView).
|
||||
p->busy(true);
|
||||
|
||||
Point point;
|
||||
int h = 0;
|
||||
buffer_view_->caretPosAndHeight(point, h);
|
||||
bool const caret_in_view = buffer_view_->cursorInView(point, h);
|
||||
bool const caret_in_view = buffer_view_->caretInView();
|
||||
buffer_view_->resize(p->viewport()->width(), p->viewport()->height());
|
||||
if (caret_in_view)
|
||||
buffer_view_->scrollToCursor();
|
||||
@ -610,11 +604,12 @@ void GuiWorkArea::Private::resizeBufferView()
|
||||
|
||||
void GuiWorkArea::Private::updateCaretGeometry()
|
||||
{
|
||||
if (!buffer_view_->caretInView())
|
||||
return;
|
||||
|
||||
Point point;
|
||||
int h = 0;
|
||||
buffer_view_->caretPosAndHeight(point, h);
|
||||
if (!buffer_view_->cursorInView(point, h))
|
||||
return;
|
||||
|
||||
// RTL or not RTL
|
||||
bool l_shape = false;
|
||||
|
Loading…
Reference in New Issue
Block a user