Properly notify insets after BufferView::doDispatch

Currently, insets are notified that the cursor entered or leaved them in Cursor::dispatch. This is not the cas efor lfuns which are handled in BufferView.

Adding the proper code allows to fix many bugs where previews are not updated correctly.

This also reverts cf4f79f8, which was the same fix for a particular case.

Fixes bug #6173.
This commit is contained in:
Jean-Marc Lasgouttes 2015-06-05 11:43:05 +02:00
parent 8f169aa23d
commit 469a1f48a6
2 changed files with 19 additions and 3 deletions

View File

@ -1237,6 +1237,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
string const argument = to_utf8(cmd.argument());
Cursor & cur = d->cursor_;
Cursor old = cur;
// Don't dispatch function that does not apply to internal buffers.
if (buffer_.isInternal()
@ -1745,11 +1746,8 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
p = Point(0, 0);
if (act == LFUN_SCREEN_DOWN && scrolled < height_)
p = Point(width_, height_);
Cursor old = cur;
bool const in_texted = cur.inTexted();
cur.setCursor(doc_iterator_begin(cur.buffer()));
if (cur != old)
notifyCursorLeavesOrEnters(old, cur);
cur.selHandle(false);
buffer_.changed(true);
updateHoveredInset();
@ -2069,6 +2067,21 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
buffer_.undo().endUndoGroup();
dr.dispatched(dispatched);
// NOTE: The code below is copied from Cursor::dispatch. If you
// need to modify this, please update the other one too.
// notify insets we just entered/left
if (cursor() != old) {
old.beginUndoGroup();
old.fixIfBroken();
bool badcursor = notifyCursorLeavesOrEnters(old, cursor());
if (badcursor) {
cursor().fixIfBroken();
resetInlineCompletionPos();
}
old.endUndoGroup();
}
}

View File

@ -458,6 +458,9 @@ void Cursor::dispatch(FuncRequest const & cmd0)
}
endUndoGroup();
// NOTE: The code below has been copied to BufferView::dispatch.
// If you need to modify this, please update the other one too.
// notify insets we just left
if (*this != old) {
old.beginUndoGroup();