Here is the most up-to-date version of the patch, with all comments and such. Bo and I agree it should go into both trunk and branch, as it solves the problem. ;-) We need one more OK.
Richard -- ================================================================== Richard G Heck, Jr Professor of Philosophy Brown University http://frege.brown.edu/heck/ ================================================================== Get my public key from http://sks.keyserver.penguin.de Hash: 0x1DE91F1E66FFBDEC Learn how to sign your email using Thunderbird and GnuPG at: http://dudu.dyn.2-h.org/nist/gpg-enigmail-howto
Index: src/BufferView.h =================================================================== --- src/BufferView.h (revision 19264) +++ src/BufferView.h (working copy) @@ -86,7 +86,8 @@ /// set the buffer we are viewing. /// \todo FIXME: eventually, we will create a new BufferView /// when switching Buffers, so this method should go. - void setBuffer(Buffer * b); + /// returns the buffer currently set + Buffer * setBuffer(Buffer * b); /// return the buffer being viewed. Buffer * buffer() const; Index: src/BufferView.cpp =================================================================== --- src/BufferView.cpp (revision 19264) +++ src/BufferView.cpp (working copy) @@ -143,7 +143,7 @@ } -void BufferView::setBuffer(Buffer * b) +Buffer * BufferView::setBuffer(Buffer * b) { LYXERR(Debug::INFO) << BOOST_CURRENT_FUNCTION << "[ b = " << b << "]" << endl; @@ -182,7 +182,7 @@ // If we're quitting lyx, don't bother updating stuff if (quitting) { buffer_ = 0; - return; + return 0; } //FIXME Fix for bug 3440 is here. @@ -209,7 +209,7 @@ offset_ref_ = 0; if (!buffer_) - return; + return 0; LYXERR(Debug::INFO) << BOOST_CURRENT_FUNCTION << "Buffer addr: " << buffer_ << endl; @@ -243,6 +243,7 @@ if (graphics::Previews::status() != LyXRC::PREVIEW_OFF) graphics::Previews::get().generateBufferPreviews(*buffer_); + return buffer_; } Index: src/frontends/LyXView.h =================================================================== --- src/frontends/LyXView.h (revision 19264) +++ src/frontends/LyXView.h (working copy) @@ -254,6 +254,12 @@ /// connect to signals in the given buffer void connectBuffer(Buffer & buf); /// disconnect from signals in the given buffer + /// NOTE: Do not call this unless you really want no buffer + /// to be connected---for example, when closing the last open + /// buffer. If you are switching buffers, just call + /// connectBuffer(), and the old buffer will be disconnected + /// automatically. This ensures that we do not leave LyX in a + /// state in which no buffer is connected. void disconnectBuffer(); /// BufferView messages signal connection Index: src/frontends/LyXView.cpp =================================================================== --- src/frontends/LyXView.cpp (revision 19264) +++ src/frontends/LyXView.cpp (working copy) @@ -133,18 +133,14 @@ // parentfilename will be used in case when we switch to a child // document (hence when child_document is true) string parentfilename; - if (oldBuffer) { + if (oldBuffer) parentfilename = oldBuffer->fileName(); - disconnectBuffer(); - } if (!b && theBufferList().empty()) getDialogs().hideBufferDependent(); - work_area_->bufferView().setBuffer(b); + Buffer * newBuffer = work_area_->bufferView().setBuffer(b); - //FIXME This would be a little simpler if setBuffer returned the buffer. - Buffer * newBuffer = work_area_->bufferView().buffer(); if (newBuffer) { if (child_document && newBuffer->getMasterBuffer() != oldBuffer) { // Set the parent name of the child document. @@ -160,7 +156,10 @@ // must update the labels and section numbering of its master // Buffer. updateLabels(*oldBuffer->getMasterBuffer()); - + + //Now that all the updating of the old buffer has been done, we can + //connect the new buffer. Note that this will automatically disconnect + //the old one. connectBuffer(*newBuffer); /* FIXME: We need to rebuild the Toc dialog before the others even @@ -178,7 +177,9 @@ // hidden. This should go here because some dialogs (eg ToC) // require bv_->text. getDialogs().updateBufferDependent(true); - } + } else + //Disconnect the old buffer...there's no new one. + disconnectBuffer(); if (quitting) return;