mirror of
https://git.lyx.org/repos/lyx.git
synced 2025-01-03 08:28:25 +00:00
Fix crash reported by Tommaso:
http://marc.info/?l=lyx-devel&m=133876924408431&w=2
The problem here is that the copy_params() routine in FindAndReplace.cpp
created a new DocumentClass, but it never updated its Buffer to reflect
that new DocumentClass. So its Paragraphs still contained points to the
Layouts in the old DocumentClass which, since ead697d4b6
, gets garbage
collected once it is no longer needed. So the Layout doesn't exist, and
we crash.
This commit is contained in:
parent
1078dba130
commit
7ef8df460a
@ -124,6 +124,10 @@ public:
|
|||||||
bool setBaseClass(std::string const & classname);
|
bool setBaseClass(std::string const & classname);
|
||||||
/// Adds the module information to the baseClass information to
|
/// Adds the module information to the baseClass information to
|
||||||
/// create our local DocumentClass.
|
/// create our local DocumentClass.
|
||||||
|
/// NOTE: This should NEVER be called externally unless one immediately goes
|
||||||
|
/// on to class BufferView::updateDocumentClass(). The exception, of course,
|
||||||
|
/// is in GuiDocument, where we use a BufferParams simply to hold a copy of
|
||||||
|
/// the parameters from the active Buffer.
|
||||||
void makeDocumentClass();
|
void makeDocumentClass();
|
||||||
/// Returns the DocumentClass currently in use: the BaseClass as modified
|
/// Returns the DocumentClass currently in use: the BaseClass as modified
|
||||||
/// by modules.
|
/// by modules.
|
||||||
|
@ -941,6 +941,14 @@ bool BufferView::scrollToCursor(DocIterator const & dit, bool recenter)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BufferView::makeDocumentClass()
|
||||||
|
{
|
||||||
|
DocumentClassConstPtr olddc = buffer_.params().documentClassPtr();
|
||||||
|
buffer_.params().makeDocumentClass();
|
||||||
|
updateDocumentClass(olddc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void BufferView::updateDocumentClass(DocumentClassConstPtr olddc)
|
void BufferView::updateDocumentClass(DocumentClassConstPtr olddc)
|
||||||
{
|
{
|
||||||
message(_("Converting document to new document class..."));
|
message(_("Converting document to new document class..."));
|
||||||
@ -956,6 +964,7 @@ void BufferView::updateDocumentClass(DocumentClassConstPtr olddc)
|
|||||||
buffer_.errors("Class Switch");
|
buffer_.errors("Class Switch");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Return the change status at cursor position, taking in account the
|
/** Return the change status at cursor position, taking in account the
|
||||||
* status at each level of the document iterator (a table in a deleted
|
* status at each level of the document iterator (a table in a deleted
|
||||||
* footnote is deleted).
|
* footnote is deleted).
|
||||||
@ -1256,11 +1265,9 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case LFUN_LAYOUT_MODULES_CLEAR: {
|
case LFUN_LAYOUT_MODULES_CLEAR: {
|
||||||
DocumentClassConstPtr oldClass = buffer_.params().documentClassPtr();
|
|
||||||
cur.recordUndoFullDocument();
|
cur.recordUndoFullDocument();
|
||||||
buffer_.params().clearLayoutModules();
|
buffer_.params().clearLayoutModules();
|
||||||
buffer_.params().makeDocumentClass();
|
makeDocumentClass();
|
||||||
updateDocumentClass(oldClass);
|
|
||||||
dr.screenUpdate(Update::Force);
|
dr.screenUpdate(Update::Force);
|
||||||
dr.forceBufferUpdate();
|
dr.forceBufferUpdate();
|
||||||
break;
|
break;
|
||||||
@ -1274,11 +1281,9 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
|
|||||||
"conflicts with installed modules.");
|
"conflicts with installed modules.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DocumentClassConstPtr oldClass = params.documentClassPtr();
|
|
||||||
cur.recordUndoFullDocument();
|
cur.recordUndoFullDocument();
|
||||||
buffer_.params().addLayoutModule(argument);
|
buffer_.params().addLayoutModule(argument);
|
||||||
buffer_.params().makeDocumentClass();
|
makeDocumentClass();
|
||||||
updateDocumentClass(oldClass);
|
|
||||||
dr.screenUpdate(Update::Force);
|
dr.screenUpdate(Update::Force);
|
||||||
dr.forceBufferUpdate();
|
dr.forceBufferUpdate();
|
||||||
break;
|
break;
|
||||||
@ -1305,11 +1310,9 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
// Save the old, possibly modular, layout for use in conversion.
|
// Save the old, possibly modular, layout for use in conversion.
|
||||||
DocumentClassConstPtr oldDocClass = buffer_.params().documentClassPtr();
|
|
||||||
cur.recordUndoFullDocument();
|
cur.recordUndoFullDocument();
|
||||||
buffer_.params().setBaseClass(argument);
|
buffer_.params().setBaseClass(argument);
|
||||||
buffer_.params().makeDocumentClass();
|
makeDocumentClass();
|
||||||
updateDocumentClass(oldDocClass);
|
|
||||||
dr.screenUpdate(Update::Force);
|
dr.screenUpdate(Update::Force);
|
||||||
dr.forceBufferUpdate();
|
dr.forceBufferUpdate();
|
||||||
break;
|
break;
|
||||||
@ -1330,12 +1333,10 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case LFUN_LAYOUT_RELOAD: {
|
case LFUN_LAYOUT_RELOAD: {
|
||||||
DocumentClassConstPtr oldClass = buffer_.params().documentClassPtr();
|
|
||||||
LayoutFileIndex bc = buffer_.params().baseClassID();
|
LayoutFileIndex bc = buffer_.params().baseClassID();
|
||||||
LayoutFileList::get().reset(bc);
|
LayoutFileList::get().reset(bc);
|
||||||
buffer_.params().setBaseClass(bc);
|
buffer_.params().setBaseClass(bc);
|
||||||
buffer_.params().makeDocumentClass();
|
makeDocumentClass();
|
||||||
updateDocumentClass(oldClass);
|
|
||||||
dr.screenUpdate(Update::Force);
|
dr.screenUpdate(Update::Force);
|
||||||
dr.forceBufferUpdate();
|
dr.forceBufferUpdate();
|
||||||
break;
|
break;
|
||||||
|
@ -318,6 +318,8 @@ public:
|
|||||||
void clearLastInset(Inset * inset) const;
|
void clearLastInset(Inset * inset) const;
|
||||||
/// Is the mouse hovering a clickable inset or element?
|
/// Is the mouse hovering a clickable inset or element?
|
||||||
bool clickableInset() const;
|
bool clickableInset() const;
|
||||||
|
///
|
||||||
|
void makeDocumentClass();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// noncopyable
|
/// noncopyable
|
||||||
|
@ -503,7 +503,7 @@ static void copy_params(BufferView const & bv, BufferView & dest_bv) {
|
|||||||
Buffer & dest_buf = dest_bv.buffer();
|
Buffer & dest_buf = dest_bv.buffer();
|
||||||
dest_buf.params().setLanguage(lang);
|
dest_buf.params().setLanguage(lang);
|
||||||
dest_buf.params().setBaseClass(doc_class);
|
dest_buf.params().setBaseClass(doc_class);
|
||||||
dest_buf.params().makeDocumentClass();
|
dest_bv.makeDocumentClass();
|
||||||
dest_bv.cursor().current_font.setLanguage(doc_bp.language);
|
dest_bv.cursor().current_font.setLanguage(doc_bp.language);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user