Jean-Marc Lasgouttes <[EMAIL PROTECTED]> writes:
> Uwe Stöhr <[EMAIL PROTECTED]> writes:
>
>>> I think anyway that the patch as I posted it is safe, but as we know the
>>> devil is in the details.
>>
>> Why do you still think it is safe when it introduces a crash?:
>> http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg145234.html
>
> I am on the case. Note that the fact that it turned a console message
> into a crash shows that I must be doing something relevant :)

This one fixes the crash (and the original undo message when importing).

JMarc

Index: src/LyXAction.cpp
===================================================================
--- src/LyXAction.cpp	(revision 27009)
+++ src/LyXAction.cpp	(working copy)
@@ -1850,7 +1850,7 @@
  * \li Origin: JSpitzm, 27 Apr 2006
  * \endvar
  */
-		{ LFUN_INSET_EDIT, "inset-edit", Noop, Edit },
+		{ LFUN_INSET_EDIT, "inset-edit", ReadOnly, Edit },
 
 /*!
  * \var lyx::FuncCode lyx::LFUN_TABULAR_INSERT
Index: src/LyXFunc.cpp
===================================================================
--- src/LyXFunc.cpp	(revision 27009)
+++ src/LyXFunc.cpp	(working copy)
@@ -751,6 +751,7 @@
 		if (lyx_view_)
 			lyx_view_->restartCursor();
 	} else {
+		Buffer * buffer = lyx_view_ ? lyx_view_->buffer() : 0;
 		switch (action) {
 
 		case LFUN_WORD_FIND_FORWARD:
@@ -785,7 +786,7 @@
 			LASSERT(lyx_view_ && lyx_view_->view(), /**/);
 			keyseq.reset();
 			meta_fake_bit = NoModifier;
-			if (lyx_view_->buffer())
+			if (buffer)
 				// cancel any selection
 				dispatch(FuncRequest(LFUN_MARK_OFF));
 			setMessage(from_ascii(N_("Cancel")));
@@ -797,24 +798,24 @@
 			break;
 
 		case LFUN_BUFFER_TOGGLE_READ_ONLY: {
-			LASSERT(lyx_view_ && lyx_view_->view() && lyx_view_->buffer(), /**/);
-			Buffer * buf = lyx_view_->buffer();
-			if (buf->lyxvc().inUse())
-				buf->lyxvc().toggleReadOnly();
+			LASSERT(lyx_view_ && lyx_view_->view() && buffer, /**/);
+			if (buffer->lyxvc().inUse())
+				buffer->lyxvc().toggleReadOnly();
 			else
-				buf->setReadonly(!lyx_view_->buffer()->isReadonly());
+				buffer->setReadonly(!buffer->isReadonly());
 			break;
 		}
 
 		// --- Menus -----------------------------------------------
 		case LFUN_BUFFER_CLOSE:
 			lyx_view_->closeBuffer();
+			buffer = 0;
 			updateFlags = Update::None;
 			break;
 
 		case LFUN_BUFFER_RELOAD: {
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
-			docstring const file = makeDisplayPath(lyx_view_->buffer()->absFileName(), 20);
+			LASSERT(lyx_view_ && buffer, /**/);
+			docstring const file = makeDisplayPath(buffer->absFileName(), 20);
 			docstring text = bformat(_("Any changes will be lost. Are you sure "
 							     "you want to revert to the saved version of the document %1$s?"), file);
 			int const ret = Alert::prompt(_("Revert to saved document?"),
@@ -826,45 +827,45 @@
 		}
 
 		case LFUN_BUFFER_UPDATE:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
-			lyx_view_->buffer()->doExport(argument, true);
+			LASSERT(lyx_view_ && buffer, /**/);
+			buffer->doExport(argument, true);
 			break;
 
 		case LFUN_BUFFER_VIEW:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
-			lyx_view_->buffer()->preview(argument);
+			LASSERT(lyx_view_ && buffer, /**/);
+			buffer->preview(argument);
 			break;
 
 		case LFUN_MASTER_BUFFER_UPDATE:
-			LASSERT(lyx_view_ && lyx_view_->buffer() && lyx_view_->buffer()->masterBuffer(), /**/);
-			lyx_view_->buffer()->masterBuffer()->doExport(argument, true);
+			LASSERT(lyx_view_ && buffer && buffer->masterBuffer(), /**/);
+			buffer->masterBuffer()->doExport(argument, true);
 			break;
 
 		case LFUN_MASTER_BUFFER_VIEW:
-			LASSERT(lyx_view_ && lyx_view_->buffer() && lyx_view_->buffer()->masterBuffer(), /**/);
-			lyx_view_->buffer()->masterBuffer()->preview(argument);
+			LASSERT(lyx_view_ && buffer && buffer->masterBuffer(), /**/);
+			buffer->masterBuffer()->preview(argument);
 			break;
 
 		case LFUN_BUILD_PROGRAM:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
-			lyx_view_->buffer()->doExport("program", true);
+			LASSERT(lyx_view_ && buffer, /**/);
+			buffer->doExport("program", true);
 			break;
 
 		case LFUN_BUFFER_CHKTEX:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
-			lyx_view_->buffer()->runChktex();
+			LASSERT(lyx_view_ && buffer, /**/);
+			buffer->runChktex();
 			break;
 
 		case LFUN_BUFFER_EXPORT:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
+			LASSERT(lyx_view_ && buffer, /**/);
 			if (argument == "custom")
 				dispatch(FuncRequest(LFUN_DIALOG_SHOW, "sendto"));
 			else
-				lyx_view_->buffer()->doExport(argument, false);
+				buffer->doExport(argument, false);
 			break;
 
 		case LFUN_BUFFER_EXPORT_CUSTOM: {
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
+			LASSERT(lyx_view_ && buffer, /**/);
 			string format_name;
 			string command = split(argument, format_name, ' ');
 			Format const * format = formats.getFormat(format_name);
@@ -875,8 +876,6 @@
 				break;
 			}
 
-			Buffer * buffer = lyx_view_->buffer();
-
 			// The name of the file created by the conversion process
 			string filename;
 
@@ -906,7 +905,7 @@
 		}
 
 		case LFUN_BUFFER_PRINT: {
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
+			LASSERT(lyx_view_ && buffer, /**/);
 			// FIXME: cmd.getArg() might fail if one of the arguments
 			// contains double quotes
 			string target = cmd.getArg(0);
@@ -926,8 +925,6 @@
 				break;
 			}
 
-			Buffer * buffer = lyx_view_->buffer();
-
 			if (!buffer->doExport("dvi", true)) {
 				showPrintError(buffer->absFileName());
 				break;
@@ -988,7 +985,7 @@
 			} else {
 				// case 1: print to a file
 				FileName const filename(makeAbsPath(target_name,
-							lyx_view_->buffer()->filePath()));
+							buffer->filePath()));
 				FileName const dvifile(makeAbsPath(dviname, path));
 				if (filename.exists()) {
 					docstring text = bformat(
@@ -1020,7 +1017,7 @@
 		*/
 
 		case LFUN_BUFFER_AUTO_SAVE:
-			lyx_view_->buffer()->autoSave();
+			buffer->autoSave();
 			break;
 
 		case LFUN_RECONFIGURE:
@@ -1055,55 +1052,55 @@
 
 		// --- version control -------------------------------
 		case LFUN_VC_REGISTER:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
-			if (!ensureBufferClean(view()) || lyx_view_->buffer()->isUnnamed())
+			LASSERT(lyx_view_ && buffer, /**/);
+			if (!ensureBufferClean(view()) || buffer->isUnnamed())
 				break;
-			if (!lyx_view_->buffer()->lyxvc().inUse()) {
-				lyx_view_->buffer()->lyxvc().registrer();
+			if (!buffer->lyxvc().inUse()) {
+				buffer->lyxvc().registrer();
 				reloadBuffer();
 			}
 			updateFlags = Update::Force;
 			break;
 
 		case LFUN_VC_CHECK_IN:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
+			LASSERT(lyx_view_ && buffer, /**/);
 			if (!ensureBufferClean(view()))
 				break;
-			if (lyx_view_->buffer()->lyxvc().inUse()
-					&& !lyx_view_->buffer()->isReadonly()) {
-				setMessage(from_utf8(lyx_view_->buffer()->lyxvc().checkIn()));
+			if (buffer->lyxvc().inUse()
+					&& !buffer->isReadonly()) {
+				setMessage(from_utf8(buffer->lyxvc().checkIn()));
 				reloadBuffer();
 			}
 			break;
 
 		case LFUN_VC_CHECK_OUT:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
+			LASSERT(lyx_view_ && buffer, /**/);
 			if (!ensureBufferClean(view()))
 				break;
-			if (lyx_view_->buffer()->lyxvc().inUse()) {
-				setMessage(from_utf8(lyx_view_->buffer()->lyxvc().checkOut()));
+			if (buffer->lyxvc().inUse()) {
+				setMessage(from_utf8(buffer->lyxvc().checkOut()));
 				reloadBuffer();
 			}
 			break;
 
 		case LFUN_VC_REVERT:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
-			lyx_view_->buffer()->lyxvc().revert();
+			LASSERT(lyx_view_ && buffer, /**/);
+			buffer->lyxvc().revert();
 			reloadBuffer();
 			break;
 
 		case LFUN_VC_UNDO_LAST:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
-			lyx_view_->buffer()->lyxvc().undoLast();
+			LASSERT(lyx_view_ && buffer, /**/);
+			buffer->lyxvc().undoLast();
 			reloadBuffer();
 			break;
 
 		// --- lyxserver commands ----------------------------
 		case LFUN_SERVER_GET_FILENAME:
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
-			setMessage(from_utf8(lyx_view_->buffer()->absFileName()));
+			LASSERT(lyx_view_ && buffer, /**/);
+			setMessage(from_utf8(buffer->absFileName()));
 			LYXERR(Debug::INFO, "FNAME["
-				<< lyx_view_->buffer()->absFileName() << ']');
+				<< buffer->absFileName() << ']');
 			break;
 
 		case LFUN_SERVER_NOTIFY:
@@ -1202,8 +1199,7 @@
 			} 
 			case EXTERNAL_CODE: {
 				InsetExternalParams p;
-				Buffer const & buffer = *lyx_view_->buffer();
-				data = InsetExternal::params2string(p, buffer);
+				data = InsetExternal::params2string(p, *buffer);
 				break;
 			} 
 			case FLOAT_CODE:  {
@@ -1218,8 +1214,7 @@
 			} 
 			case GRAPHICS_CODE: {
 				InsetGraphicsParams p;
-				Buffer const & buffer = *lyx_view_->buffer();
-				data = InsetGraphics::params2string(p, buffer);
+				data = InsetGraphics::params2string(p, *buffer);
 				break;
 			} 
 			case NOTE_CODE: {
@@ -1279,9 +1274,8 @@
 		}
 
 		case LFUN_BUFFER_CHILD_OPEN: {
-			LASSERT(lyx_view_ && lyx_view_->buffer(), /**/);
-			Buffer * parent = lyx_view_->buffer();
-			FileName filename = makeAbsPath(argument, parent->filePath());
+			LASSERT(lyx_view_ && buffer, /**/);
+			FileName filename = makeAbsPath(argument, buffer->filePath());
 			view()->saveBookmark(false);
 			Buffer * child = 0;
 			bool parsed = false;
@@ -1297,7 +1291,7 @@
 				// Set the parent name of the child document.
 				// This makes insertion of citations and references in the child work,
 				// when the target is in the parent or another child document.
-				child->setParent(parent);
+				child->setParent(buffer);
 				updateLabels(*child->masterBuffer());
 				lyx_view_->setBuffer(child);
 				if (parsed)
@@ -1344,7 +1338,7 @@
 			istringstream is(countstr);
 			int count = 0;
 			is >> count;
-			lyxerr << "repeat: count: " << count << " cmd: " << rest << endl;
+			//lyxerr << "repeat: count: " << count << " cmd: " << rest << endl;
 			for (int i = 0; i < count; ++i)
 				dispatch(lyxaction.lookupFunc(rest));
 			break;
@@ -1416,15 +1410,14 @@
 
 		case LFUN_BUFFER_LANGUAGE: {
 			LASSERT(lyx_view_, /**/);
-			Buffer & buffer = *lyx_view_->buffer();
-			Language const * oldL = buffer.params().language;
+			Language const * oldL = buffer->params().language;
 			Language const * newL = languages.getLanguage(argument);
 			if (!newL || oldL == newL)
 				break;
 
 			if (oldL->rightToLeft() == newL->rightToLeft()
-			    && !buffer.isMultiLingual())
-				buffer.changeLanguage(oldL, newL);
+			    && !buffer->isMultiLingual())
+				buffer->changeLanguage(oldL, newL);
 			break;
 		}
 
@@ -1457,7 +1450,6 @@
 		case LFUN_BUFFER_PARAMS_APPLY: {
 			LASSERT(lyx_view_, /**/);
 			
-			Buffer * buffer = lyx_view_->buffer();
 			DocumentClass const * const oldClass = buffer->params().documentClassPtr();
 			Cursor & cur = view()->cursor();
 			cur.recordUndoFullDocument();
@@ -1486,7 +1478,6 @@
 		
 		case LFUN_LAYOUT_MODULES_CLEAR: {
 			LASSERT(lyx_view_, /**/);
-			Buffer * buffer = lyx_view_->buffer();
 			DocumentClass const * const oldClass = buffer->params().documentClassPtr();
 			view()->cursor().recordUndoFullDocument();
 			buffer->params().clearLayoutModules();
@@ -1498,7 +1489,6 @@
 		
 		case LFUN_LAYOUT_MODULE_ADD: {
 			LASSERT(lyx_view_, /**/);
-			Buffer * buffer = lyx_view_->buffer();
 			BufferParams const & params = buffer->params();
 			if (!params.moduleCanBeAdded(argument)) {
 				LYXERR0("Module `" << argument << 
@@ -1517,7 +1507,6 @@
 
 		case LFUN_TEXTCLASS_APPLY: {
 			LASSERT(lyx_view_, /**/);
-			Buffer * buffer = lyx_view_->buffer();
 
 			if (!loadLayoutFile(argument, buffer->temppath()) &&
 				!loadLayoutFile(argument, buffer->filePath()))
@@ -1542,7 +1531,6 @@
 		
 		case LFUN_LAYOUT_RELOAD: {
 			LASSERT(lyx_view_, /**/);
-			Buffer * buffer = lyx_view_->buffer();
 			DocumentClass const * const oldClass = buffer->params().documentClassPtr();
 			LayoutFileIndex bc = buffer->params().baseClassID();
 			LayoutFileList::get().reset(bc);
@@ -1554,8 +1542,8 @@
 		}
 
 		case LFUN_TEXTCLASS_LOAD:
-			loadLayoutFile(argument, lyx_view_->buffer()->temppath()) ||
-			loadLayoutFile(argument, lyx_view_->buffer()->filePath());
+			loadLayoutFile(argument, buffer->temppath()) ||
+			loadLayoutFile(argument, buffer->filePath());
 			break;
 
 		case LFUN_LYXRC_APPLY: {
@@ -1606,14 +1594,15 @@
 
 			// Start an undo group. This may be needed for
 			// some stuff like inset-apply on labels.
-			if (lyx_view_->view())
-				view()->cursor().beginUndoGroup();
+			if (buffer)
+				buffer->undo().beginUndoGroup();
 				
 			// Let the current LyXView dispatch its own actions.
 			if (lyx_view_->dispatch(cmd)) {
 				if (lyx_view_->view()) {
 					updateFlags = lyx_view_->view()->cursor().result().update();
-					view()->cursor().endUndoGroup();
+					if (buffer)
+						buffer->undo().endUndoGroup();
 				}
 				break;
 			}
@@ -1624,7 +1613,8 @@
 			if (view()->dispatch(cmd)) {
 				// The BufferView took care of its own updates if needed.
 				updateFlags = Update::None;
-				view()->cursor().endUndoGroup();
+				if (buffer)
+					buffer->undo().endUndoGroup();
 				break;
 			}
 
@@ -1642,9 +1632,8 @@
 					view()->cursor().fixIfBroken();
 			}
 
-			// we assume here that the buffer view has not
-			// changed since the beginUndoGroup.
-			view()->cursor().endUndoGroup();
+			if (buffer)
+				buffer->undo().endUndoGroup();
 
 			// update completion. We do it here and not in
 			// processKeySym to avoid another redraw just for a
@@ -1661,6 +1650,12 @@
 			updateFlags = view()->cursor().result().update();
 		}
 
+		// if we executed a mutating lfun, mark the buffer as dirty
+		if (buffer && flag.enabled()
+		    && !lyxaction.funcHasFlag(action, LyXAction::NoBuffer)
+		    && !lyxaction.funcHasFlag(action, LyXAction::ReadOnly))
+			buffer->markDirty();			
+
 		if (lyx_view_ && lyx_view_->buffer()) {
 			// BufferView::update() updates the ViewMetricsInfo and
 			// also initializes the position cache for all insets in
@@ -1668,12 +1663,6 @@
 			// We will redraw the screen only if needed.
 			view()->processUpdateFlags(updateFlags);
 
-			// if we executed a mutating lfun, mark the buffer as dirty
-			if (flag.enabled()
-			    && !lyxaction.funcHasFlag(action, LyXAction::NoBuffer)
-			    && !lyxaction.funcHasFlag(action, LyXAction::ReadOnly))
-				lyx_view_->buffer()->markDirty();			
-
 			// Do we have a selection?
 			theSelection().haveSelection(view()->cursor().selection());
 			

Reply via email to