[prev in list] [next in list] [prev in thread] [next in thread]
List: lyx-devel
Subject: Re: LyX crash after font assert
From: Richard Heck <rgheck () comcast ! net>
Date: 2012-06-09 12:56:16
Message-ID: 4FD347F0.1030604 () comcast ! net
[Download RAW message or body]
On 06/09/2012 08:35 AM, Tommaso Cucinotta wrote:
> On 08/06/12 04:15, Richard Heck wrote:
>> On 6/7/12 6:15 PM, Tommaso Cucinotta wrote:
>>> Do u mind explaining what does this code do ?
>>>
>>> +void BufferView::makeDocumentClass()
>>> +{
>>> + DocumentClassConstPtr olddc =
>>> buffer_.params().documentClassPtr();
>>> + buffer_.params().makeDocumentClass();
>>> + updateDocumentClass(olddc);
>>> +}
>>>
>> Here's how to think of it. Suppose you add a new module to your
>> document. Then we need to do two things: (i) Load the module's code;
>> (ii) Adapt the Buffer to the presence of the new module. This code
>> does those two steps, whenever you do anything that requires them.
>> The BufferParams::makeDocumentClass() routine takes the base
>> TextClass (layout file) and loads modules and local layout into it,
>> creating a new DocumentClass. But we then have to make sure that the
>> Buffer itself uses this DocumentClass and, e.g., that each paragraph
>> references *its* layouts as opposed to the ones in the now discarded
>> DocumentClass. That's what updateDocumentClass() does.
>
> Ok, so it seems to me that, at the level of the document model,
> params().makeDocumentClass() and BufferView::updateDocumentClass()
> (or, perhaps, cap::switchBetweenClasses()) should happen atomically
> together, i.e., makeDocumentClass() might call
> cap::switchBetweenClasses(), or maybe better have a
> Buffer::makeDocumentClass() that calls both. Later, if the view
> happens to have further objects referencing the old class (e.g.,
> cursor ?), then it would be its own responsibility to update those
> further pointers.
>
> For example, I noticed that readHeader() calls makeDocumentClass() but
> apparently no further update is done on paragraphs. Now,
> BufferView.cpp calls readHeader() and afterwards updateDocumentClass()
> so it seems ok. However, GuiApplication.cpp, in SAVE_AS_DEFAULT, calls
> readHeader() but not updateDocumentClass() afterwards.
> Also, what about other calls to params().makeDocumentClass() ?
>
> $ find src/ -name '*.cpp' -exec grep -Hn makeDocumentClass {} \;
> src/Buffer.cpp:848: params().makeDocumentClass();
> src/BufferParams.cpp:353: makeDocumentClass();
> src/BufferParams.cpp:2023:void BufferParams::makeDocumentClass()
> src/BufferView.cpp:944:void BufferView::makeDocumentClass()
> src/BufferView.cpp:947: buffer_.params().makeDocumentClass();
> src/BufferView.cpp:1263: makeDocumentClass();
> src/BufferView.cpp:1279: makeDocumentClass();
> src/BufferView.cpp:1308: makeDocumentClass();
> src/BufferView.cpp:1332: makeDocumentClass();
> src/frontends/qt4/FindAndReplace.cpp:506: dest_bv.makeDocumentClass();
> src/frontends/qt4/GuiDocument.cpp:2056: bp_.makeDocumentClass();
> src/frontends/qt4/GuiDocument.cpp:2220: bp_.makeDocumentClass();
> src/frontends/qt4/GuiDocument.cpp:2337:
> param_copy.makeDocumentClass();
>
> The calls in GuiDocument.cpp seem to never be followed by an
> updateDocumentClass(), but perhaps these calls operate on temporary
> BufferParams and no document's paragraphs updates are needed.
>
I looked through these, but should probably do so again. The ones in
GuiDocument aren't a problem, since the BufferParams objects there
aren't actually associated with a document; they're representing the
BufferParams of a document, but they're just a copy. So we don't need to
change any paragraphs. The one in Buffer itself is just part of reading
the file, and the actual DocumentClass gets set later, if necessary.
I agree this is sub-standard, and everything ought to be done at once.
But especially in GuiDocument, this isn't possible.
Richard
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic