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;

Reply via email to