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());