commit 3f62601a8f7fc2b5df7c6ecc54a2c331a0264290
Author: Richard Heck <[email protected]>
Date:   Mon Jan 27 14:58:21 2014 -0500

    Fix bug discovered by Kornel. See
        http://marc.info/?l=lyx-devel&m=138590578911716&w=2
    If you look at Buffer.cpp, around line 4351, there was a comment about bug 
5699. We are seeing the
    same crash. The problem is that, although the master does have a GUI, that 
GUI is in a different window. So the structureChanged() call we do during 
updateBuffer() is for the TOC in that window, not the TOC in the window we are 
actually in. So our TocModel::toc_ has been reset and is invalid, though the 
widget itself has not been updated and looks fine.
    
    This patch tests whether the master is in the same window as the buffer we 
are updating.
    
    A problem remains, which is noted in a comment.

diff --git a/src/Buffer.cpp b/src/Buffer.cpp
index 9040425..398c6b5 100644
--- a/src/Buffer.cpp
+++ b/src/Buffer.cpp
@@ -4348,9 +4348,15 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType 
utype) const
                if (master != this) {
                        bufToUpdate.insert(this);
                        master->updateBuffer(UpdateMaster, utype);
-                       // Do this here in case the master has no gui 
associated with it. Then,
-                       // the TocModel is not updated and TocModel::toc_ is 
invalid (bug 5699).
-                       if (!master->d->gui_)
+                       // If the master buffer has no gui associated with it, 
then the TocModel is 
+                       // not updated during the updateBuffer call and 
TocModel::toc_ is invalid 
+                       // (bug 5699). The same happens if the master buffer is 
open in a different 
+                       // window. This test catches both possibilities.
+                       // See: 
http://marc.info/?l=lyx-devel&m=138590578911716&w=2
+                       // There remains a problem here: If there is another 
child open in yet a third
+                       // window, that TOC is not updated. So some more 
general solution is needed at
+                       // some point.
+                       if (master->d->gui_ != d->gui_)
                                structureChanged();
 
                        // was buf referenced from the master (i.e. not in 
bufToUpdate anymore)?

Reply via email to