Properly notify insets after BufferView::doDispatch

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

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

Fixes bug #6173.
This commit is contained in:
Jean-Marc Lasgouttes 2015-06-05 11:43:05 +02:00
parent b18fff0caa
commit 56c4bf6c74
3 changed files with 21 additions and 1 deletions

View File

@ -1223,6 +1223,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
string const argument = to_utf8(cmd.argument()); string const argument = to_utf8(cmd.argument());
Cursor & cur = d->cursor_; Cursor & cur = d->cursor_;
Cursor old = cur;
// Don't dispatch function that does not apply to internal buffers. // Don't dispatch function that does not apply to internal buffers.
if (buffer_.isInternal() if (buffer_.isInternal()
@ -1720,7 +1721,6 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
p = Point(0, 0); p = Point(0, 0);
if (act == LFUN_SCREEN_DOWN && scrolled < height_) if (act == LFUN_SCREEN_DOWN && scrolled < height_)
p = Point(width_, height_); p = Point(width_, height_);
Cursor old = cur;
bool const in_texted = cur.inTexted(); bool const in_texted = cur.inTexted();
cur.setCursor(doc_iterator_begin(cur.buffer())); cur.setCursor(doc_iterator_begin(cur.buffer()));
cur.selHandle(false); cur.selHandle(false);
@ -2042,6 +2042,21 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
buffer_.undo().endUndoGroup(); buffer_.undo().endUndoGroup();
dr.dispatched(dispatched); 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

@ -454,6 +454,9 @@ void Cursor::dispatch(FuncRequest const & cmd0)
} }
endUndoGroup(); 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 // notify insets we just left
if (*this != old) { if (*this != old) {
old.beginUndoGroup(); old.beginUndoGroup();

View File

@ -70,6 +70,8 @@ What's new
- Fix setting of nested minipage via the dialog (bug 8716). - Fix setting of nested minipage via the dialog (bug 8716).
- When the document language is changed, update cursor language too (bug 9586). - When the document language is changed, update cursor language too (bug 9586).
- Correctly update previews when cursor leaves inset (bug 6173).
* INTERNALS * INTERNALS