]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView_pimpl.C
reduce number of calls to LyXText::getFont
[lyx.git] / src / BufferView_pimpl.C
index ce12c3d10af9544c08731902df47a92d4d9a9dcd..bf2bc7a40d6ebfa73b88e47395049fca36efc028 100644 (file)
@@ -520,10 +520,8 @@ void BufferView::Pimpl::workAreaKeyPress(LyXKeySymPtr key,
         * of the cursor. Note we cannot do this inside
         * dispatch() itself, because that's called recursively.
         */
-       if (available()) {
-               cursor_timeout.restart();
+       if (available())
                screen().showCursor(*bv_);
-       }
 }
 
 
@@ -606,11 +604,12 @@ bool BufferView::Pimpl::fitCursor()
 }
 
 
-void BufferView::Pimpl::update(bool fitcursor, bool forceupdate)
+void BufferView::Pimpl::update(Update::flags flags)
 {
        lyxerr << BOOST_CURRENT_FUNCTION
-              << "[fitcursor = " << fitcursor << ','
-              << " forceupdate = " << forceupdate
+              << "[fitcursor = " << (flags & Update::FitCursor)
+              << ", forceupdate = " << (flags & Update::Force)
+              << ", singlepar = " << (flags & Update::SinglePar)
               << "]  buffer: " << buffer_ << endl;
 
        // Check needed to survive LyX startup
@@ -620,22 +619,19 @@ void BufferView::Pimpl::update(bool fitcursor, bool forceupdate)
 
                CoordCache backup;
                std::swap(theCoords, backup);
-               
-               // This call disallows cursor blink to call
-               // processEvents. It is necessary to prevent screen
-               // redraw being called recursively.
-               screen().unAllowSync();
+
                // This, together with doneUpdating(), verifies (using
-               // asserts) that screen redraw is not called from 
+               // asserts) that screen redraw is not called from
                // within itself.
                theCoords.startUpdating();
 
                // First drawing step
                ViewMetricsInfo vi = metrics();
+               bool forceupdate(flags & Update::Force);
 
-               if (fitcursor && fitCursor()) {
+               if ((flags & Update::FitCursor) && fitCursor()) {
                        forceupdate = true;
-                       vi = metrics();
+                       vi = metrics(flags & Update::SinglePar);
                }
                if (forceupdate) {
                        // Second drawing step
@@ -934,7 +930,10 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0)
 
        if (cur.result().dispatched()) {
                // Redraw if requested or necessary.
-               update(cur.result().update(), cur.result().update());
+               if (cur.result().update())
+                       update(Update::FitCursor | Update::Force);
+               else
+                       update();
        }
 
        // See workAreaKeyPress
@@ -973,7 +972,6 @@ FuncStatus BufferView::Pimpl::getStatus(FuncRequest const & cmd)
        case LFUN_FONT_STATE:
        case LFUN_INSERT_LABEL:
        case LFUN_BOOKMARK_SAVE:
-       case LFUN_LABEL_GOTO:
        case LFUN_GOTO_PARAGRAPH:
        case LFUN_GOTOERROR:
        case LFUN_GOTONOTE:
@@ -988,6 +986,12 @@ FuncStatus BufferView::Pimpl::getStatus(FuncRequest const & cmd)
                flag.enabled(true);
                break;
 
+       case LFUN_LABEL_GOTO: {
+               flag.enabled(!cmd.argument.empty()
+                   || getInsetByCode<InsetRef>(cursor_, InsetBase::REF_CODE));
+               break;
+       }
+
        case LFUN_BOOKMARK_GOTO:
                flag.enabled(isSavedPosition(convert<unsigned int>(cmd.argument)));
                break;
@@ -1246,7 +1250,7 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & cmd)
 }
 
 
-ViewMetricsInfo BufferView::Pimpl::metrics()
+ViewMetricsInfo BufferView::Pimpl::metrics(bool singlepar)
 {
        // Remove old position cache
        theCoords.clear();
@@ -1274,7 +1278,7 @@ ViewMetricsInfo BufferView::Pimpl::metrics()
 
        // Redo paragraphs above cursor if necessary
        int y1 = y0;
-       while (y1 > 0 && pit1 > 0) {
+       while (!singlepar && y1 > 0 && pit1 > 0) {
                y1 -= text->getPar(pit1).ascent();
                --pit1;
                text->redoParagraph(pit1);
@@ -1298,7 +1302,7 @@ ViewMetricsInfo BufferView::Pimpl::metrics()
 
        // Redo paragraphs below cursor if necessary
        int y2 = y0;
-       while (y2 < bv.workHeight() && pit2 < int(npit) - 1) {
+       while (!singlepar && y2 < bv.workHeight() && pit2 < int(npit) - 1) {
                y2 += text->getPar(pit2).descent();
                ++pit2;
                text->redoParagraph(pit2);
@@ -1321,5 +1325,5 @@ ViewMetricsInfo BufferView::Pimpl::metrics()
               << " y2: " << y2
               << endl;
 
-       return ViewMetricsInfo(pit1, pit2, y1, y2);
+       return ViewMetricsInfo(pit1, pit2, y1, y2, singlepar);
 }