From 5577e877bb0a25a0919db09b10effe9f54ff1333 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Fri, 9 Jul 2010 14:37:00 +0000 Subject: [PATCH] Try to move all updateBuffer() calls to a central location. We now use DispatchResult to store a flag that tells us whether we need a buffer update or not. So: If you find a missing one, go to an appropriate place in the dispatch and call cur.forceBufferUpdate() or, if you don't have a cursor but do have a DispatchResult, call dr.forceBufferUpdate(). There is one remaining call I could not move, in TextMetrics::redoParagraph. But this looks like an emergency call when the macro context has not been set. There are also a couple calls that are connected with buffer creation that I commented out, since the same call is done again almost immediately. But I'm not positive about those. Now the nice thing would be to do the same for updateMacros(). git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@34826 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Buffer.cpp | 9 +++++++-- src/BufferView.cpp | 25 ++++++++++++++++++++--- src/Cursor.cpp | 29 +++++++++++++++++++++++++-- src/Cursor.h | 8 +++++++- src/CutAndPaste.cpp | 18 +++++++++++++---- src/DispatchResult.h | 10 +++++++++- src/Text.cpp | 17 +++++++--------- src/Text2.cpp | 4 ++-- src/Text3.cpp | 30 +++++++++++++++++----------- src/TextMetrics.cpp | 5 +++-- src/Undo.cpp | 1 - src/frontends/qt4/GuiApplication.cpp | 9 +++++++-- src/frontends/qt4/GuiView.cpp | 18 +++++++++++++---- src/insets/Inset.cpp | 6 ------ src/insets/Inset.h | 2 +- src/insets/InsetBibitem.cpp | 5 ++--- src/insets/InsetBranch.cpp | 3 +++ src/insets/InsetCommand.cpp | 4 ++++ src/insets/InsetFloat.cpp | 5 ++++- src/insets/InsetInclude.cpp | 1 + src/insets/InsetIndex.cpp | 3 +++ src/insets/InsetLabel.cpp | 5 +---- src/insets/InsetNote.cpp | 3 +++ src/lyxfind.cpp | 1 - src/mathed/InsetMathGrid.cpp | 5 ++--- src/mathed/InsetMathHull.cpp | 19 +++++++----------- src/mathed/InsetMathNest.cpp | 12 ++++------- src/mathed/InsetMathRef.cpp | 2 +- 28 files changed, 173 insertions(+), 86 deletions(-) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index fd483fa64b..5c48720832 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -2037,6 +2037,7 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) branch->setSelected(func.action() == LFUN_BRANCH_ACTIVATE); dr.setError(false); dr.update(Update::Force); + dr.forceBufferUpdate(); } break; } @@ -2071,8 +2072,10 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) } } - if (success) + if (success) { dr.update(Update::Force); + dr.forceBufferUpdate(); + } break; } @@ -2198,8 +2201,10 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) Language const * newL = languages.getLanguage(argument); if (!newL || oldL == newL) break; - if (oldL->rightToLeft() == newL->rightToLeft() && !isMultiLingual()) + if (oldL->rightToLeft() == newL->rightToLeft() && !isMultiLingual()) { changeLanguage(oldL, newL); + dr.forceBufferUpdate(); + } break; } diff --git a/src/BufferView.cpp b/src/BufferView.cpp index f4e47f4404..076bff7af8 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -413,6 +413,8 @@ void BufferView::processUpdateFlags(Update::flags flags) << ", singlepar = " << (flags & Update::SinglePar) << "] buffer: " << &buffer_); + // FIXME Does this really need doing here? It's done in updateBuffer, and + // if the Buffer doesn't need updating, then do the macros? buffer_.updateMacros(); // Now do the first drawing step if needed. This consists on updating @@ -935,7 +937,6 @@ void BufferView::updateDocumentClass(DocumentClass const * const olddc) setCursor(backcur.asDocIterator(&buffer_)); buffer_.errors("Class Switch"); - buffer_.updateBuffer(); } /** Return the change status at cursor position, taking in account the @@ -1203,6 +1204,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) // It is then better to make sure that all dialogs are in sync with // current document settings. dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); break; } @@ -1214,6 +1216,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) buffer_.params().makeDocumentClass(); updateDocumentClass(oldClass); dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); break; } @@ -1231,6 +1234,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) buffer_.params().makeDocumentClass(); updateDocumentClass(oldClass); dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); break; } @@ -1254,6 +1258,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) buffer_.params().makeDocumentClass(); updateDocumentClass(oldDocClass); dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); break; } @@ -1270,6 +1275,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) buffer_.params().makeDocumentClass(); updateDocumentClass(oldClass); dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); break; } @@ -1280,6 +1286,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) dr.setMessage(_("No further undo information")); else dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); break; case LFUN_REDO: @@ -1289,6 +1296,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) dr.setMessage(_("No further redo information")); else dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); break; case LFUN_FONT_STATE: @@ -1402,6 +1410,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) case LFUN_CHANGES_MERGE: if (findNextChange(this) || findPreviousChange(this)) { dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); showDialog("changes"); } break; @@ -1415,6 +1424,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) buffer_.text().acceptOrRejectChanges(cur, Text::ACCEPT); // FIXME: Move this LFUN to Buffer so that we don't have to do this: dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); break; case LFUN_ALL_CHANGES_REJECT: @@ -1427,6 +1437,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) buffer_.text().acceptOrRejectChanges(cur, Text::REJECT); // FIXME: Move this LFUN to Buffer so that we don't have to do this: dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); break; case LFUN_WORD_FIND_FORWARD: @@ -1481,6 +1492,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) } } replace(this, cmd, has_deleted); + dr.forceBufferUpdate(); break; } @@ -1625,13 +1637,16 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) //FIXME: what to do with cur.x_target()? bool update = in_texted && cur.bv().checkDepm(cur, old); cur.finishUndo(); - if (update) + if (update) { dr.update(Update::Force | Update::FitCursor); + dr.forceBufferUpdate(); + } break; } case LFUN_SCROLL: lfunScroll(cmd); + dr.forceBufferUpdate(); break; case LFUN_SCREEN_UP_SELECT: { @@ -1708,6 +1723,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) cur = savecur; cur.fixIfBroken(); dr.update(Update::Force); + dr.forceBufferUpdate(); if (iterations >= max_iter) { dr.setError(true); @@ -1810,6 +1826,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) FuncRequest fr(LFUN_INSET_MODIFY, cmd.argument()); inset->dispatch(cur, fr); dr.update(Update::SinglePar | Update::FitCursor); + dr.forceBufferUpdate(); break; } @@ -2227,7 +2244,7 @@ bool BufferView::checkDepm(Cursor & cur, Cursor & old) d->cursor_ = cur; - buffer_.updateBuffer(); + cur.forceBufferUpdate(); buffer_.changed(true); return true; } @@ -2271,6 +2288,8 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool select) d->cursor_.finishUndo(); d->cursor_.setCurrentFont(); + if (update) + cur.forceBufferUpdate(); return update; } diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 44f4b6bd8a..e4a34b158c 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -1276,6 +1276,7 @@ void Cursor::plainInsert(MathAtom const & t) ++pos(); inset().setBuffer(bv_->buffer()); inset().initView(); + forceBufferUpdate(); } @@ -1318,6 +1319,8 @@ void Cursor::insert(Inset * inset0) text()->insertInset(*this, inset0); inset0->setBuffer(bv_->buffer()); inset0->initView(); + if (inset0->isLabeled()) + forceBufferUpdate(); } } @@ -1359,7 +1362,7 @@ void Cursor::insert(MathData const & ar) cap::eraseSelection(*this); cell().insert(pos(), ar); pos() += ar.size(); - // FIXME audit setBuffer/updateBuffer calls + // FIXME audit setBuffer calls inset().setBuffer(bv_->buffer()); } @@ -1883,6 +1886,8 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded) updateNeeded |= bv().checkDepm(dummy, *this); updateTextTargetOffset(); + if (updateNeeded) + forceBufferUpdate(); } return false; } @@ -1907,7 +1912,7 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded) ++dummy.pos(); if (bv().checkDepm(dummy, old)) { updateNeeded = true; - // Make sure that cur gets back whatever happened to dummy(Lgb) + // Make sure that cur gets back whatever happened to dummy (Lgb) operator=(dummy); } } else { @@ -1952,6 +1957,8 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded) updateNeeded |= bv().checkDepm(*this, old); } + if (updateNeeded) + forceBufferUpdate(); updateTextTargetOffset(); return true; } @@ -2119,6 +2126,24 @@ void Cursor::screenUpdateFlags(Update::flags f) } +void Cursor::forceBufferUpdate() +{ + disp_.forceBufferUpdate(); +} + + +void Cursor::clearBufferUpdate() +{ + disp_.clearBufferUpdate(); +} + + +bool Cursor::needBufferUpdate() const +{ + return disp_.needBufferUpdate(); +} + + void Cursor::noScreenUpdate() { disp_.update(Update::None); diff --git a/src/Cursor.h b/src/Cursor.h index 3464a54a23..719a2cbd4f 100644 --- a/src/Cursor.h +++ b/src/Cursor.h @@ -228,8 +228,14 @@ public: void undispatched(); /// the event was already dispatched void dispatched(); - /// Set which update should be done + /// Set which screen update should be done void screenUpdateFlags(Update::flags f); + /// Forces an updateBuffer() call + void forceBufferUpdate(); + /// Removes any pending updateBuffer() call + void clearBufferUpdate(); + /// Do we need to call updateBuffer()? + bool needBufferUpdate() const; /** * don't call update() when done * diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 2709d15d80..5fd559f107 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -242,6 +242,8 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, InsetLabel * lab = labels[i]; docstring const oldname = lab->getParam("name"); lab->updateCommand(oldname, false); + // We need to update the buffer reference cache. + cur.forceBufferUpdate(); docstring const newname = lab->getParam("name"); if (oldname == newname) continue; @@ -258,7 +260,7 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, static_cast(*itt); // this is necessary to prevent an uninitialized // buffer when the RefInset is in a MathBox. - // FIXME audit setBuffer/updateBuffer calls + // FIXME audit setBuffer calls mi.setBuffer(const_cast(buffer)); if (mi.asRefInset()->getTarget() == oldname) mi.asRefInset()->changeTarget(newname); @@ -273,6 +275,8 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, InsetCommand & lab = static_cast(*it); docstring const oldname = lab.getParam("name"); lab.updateCommand(oldname, false); + // We need to update the buffer reference cache. + cur.forceBufferUpdate(); docstring const newname = lab.getParam("name"); if (oldname == newname) break; @@ -287,7 +291,7 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, static_cast(*itt); // this is necessary to prevent an uninitialized // buffer when the RefInset is in a MathBox. - // FIXME audit setBuffer/updateBuffer calls + // FIXME audit setBuffer calls mi.setBuffer(const_cast(buffer)); if (mi.asRefInset()->getTarget() == oldname) mi.asRefInset()->changeTarget(newname); @@ -299,6 +303,8 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, case INCLUDE_CODE: { InsetInclude & inc = static_cast(*it); inc.updateCommand(); + // We need to update the list of included files. + cur.forceBufferUpdate(); break; } @@ -307,6 +313,8 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, InsetCommand & bib = static_cast(*it); docstring const oldkey = bib.getParam("key"); bib.updateCommand(oldkey, false); + // We need to update the buffer reference cache. + cur.forceBufferUpdate(); docstring const newkey = bib.getParam("key"); if (oldkey == newkey) break; @@ -345,6 +353,8 @@ pasteSelectionHelper(Cursor & cur, ParagraphList const & parlist, text, 0, 1, _("&Add"), _("&Don't Add")) != 0) break; lyx::dispatch(FuncRequest(LFUN_BRANCH_ADD, name)); + // We need to update the list of branches. + cur.forceBufferUpdate(); break; } @@ -777,7 +787,7 @@ void cutSelection(Cursor & cur, bool doclear, bool realcut) // need a valid cursor. (Lgb) cur.clearSelection(); - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); // tell tabular that a recent copy happened dirtyTabularStack(false); @@ -955,7 +965,7 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist, boost::tie(ppp, endpit) = pasteSelectionHelper(cur, parlist, docclass, errorList); - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); cur.clearSelection(); text->setCursor(cur, ppp.first, ppp.second); } diff --git a/src/DispatchResult.h b/src/DispatchResult.h index 1e65a23a9b..070ee1bdfc 100644 --- a/src/DispatchResult.h +++ b/src/DispatchResult.h @@ -24,7 +24,7 @@ class DispatchResult { public: /// DispatchResult() : dispatched_(false), error_(false), - update_(Update::None) {} + update_(Update::None), need_buf_update_(false) {} /// DispatchResult(bool disp, Update::flags f) : dispatched_(disp), error_(false), update_(f) {} @@ -44,6 +44,12 @@ public: Update::flags update() const { return update_; } /// void update(Update::flags f) { update_ = f; } + /// Does the buffer need updating? + bool needBufferUpdate() const { return need_buf_update_; } + /// Force the buffer to be updated + void forceBufferUpdate() { need_buf_update_ = true; } + /// Clear the flag indicating we need an update + void clearBufferUpdate() { need_buf_update_ = false; } private: /// was the event fully dispatched? bool dispatched_; @@ -53,6 +59,8 @@ private: Update::flags update_; /// docstring message_; + /// + bool need_buf_update_; }; diff --git a/src/Text.cpp b/src/Text.cpp index a0f4451ebb..de977ffa8a 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -739,10 +739,9 @@ void Text::breakParagraph(Cursor & cur, bool inverse_logic) break; // the character couldn't be deleted physically due to change tracking } - cur.buffer()->updateBuffer(); - // A singlePar update is not enough in this case. cur.screenUpdateFlags(Update::Force); + cur.forceBufferUpdate(); // This check is necessary. Otherwise the new empty paragraph will // be deleted automatically. And it is more friendly for the user! @@ -1316,7 +1315,7 @@ void Text::acceptOrRejectChanges(Cursor & cur, ChangeOp op) cur.clearSelection(); setCursorIntern(cur, begPit, begPos); cur.screenUpdateFlags(Update::Force); - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); } @@ -1467,7 +1466,7 @@ bool Text::handleBibitems(Cursor & cur) cur.recordUndo(ATOMIC_UNDO, prevcur.pit()); mergeParagraph(bufparams, cur.text()->paragraphs(), prevcur.pit()); - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); setCursorIntern(cur, prevcur.pit(), prevcur.pos()); cur.screenUpdateFlags(Update::Force); return true; @@ -1495,7 +1494,7 @@ bool Text::erase(Cursor & cur) cur.top().forwardPos(); if (was_inset) - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); else cur.checkBufferStructure(); needsUpdate = true; @@ -1571,7 +1570,7 @@ bool Text::backspacePos0(Cursor & cur) } if (needsUpdate) { - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); setCursorIntern(cur, prevcur.pit(), prevcur.pos()); } @@ -1611,7 +1610,7 @@ bool Text::backspace(Cursor & cur) bool const was_inset = cur.paragraph().isInset(cur.pos()); cur.paragraph().eraseChar(cur.pos(), cur.buffer()->params().trackChanges); if (was_inset) - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); else cur.checkBufferStructure(); } @@ -1667,9 +1666,7 @@ bool Text::dissolveInset(Cursor & cur) cur.pit() = min(cur.lastpit(), spit); cur.pos() = min(cur.lastpos(), spos); } else - // this is the least that needs to be done (bug 6003) - // in the above case, pasteParagraphList handles this - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); // Ensure the current language is set correctly (bug 6292) cur.text()->setCursor(cur, cur.pit(), cur.pos()); diff --git a/src/Text2.cpp b/src/Text2.cpp index fc7a337105..0b4b5e33fb 100644 --- a/src/Text2.cpp +++ b/src/Text2.cpp @@ -231,7 +231,7 @@ void Text::setLayout(Cursor & cur, docstring const & layout) pit_type undopit = undoSpan(end - 1); recUndo(cur, start, undopit - 1); setLayout(start, end, layout); - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); } @@ -290,7 +290,7 @@ void Text::changeDepth(Cursor & cur, DEPTH_CHANGE type) } // this handles the counter labels, and also fixes up // depth values for follow-on (child) paragraphs - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); } diff --git a/src/Text3.cpp b/src/Text3.cpp index a9e045698b..a871a62d1b 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -486,8 +486,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) recUndo(cur, pit, pit + 1); cur.finishUndo(); pars_.swap(pit, pit + 1); - cur.buffer()->updateBuffer(); needsUpdate = true; + cur.forceBufferUpdate(); ++cur.pit(); break; } @@ -497,9 +497,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) recUndo(cur, pit - 1, pit); cur.finishUndo(); pars_.swap(pit, pit - 1); - cur.buffer()->updateBuffer(); --cur.pit(); needsUpdate = true; + cur.forceBufferUpdate(); break; } @@ -523,7 +523,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) par.params().startOfAppendix(start); // we can set the refreshing parameters now - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); break; } @@ -624,7 +624,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // provide it with two different cursors. Cursor dummy = cur; dummy.pos() = dummy.pit() = 0; - cur.bv().checkDepm(dummy, cur); + if (cur.bv().checkDepm(dummy, cur)) + cur.forceBufferUpdate();; } } break; @@ -650,7 +651,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) Cursor dummy = cur; dummy.pos() = cur.lastpos(); dummy.pit() = cur.lastpit(); - cur.bv().checkDepm(dummy, cur); + if (cur.bv().checkDepm(dummy, cur)) + cur.forceBufferUpdate(); } } break; @@ -971,6 +973,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) singleParUpdate = false; } moveCursor(cur, false); + cur.forceBufferUpdate(); break; case LFUN_CHAR_DELETE_BACKWARD: @@ -988,6 +991,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cutSelection(cur, true, false); singleParUpdate = false; } + cur.forceBufferUpdate(); break; case LFUN_BREAK_PARAGRAPH: @@ -1046,8 +1050,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } case LFUN_INSET_DISSOLVE: { - if (dissolveInset(cur)) + if (dissolveInset(cur)) { needsUpdate = true; + cur.forceBufferUpdate(); + } break; } @@ -1579,7 +1585,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.posForward(); // Some insets are numbered, others are shown in the outline pane so // let's update the labels and the toc backend. - bv->buffer().updateBuffer(); + cur.forceBufferUpdate(); break; case LFUN_TABULAR_INSERT: @@ -1633,7 +1639,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // date metrics. FuncRequest cmd_caption(LFUN_CAPTION_INSERT); doInsertInset(cur, cur.text(), cmd_caption, true, false); - bv->buffer().updateBuffer(); + cur.forceBufferUpdate(); cur.screenUpdateFlags(Update::Force); // FIXME: When leaving the Float (or Wrap) inset we should // delete any empty paragraph left above or below the @@ -2074,26 +2080,26 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_OUTLINE_UP: outline(OutlineUp, cur); setCursor(cur, cur.pit(), 0); - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); needsUpdate = true; break; case LFUN_OUTLINE_DOWN: outline(OutlineDown, cur); setCursor(cur, cur.pit(), 0); - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); needsUpdate = true; break; case LFUN_OUTLINE_IN: outline(OutlineIn, cur); - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); needsUpdate = true; break; case LFUN_OUTLINE_OUT: outline(OutlineOut, cur); - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); needsUpdate = true; break; diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 675f8ee11a..2a87cf996b 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -134,8 +134,6 @@ TextMetrics::TextMetrics(BufferView * bv, Text * text) dim_.wid = max_width_; dim_.asc = 10; dim_.des = 10; - - //text_->updateBuffer(bv->buffer()); } @@ -401,6 +399,9 @@ bool TextMetrics::redoParagraph(pit_type const pit) LYXERR(Debug::INFO, "MacroContext not initialised!" << " Going through the buffer again and hope" << " the context is better then."); + // FIXME audit updateBuffer calls + // This should not be here, but it is not clear yet where else it + // should be. bv_->buffer().updateBuffer(); parPos = text_->macrocontextPosition(); LASSERT(!parPos.empty(), /**/); diff --git a/src/Undo.cpp b/src/Undo.cpp index 32ba4f2864..e130cd8fdc 100644 --- a/src/Undo.cpp +++ b/src/Undo.cpp @@ -429,7 +429,6 @@ bool Undo::Private::textUndoOrRedo(DocIterator & cur, bool isUndoOperation) // Adapt the new material to current buffer. buffer_.setBuffersForInsets(); // FIXME This shouldn't be here. - buffer_.updateBuffer(); return true; } diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp index fecf5791bc..0bc02fa7a7 100644 --- a/src/frontends/qt4/GuiApplication.cpp +++ b/src/frontends/qt4/GuiApplication.cpp @@ -1098,6 +1098,10 @@ void GuiApplication::dispatch(FuncRequest const & cmd) BufferView * bv = current_view_->currentBufferView(); if (bv) { + if (dr.needBufferUpdate()) { + bv->cursor().clearBufferUpdate(); + bv->buffer().updateBuffer(); + } // BufferView::update() updates the ViewMetricsInfo and // also initializes the position cache for all insets in // (at least partially) visible top-level paragraphs. @@ -1232,6 +1236,7 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr) dr.setError(true); dr.dispatched(false); dr.update(Update::None); + dr.clearBufferUpdate(); return; }; @@ -1344,7 +1349,6 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr) #ifndef DEVEL_VERSION buf->setReadonly(true); #endif - buf->updateBuffer(); buf->errors("Parse"); } break; @@ -1576,9 +1580,10 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr) // Let the current GuiView dispatch its own actions. current_view_->dispatch(cmd, dr); + if (dr.dispatched()) break; - + BufferView * bv = current_view_->currentBufferView(); LASSERT(bv, /**/); diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index e4e4d39b78..dc569ac049 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -1804,7 +1804,8 @@ void GuiView::openDocument(string const & fname) docstring str2; Buffer * buf = loadDocument(fullname); if (buf) { - buf->updateBuffer(); + // I don't think this is needed, since it will be done in setBuffer(). + // buf->updateBuffer(); setBuffer(buf); buf->errors("Parse"); str2 = bformat(_("Document %1$s opened."), disp_fn); @@ -1853,7 +1854,8 @@ static bool import(GuiView * lv, FileName const & filename, Buffer * buf = lv->loadDocument(lyxfile); if (!buf) return false; - buf->updateBuffer(); + // I don't think this is needed, since it will be done in setBuffer(). + // buf->updateBuffer(); lv->setBuffer(buf); buf->errors("Parse"); } else { @@ -2729,7 +2731,10 @@ void GuiView::openChildDocument(string const & fname) // This makes insertion of citations and references in the child work, // when the target is in the parent or another child document. child->setParent(&buffer); - child->masterBuffer()->updateBuffer(); + + // I don't think this is needed, since it will be called in + // setBuffer(). + // child->masterBuffer()->updateBuffer(); setBuffer(child); if (parsed) child->errors("Parse"); @@ -2777,7 +2782,11 @@ bool GuiView::goToFileRow(string const & argument) buf = theBufferList().getBuffer(s); else if (s.exists()) { buf = loadDocument(s); - buf->updateBuffer(); + if (!buf) + return false; + // I don't think this is needed. loadDocument() calls + // setBuffer(), which calls updateBuffer(). + // buf->updateBuffer(); buf->errors("Parse"); } else { message(bformat( @@ -3041,6 +3050,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr) if (ret == 0) { doc_buffer->markClean(); reloadBuffer(); + dr.forceBufferUpdate(); } break; } diff --git a/src/insets/Inset.cpp b/src/insets/Inset.cpp index c2f8ceab24..65687c8949 100644 --- a/src/insets/Inset.cpp +++ b/src/insets/Inset.cpp @@ -238,12 +238,6 @@ bool Inset::forceLTR() const return getLayout().forceLTR(); } -void Inset::initView() -{ - if (isLabeled()) - buffer().updateBuffer(); -} - docstring Inset::toolTip(BufferView const &, int, int) const { diff --git a/src/insets/Inset.h b/src/insets/Inset.h index 136cbd4f46..3ee807b333 100644 --- a/src/insets/Inset.h +++ b/src/insets/Inset.h @@ -124,7 +124,7 @@ public: * * \sa isLabeled() **/ - virtual void initView(); + virtual void initView() {}; /// \return true if this inset is labeled. virtual bool isLabeled() const { return false; } diff --git a/src/insets/InsetBibitem.cpp b/src/insets/InsetBibitem.cpp index 9ae67be4c7..d650feab06 100644 --- a/src/insets/InsetBibitem.cpp +++ b/src/insets/InsetBibitem.cpp @@ -93,8 +93,6 @@ void InsetBibitem::updateCommand(docstring const & new_key, bool) "it will be changed to %2$s."), new_key, key)); } setParam("key", key); - - buffer().updateBuffer(); } @@ -128,8 +126,9 @@ void InsetBibitem::doDispatch(Cursor & cur, FuncRequest & cmd) updateCommand(p["key"]); cur.bv().buffer().changeRefsIfUnique(old_key, params()["key"], CITE_CODE); + cur.forceBufferUpdate(); + buffer_->invalidateBibinfoCache(); } - buffer_->invalidateBibinfoCache(); break; } diff --git a/src/insets/InsetBranch.cpp b/src/insets/InsetBranch.cpp index b43fda3d2e..82b5ad8dac 100644 --- a/src/insets/InsetBranch.cpp +++ b/src/insets/InsetBranch.cpp @@ -119,6 +119,9 @@ void InsetBranch::doDispatch(Cursor & cur, FuncRequest & cmd) InsetBranchParams params; InsetBranch::string2params(to_utf8(cmd.argument()), params); params_.branch = params.branch; + // what we really want here is a TOC update, but that means + // a full buffer update + cur.forceBufferUpdate(); break; } case LFUN_BRANCH_ACTIVATE: diff --git a/src/insets/InsetCommand.cpp b/src/insets/InsetCommand.cpp index f535c5d8e9..357ec8628a 100644 --- a/src/insets/InsetCommand.cpp +++ b/src/insets/InsetCommand.cpp @@ -156,6 +156,10 @@ void InsetCommand::doDispatch(Cursor & cur, FuncRequest & cmd) cur.noScreenUpdate(); else setParams(p); + // FIXME We might also want to check here if this one is in the TOC. + // But I think most of those are labeled. + if (isLabeled()) + cur.forceBufferUpdate(); break; } diff --git a/src/insets/InsetFloat.cpp b/src/insets/InsetFloat.cpp index 5e5c79c3d9..421b106a69 100644 --- a/src/insets/InsetFloat.cpp +++ b/src/insets/InsetFloat.cpp @@ -152,8 +152,11 @@ void InsetFloat::doDispatch(Cursor & cur, FuncRequest & cmd) setNewLabel(); if (params_.type != params.type) { params_.type = params.type; - buffer().updateBuffer(); + cur.forceBufferUpdate(); } + // what we really want here is a TOC update, but that means + // a full buffer update + cur.forceBufferUpdate(); break; } diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index 013c120c01..66d9fc6a4d 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -274,6 +274,7 @@ void InsetInclude::doDispatch(Cursor & cur, FuncRequest & cmd) } } setParams(p); + cur.forceBufferUpdate(); } else cur.noScreenUpdate(); break; diff --git a/src/insets/InsetIndex.cpp b/src/insets/InsetIndex.cpp index 3751aa75e4..5db138e1df 100644 --- a/src/insets/InsetIndex.cpp +++ b/src/insets/InsetIndex.cpp @@ -211,6 +211,9 @@ void InsetIndex::doDispatch(Cursor & cur, FuncRequest & cmd) InsetIndexParams params; InsetIndex::string2params(to_utf8(cmd.argument()), params); params_.index = params.index; + // what we really want here is a TOC update, but that means + // a full buffer update + cur.forceBufferUpdate(); break; } diff --git a/src/insets/InsetLabel.cpp b/src/insets/InsetLabel.cpp index 019698c16d..5217dffd1a 100644 --- a/src/insets/InsetLabel.cpp +++ b/src/insets/InsetLabel.cpp @@ -97,10 +97,6 @@ void InsetLabel::updateCommand(docstring const & new_label, bool updaterefs) } } buffer().undo().endUndoGroup(); - - // We need an update of the Buffer reference cache. This is achieved by - // updateBuffer(). - buffer().updateBuffer(); } @@ -205,6 +201,7 @@ void InsetLabel::doDispatch(Cursor & cur, FuncRequest & cmd) } if (p["name"] != params()["name"]) updateCommand(p["name"]); + cur.forceBufferUpdate(); break; } diff --git a/src/insets/InsetNote.cpp b/src/insets/InsetNote.cpp index 6af19a3bc9..0e76114b02 100644 --- a/src/insets/InsetNote.cpp +++ b/src/insets/InsetNote.cpp @@ -176,6 +176,9 @@ void InsetNote::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_INSET_MODIFY: string2params(to_utf8(cmd.argument()), params_); setButtonLabel(); + // what we really want here is a TOC update, but that means + // a full buffer update + cur.forceBufferUpdate(); break; case LFUN_INSET_DIALOG_UPDATE: diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp index d713cd1dc3..2ba1d28029 100644 --- a/src/lyxfind.cpp +++ b/src/lyxfind.cpp @@ -196,7 +196,6 @@ int replaceAll(BufferView * bv, ++num; } - buf.updateBuffer(); bv->putSelectionAt(doc_iterator_begin(&buf), 0, false); if (num) buf.markDirty(); diff --git a/src/mathed/InsetMathGrid.cpp b/src/mathed/InsetMathGrid.cpp index ad7b1140a4..2c950e5453 100644 --- a/src/mathed/InsetMathGrid.cpp +++ b/src/mathed/InsetMathGrid.cpp @@ -1371,10 +1371,9 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) cell(i).append(grid.cell(grid.index(r, c))); } cur.clearSelection(); // bug 393 - // FIXME audit setBuffer/updateBuffer calls + // FIXME audit setBuffer calls cur.inset().setBuffer(*buffer_); - // FIXME audit setBuffer/updateBuffer calls - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); cur.finishUndo(); break; } diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp index 860b0e4e8a..a27c4d4e20 100644 --- a/src/mathed/InsetMathHull.cpp +++ b/src/mathed/InsetMathHull.cpp @@ -572,10 +572,6 @@ void InsetMathHull::label(row_type row, docstring const & label) if (label.empty()) { delete label_[row]; label_[row] = dummy_pointer; - // We need an update of the Buffer reference cache. - // This is achieved by updateBuffer(). - if (buffer_) - buffer().updateBuffer(); } else { if (buffer_) label_[row]->updateCommand(label); @@ -598,14 +594,6 @@ void InsetMathHull::numbered(row_type row, bool num) if (nonum_[row] && label_[row]) { delete label_[row]; label_[row] = 0; - if (!buffer_) { - // The buffer is set at the end of readInset. - // When parsing the inset, buffer_ is 0. - return; - } - // We need an update of the Buffer reference cache. - // This is achieved by updateBuffer(). - buffer().updateBuffer(); } } @@ -1275,6 +1263,8 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd) bool const align = cur.bv().buffer().params().use_amsmath == BufferParams::package_on; mutate(align ? hullAlign : hullEqnArray); + // mutate() may change labels and such. + cur.forceBufferUpdate(); cur.idx() = nrows() * ncols() - 1; cur.pos() = cur.lastpos(); } @@ -1292,6 +1282,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd) numbered(row, !old); cur.message(old ? _("No number") : _("Number")); + cur.forceBufferUpdate(); break; } @@ -1301,6 +1292,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd) bool old = numbered(r); cur.message(old ? _("No number") : _("Number")); numbered(r, !old); + cur.forceBufferUpdate(); break; } @@ -1363,6 +1355,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd) } else if (numbered(row(cur.idx()))) { cur.recordUndoInset(); numbered(row(cur.idx()), false); + cur.forceBufferUpdate(); } else { InsetMathGrid::doDispatch(cur, cmd); return; @@ -1397,6 +1390,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd) label_[r]->initView(); } } + cur.forceBufferUpdate(); break; } InsetMathGrid::doDispatch(cur, cmd); @@ -1421,6 +1415,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd) if (cur.pos() > cur.lastpos()) cur.pos() = cur.lastpos(); + cur.forceBufferUpdate(); // FIXME: find some more clever handling of the selection, // i.e. preserve it. cur.clearSelection(); diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp index 03cacd1353..d023a5f415 100644 --- a/src/mathed/InsetMathNest.cpp +++ b/src/mathed/InsetMathNest.cpp @@ -574,8 +574,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) } cur.niceInsert(topaste, parseflg, false); cur.clearSelection(); // bug 393 - // FIXME audit setBuffer/updateBuffer calls - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); cur.finishUndo(); break; } @@ -587,8 +586,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) // Prevent stale position >= size crash // Probably not necessary anymore, see eraseSelection (gb 2005-10-09) cur.normalize(); - // FIXME audit setBuffer/updateBuffer calls - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); break; case LFUN_COPY: @@ -998,8 +996,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) cur.posBackward(); cur.pushBackward(*cur.nextInset()); cur.niceInsert(save_selection); - // FIXME audit setBuffer/updateBuffer calls - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); #else if (currentMode() == Inset::TEXT_MODE) { cur.recordUndoSelection(); @@ -1229,8 +1226,7 @@ void InsetMathNest::doDispatch(Cursor & cur, FuncRequest & cmd) if (createInsetMath_fromDialogStr(cmd.argument(), ar)) { cur.recordUndoSelection(); cur.insert(ar); - // FIXME audit setBuffer/updateBuffer calls - cur.buffer()->updateBuffer(); + cur.forceBufferUpdate(); } else cur.undispatched(); break; diff --git a/src/mathed/InsetMathRef.cpp b/src/mathed/InsetMathRef.cpp index e8f2d5e941..2cbad4ca56 100644 --- a/src/mathed/InsetMathRef.cpp +++ b/src/mathed/InsetMathRef.cpp @@ -214,7 +214,7 @@ void InsetMathRef::changeTarget(docstring const & target) if (createInsetMath_fromDialogStr( from_utf8(InsetCommand::params2string("ref", icp)), ar)) { *this = *ar[0].nucleus()->asRefInset(); - // FIXME audit setBuffer/updateBuffer calls + // FIXME audit setBuffer calls setBuffer(buf); } }