On Fri, Dec 09, 2005 at 11:11:20AM -0500, Bennett Helm wrote:
> On Dec 9, 2005, at 10:07 AM, Jean-Marc Lasgouttes wrote:

...
 
> >Bennett> It's a little hard to tell the order of events given that
> >Bennett> things happen so quickly. But it seems like as you type, the
> >Bennett> individual character that gets typed gets updated, then the
> >Bennett> info bar at the bottom of the window is updated, and then the
> >Bennett> whole text area of the window is updated. It's that last item
> >Bennett> that seems significant: the entire window is updated with
> >Bennett> each keystroke.
> >
> >Even when typing at top-level? We should only update the paragraph at
> >cursor, I think.
> 
> Yes. Perhaps I should add that by "text area" I include the grey area  
> at the bottom of a document but above the info bar. So even in a 1- 
> line document, most of the window area flashes when a single  
> character is typed.

That shouldn't happen, I think. Actual, physical redrawing should only
happen in the cursor paragraph in this case. I don't see the flashing
either, for what that is worth. 

What I did test, however, was another thing: how often is redoParagraph
being called. I instrumented all the calls to this routine, and the
result is rather disconcerting.

When adding one character to a paragraph in the middle of a screen, that
paragraph is "redone" no less than three times. The ones immediately
above and below twice, and all other visible (and just-outside-screen)
ones, once. That's way too much. I suspect that these calls, through the
singleWidth font call, cause the slowness on Mac.

Instrumentation attached.

- Martin

Index: bufferview_funcs.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/bufferview_funcs.C,v
retrieving revision 1.157
Index: BufferView_pimpl.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView_pimpl.C,v
retrieving revision 1.600
diff -u -p -r1.600 BufferView_pimpl.C
--- BufferView_pimpl.C  29 Nov 2005 15:08:32 -0000      1.600
+++ BufferView_pimpl.C  9 Dec 2005 18:23:21 -0000
@@ -504,6 +504,7 @@ void BufferView::Pimpl::scrollDocView(in
        anchor_ref_ = int(bar * t.paragraphs().size());
        if (anchor_ref_ >  int(t.paragraphs().size()) - 1)
                anchor_ref_ = int(t.paragraphs().size()) - 1;
+       lyxerr << "scrolldoc -";
        t.redoParagraph(anchor_ref_);
        int const h = t.getPar(anchor_ref_).height();
        offset_ref_ = int((bar * t.paragraphs().size() - anchor_ref_) * h);
@@ -816,6 +817,7 @@ void BufferView::Pimpl::center()
 {
        CursorSlice & bot = cursor_.bottom();
        lyx::pit_type const pit = bot.pit();
+       lyxerr << "center -";
        bot.text()->redoParagraph(pit);
        Paragraph const & par = bot.text()->paragraphs()[pit];
        anchor_ref_ = pit;
@@ -1351,8 +1353,10 @@ ViewMetricsInfo BufferView::Pimpl::metri
        // the (main text, not inset!) paragraph containing the cursor.
        // (if this paragraph contains insets etc., rebreaking will 
        // recursively descend)
-       if (!singlepar || pit == cursor_.bottom().pit())
+       if (!singlepar || pit == cursor_.bottom().pit())  {
+               lyxerr << "at-anchor -";
                text->redoParagraph(pit);
+       }
        int y0 = text->getPar(pit).ascent() - offset_ref_;
 
        // Redo paragraphs above anchor if necessary; again, in Single Par
@@ -1361,8 +1365,10 @@ ViewMetricsInfo BufferView::Pimpl::metri
        while (y1 > 0 && pit1 > 0) {
                y1 -= text->getPar(pit1).ascent();
                --pit1;
-               if (!singlepar || pit1 == cursor_.bottom().pit())
+               if (!singlepar || pit1 == cursor_.bottom().pit()) {
+                       lyxerr << "above-anchor -";
                        text->redoParagraph(pit1);
+               }
                y1 -= text->getPar(pit1).descent();
        }
 
@@ -1387,8 +1393,10 @@ ViewMetricsInfo BufferView::Pimpl::metri
        while (y2 < bv.workHeight() && pit2 < int(npit) - 1) {
                y2 += text->getPar(pit2).descent();
                ++pit2;
-               if (!singlepar || pit2 == cursor_.bottom().pit())
+               if (!singlepar || pit2 == cursor_.bottom().pit()) {
+                       lyxerr << "below-anchor -";
                        text->redoParagraph(pit2);
+               }
                y2 += text->getPar(pit2).ascent();
        }
 
Index: cursor.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor.C,v
retrieving revision 1.139
diff -u -p -r1.139 cursor.C
--- cursor.C    7 Nov 2005 15:02:07 -0000       1.139
+++ cursor.C    9 Dec 2005 18:23:22 -0000
@@ -884,6 +884,7 @@ void LCursor::setTargetX()
 {
        // For now this is good enough. A better solution would be to
        // avoid this rebreak by setting cursorX only after drawing
+       lyxerr << "setTargetX -";
        bottom().text()->redoParagraph(bottom().pit());
        int x;
        int y;
Index: rowpainter.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/rowpainter.C,v
retrieving revision 1.159
diff -u -p -r1.159 rowpainter.C
--- rowpainter.C        2 Dec 2005 13:20:26 -0000       1.159
+++ rowpainter.C        9 Dec 2005 18:23:23 -0000
@@ -775,12 +775,14 @@ void paintText(BufferView const & bv, Vi
        // Try viewing the User Guide Mobius figure
 
        if (vi.p1 > 0) {
+               lyxerr << "one above -";
                text->redoParagraph(vi.p1 - 1);
                theCoords.parPos()[bv.text()][vi.p1 - 1] = 
                        Point(0, vi.y1 - text->getPar(vi.p1 - 1).descent());
        }
 
        if (vi.p2 < lyx::pit_type(text->paragraphs().size()) - 1) {
+               lyxerr << "one below -";
                text->redoParagraph(vi.p2 + 1);
                theCoords.parPos()[bv.text()][vi.p2 + 1] = 
                        Point(0, vi.y2 + text->getPar(vi.p2 + 1).ascent());
Index: text.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text.C,v
retrieving revision 1.637
diff -u -p -r1.637 text.C
--- text.C      6 Dec 2005 14:54:21 -0000       1.637
+++ text.C      9 Dec 2005 18:23:26 -0000
@@ -1730,7 +1730,8 @@ bool LyXText::redoParagraph(pit_type con
        bool const same = dim == par.dim();
 
        par.dim() = dim;
-       //lyxerr << "redoParagraph: " << par.rows().size() << " rows\n";
+       lyxerr << "redoParagraph: " << pit << "( " << par.rows().size() 
+           << " rows)" << std::endl;
 
        return !same;
 }
@@ -1749,6 +1750,7 @@ void LyXText::metrics(MetricsInfo & mi, 
        unsigned int h = 0;
        unsigned int w = 0;
        for (pit_type pit = 0, n = paragraphs().size(); pit != n; ++pit) {
+               lyxerr << "metric -";
                redoParagraph(pit);
                Paragraph & par = paragraphs()[pit];
                h += par.height();

Attachment: pgpRFTIR1geDE.pgp
Description: PGP signature

Reply via email to