The branch, 2.0.x, has been updated.

- Log -----------------------------------------------------------------

commit 20f128582118777ec3e0bd6b1b3427784d4165b9
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Mon Jun 4 18:02:59 2012 +0200

    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 4f7f441..6560da7 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<Buffer *>(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 fe6bf95..cdf532c 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 = &current_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 def9da3..304a329 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
 

-----------------------------------------------------------------------

Summary of changes:
 src/Buffer.cpp                       |   12 +++++++++++-
 src/frontends/qt4/GuiApplication.cpp |   11 ++++++++++-
 status.20x                           |    2 ++
 3 files changed, 23 insertions(+), 2 deletions(-)


hooks/post-receive
-- 
The LyX Source Repository

Reply via email to