From: Jean-Marc Lasgouttes Date: Mon, 4 Jun 2012 16:02:59 +0000 (+0200) Subject: Fix bug #8159: Undo doesn't restore environment depth correctly X-Git-Tag: 2.0.5~135 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=20f128582118777ec3e0bd6b1b3427784d4165b9;p=features.git Fix bug #8159: Undo doesn't restore environment depth correctly (backported from master) The idea is to record undo at the place where the document is modified: 1/ in Buffer::updateBuffer, add a recordUndo, with the caveat that a const_cast has to be used (because updateBuffer is const but modifies the document, go figure). 2/ in GuiApplication::dispatch, add an extra undo group that encompasses the updateBuffer call. Some other undo groups may be redundant now, but it is not a problem since they do not cost anything. --- diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 4f7f4418a4..6560da7343 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -4239,7 +4239,17 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const pit_type const lastpit = parit.lastpit(); for ( ; parit.pit() <= lastpit ; ++parit.pit()) { // reduce depth if necessary - parit->params().depth(min(parit->params().depth(), maxdepth)); + if (parit->params().depth() > maxdepth) { + /** FIXME: this function is const, but + * nevertheless it modifies the buffer. To be + * cleaner, one should modify the buffer in + * another function, which is actually + * non-const. This would however be costly in + * terms of code duplication. + */ + const_cast(this)->undo().recordUndo(parit); + parit->params().depth(maxdepth); + } maxdepth = parit->getMaxDepthAfter(); if (utype == OutputUpdate) { diff --git a/src/frontends/qt4/GuiApplication.cpp b/src/frontends/qt4/GuiApplication.cpp index fe6bf95526..cdf532c29a 100644 --- a/src/frontends/qt4/GuiApplication.cpp +++ b/src/frontends/qt4/GuiApplication.cpp @@ -1089,8 +1089,13 @@ static docstring makeDispatchMessage(docstring const & msg, void GuiApplication::dispatch(FuncRequest const & cmd) { - if (current_view_ && current_view_->currentBufferView()) + Buffer * buffer = 0; + if (current_view_ && current_view_->currentBufferView()) { current_view_->currentBufferView()->cursor().saveBeforeDispatchPosXY(); + buffer = ¤t_view_->currentBufferView()->buffer(); + if (buffer) + buffer->undo().beginUndoGroup(); + } DispatchResult dr; // redraw the screen at the end (first of the two drawing steps). @@ -1098,6 +1103,10 @@ void GuiApplication::dispatch(FuncRequest const & cmd) dr.screenUpdate(Update::FitCursor); dispatch(cmd, dr); updateCurrentView(cmd, dr); + + // the buffer may have been closed by one action + if (theBufferList().isLoaded(buffer)) + buffer->undo().endUndoGroup(); } diff --git a/status.20x b/status.20x index def9da3055..304a32972a 100644 --- a/status.20x +++ b/status.20x @@ -65,6 +65,8 @@ What's new - Replace current selection when pasting (bug 8027). +- Make sure that undo restores environment depth correctly (bug 8159). + * DOCUMENTATION AND LOCALIZATION