]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_nestinset.C
Fix event loop to no longer eat CPU
[lyx.git] / src / mathed / math_nestinset.C
index c6ef7f2d510d1c91479ea259ff733a828181734f..de62936601702401259899b335b18d98212dbcba 100644 (file)
@@ -51,6 +51,7 @@
 #include "frontends/Dialogs.h"
 #include "frontends/LyXView.h"
 #include "frontends/Painter.h"
+#include "frontends/nullpainter.h"
 
 #include <sstream>
 
@@ -219,9 +220,6 @@ void MathNestInset::draw(PainterInfo & pi, int x, int y) const
 
 void MathNestInset::drawSelection(PainterInfo & pi, int x, int y) const
 {
-       // FIXME: hack to get position cache warm
-       draw(pi, x, y);
-
        // this should use the x/y values given, not the cached values
        LCursor & cur = pi.base.bv->cursor();
        if (!cur.selection())
@@ -229,6 +227,12 @@ void MathNestInset::drawSelection(PainterInfo & pi, int x, int y) const
        if (!ptr_cmp(&cur.inset(), this))
                return;
 
+       // FIXME: hack to get position cache warm
+       static NullPainter nop;
+       PainterInfo pinop(pi);
+       pinop.pain = nop;
+       draw(pinop, x, y);
+
        CursorSlice s1 = cur.selBegin();
        CursorSlice s2 = cur.selEnd();
        //lyxerr << "MathNestInset::drawing selection: "
@@ -340,7 +344,7 @@ int MathNestInset::latex(Buffer const &, std::ostream & os,
 }
 
 
-void MathNestInset::notifyCursorLeaves(LCursor & /*cur*/)
+void MathNestInset::notifyCursorLeaves(LCursor & cur)
 {
 #ifdef WITH_WARNINGS
 #warning look here
@@ -669,7 +673,19 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
                // undoes the complete macro, not only the last character.
                if (!cur.inMacroMode())
                        recordUndo(cur);
-               if (!interpret(cur, cmd.argument[0])) {
+
+               // spacial handling of space. If we insert an inset
+               // via macro mode, we want to put the cursor inside it
+               // if relevant. Think typing "\frac<space>".
+               if (cmd.argument[0] == ' ' 
+                   && cur.inMacroMode() && cur.macroName() != "\\"
+                   && cur.macroModeClose()) {
+                       MathAtom const atom = cur.prevAtom();
+                       if (atom->asNestInset() && atom->nargs() > 0) {
+                               cur.posLeft();
+                               cur.pushLeft(*cur.nextInset());
+                       }
+               } else if (!interpret(cur, cmd.argument[0])) {
                        cmd = FuncRequest(LFUN_FINISHED_RIGHT);
                        cur.undispatched();
                }
@@ -1025,8 +1041,7 @@ void MathNestInset::lfunMousePress(LCursor & cur, FuncRequest & cmd)
        //lyxerr << "## lfunMousePress: buttons: " << cmd.button() << endl;
        if (cmd.button() == mouse_button::button1) {
                //lyxerr << "## lfunMousePress: setting cursor to: " << cur << endl;
-               cur.resetAnchor();
-               cur.bv().cursor() = cur;
+               cur.bv().mouseSetCursor(cur);
        }
 
        if (cmd.button() == mouse_button::button2) {
@@ -1249,6 +1264,7 @@ bool MathNestInset::script(LCursor & cur, bool up)
                --cur.pos();
                MathScriptInset * inset = cur.nextAtom().nucleus()->asScriptInset();
                cur.push(*inset);
+               inset->ensure(up);
                cur.idx() = inset->idxOfScript(up);
                cur.pos() = cur.lastpos();
        } else {