+ case LFUN_PASTE: {
+ recordUndo(cur);
+ cur.message(_("Paste"));
+ replaceSelection(cur);
+ size_t n = 0;
+ istringstream is(cmd.argument);
+ is >> n;
+ string const selection = lyx::cap::getSelection(cur.buffer(), n);
+ cur.niceInsert(selection);
+ cur.clearSelection(); // bug 393
+ cur.bv().switchKeyMap();
+ finishUndo();
+ break;
+ }
+
+ case LFUN_CUT:
+ recordUndo(cur);
+ cutSelection(cur, true, true);
+ cur.message(_("Cut"));
+ // Prevent stale position >= size crash
+ // Probably not necessary anymore, see eraseSelection (gb 2005-10-09)
+ cur.normalize();
+ break;
+
+ case LFUN_COPY:
+ copySelection(cur);
+ cur.message(_("Copy"));
+ break;
+
+ case LFUN_MOUSE_PRESS:
+ lfunMousePress(cur, cmd);
+ break;
+
+ case LFUN_MOUSE_MOTION:
+ lfunMouseMotion(cur, cmd);
+ break;
+
+ case LFUN_MOUSE_RELEASE:
+ lfunMouseRelease(cur, cmd);
+ break;
+
+ case LFUN_FINISHED_LEFT:
+ cur.bv().cursor() = cur;
+ break;
+
+ case LFUN_FINISHED_RIGHT:
+ ++cur.pos();
+ cur.bv().cursor() = cur;
+ break;
+
+ case LFUN_FINISHED_UP:
+ cur.bv().cursor() = cur;
+ break;
+
+ case LFUN_FINISHED_DOWN:
+ ++cur.pos();
+ cur.bv().cursor() = cur;
+ break;
+
+ case LFUN_RIGHTSEL:
+ case LFUN_RIGHT:
+ cur.selHandle(cmd.action == LFUN_RIGHTSEL);
+ cur.autocorrect() = false;
+ cur.clearTargetX();
+ cur.macroModeClose();
+ if (cur.pos() != cur.lastpos() && cur.openable(cur.nextAtom())) {
+ cur.pushLeft(*cur.nextAtom().nucleus());
+ cur.inset().idxFirst(cur);
+ } else if (cur.posRight() || idxRight(cur)
+ || cur.popRight() || cur.selection())
+ ;
+ else {
+ cmd = FuncRequest(LFUN_FINISHED_RIGHT);
+ cur.undispatched();
+ }
+ break;
+
+ case LFUN_LEFTSEL:
+ case LFUN_LEFT:
+ cur.selHandle(cmd.action == LFUN_LEFTSEL);
+ cur.autocorrect() = false;
+ cur.clearTargetX();
+ cur.macroModeClose();
+ if (cur.pos() != 0 && cur.openable(cur.prevAtom())) {
+ cur.posLeft();
+ cur.push(*cur.nextAtom().nucleus());
+ cur.inset().idxLast(cur);
+ } else if (cur.posLeft() || idxLeft(cur)
+ || cur.popLeft() || cur.selection())
+ ;
+ else {
+ cmd = FuncRequest(LFUN_FINISHED_LEFT);
+ cur.undispatched();
+ }
+ break;
+
+ case LFUN_UPSEL:
+ case LFUN_UP:
+ // FIXME Tried to use clearTargetX and macroModeClose, crashed on cur.up()
+ if (cur.inMacroMode()) {
+ // Make Helge happy
+ cur.macroModeClose();
+ break;
+ }
+ cur.selHandle(cmd.action == LFUN_UPSEL);
+ if (!cur.up()) {
+ cmd = FuncRequest(LFUN_FINISHED_UP);
+ cur.undispatched();
+ }
+ // fixes bug 1598. Please check!
+ cur.normalize();
+ break;
+
+ case LFUN_DOWNSEL:
+ case LFUN_DOWN:
+ if (cur.inMacroMode()) {
+ cur.macroModeClose();
+ break;
+ }
+ cur.selHandle(cmd.action == LFUN_DOWNSEL);
+ if (!cur.down()) {
+ cmd = FuncRequest(LFUN_FINISHED_DOWN);
+ cur.undispatched();
+ }
+ // fixes bug 1598. Please check!
+ cur.normalize();
+ break;
+
+ case LFUN_MOUSE_DOUBLE:
+ case LFUN_MOUSE_TRIPLE:
+ case LFUN_WORDSEL:
+ cur.pos() = 0;
+ cur.idx() = 0;
+ cur.resetAnchor();
+ cur.selection() = true;
+ cur.pos() = cur.lastpos();
+ cur.idx() = cur.lastidx();
+ break;
+
+ case LFUN_UP_PARAGRAPHSEL:
+ case LFUN_UP_PARAGRAPH:
+ case LFUN_DOWN_PARAGRAPHSEL:
+ case LFUN_DOWN_PARAGRAPH:
+ break;
+
+ case LFUN_HOMESEL:
+ case LFUN_HOME:
+ case LFUN_WORDLEFTSEL:
+ case LFUN_WORDLEFT:
+ cur.selHandle(cmd.action == LFUN_WORDLEFTSEL || cmd.action == LFUN_HOMESEL);
+ cur.macroModeClose();
+ if (cur.pos() != 0) {
+ cur.pos() = 0;
+ } else if (cur.col() != 0) {
+ cur.idx() -= cur.col();
+ cur.pos() = 0;
+ } else if (cur.idx() != 0) {
+ cur.idx() = 0;
+ cur.pos() = 0;
+ } else {
+ cmd = FuncRequest(LFUN_FINISHED_LEFT);
+ cur.undispatched();
+ }
+ break;
+
+ case LFUN_WORDRIGHTSEL:
+ case LFUN_WORDRIGHT:
+ case LFUN_ENDSEL:
+ case LFUN_END:
+ cur.selHandle(cmd.action == LFUN_WORDRIGHTSEL || cmd.action == LFUN_ENDSEL);
+ cur.macroModeClose();
+ cur.clearTargetX();
+ if (cur.pos() != cur.lastpos()) {
+ cur.pos() = cur.lastpos();
+ } else if (ncols() && (cur.col() != cur.lastcol())) {
+ cur.idx() = cur.idx() - cur.col() + cur.lastcol();
+ cur.pos() = cur.lastpos();
+ } else if (cur.idx() != cur.lastidx()) {
+ cur.idx() = cur.lastidx();
+ cur.pos() = cur.lastpos();
+ } else {
+ cmd = FuncRequest(LFUN_FINISHED_RIGHT);
+ cur.undispatched();
+ }
+ break;
+
+ case LFUN_PRIORSEL:
+ case LFUN_PRIOR:
+ cmd = FuncRequest(LFUN_FINISHED_LEFT);
+ cur.undispatched();
+ break;
+
+ case LFUN_NEXTSEL:
+ case LFUN_NEXT:
+ cmd = FuncRequest(LFUN_FINISHED_RIGHT);
+ cur.undispatched();
+ break;
+
+ case LFUN_CELL_FORWARD:
+ cur.inset().idxNext(cur);
+ break;
+
+ case LFUN_CELL_BACKWARD:
+ cur.inset().idxPrev(cur);
+ break;
+
+ case LFUN_DELETE_WORD_BACKWARD:
+ case LFUN_BACKSPACE:
+ if (cur.pos() == 0)
+ // delete whole cell
+ recordUndoInset(cur, Undo::ATOMIC);
+ else
+ recordUndo(cur, Undo::ATOMIC);
+ cur.backspace();
+ break;
+
+ case LFUN_DELETE_WORD_FORWARD:
+ case LFUN_DELETE:
+ recordUndo(cur);
+ cur.erase();
+ break;
+
+ case LFUN_ESCAPE:
+ if (cur.selection())
+ cur.clearSelection();
+ else {
+ cmd = FuncRequest(LFUN_FINISHED_RIGHT);
+ cur.undispatched();
+ }
+ break;
+
+ case LFUN_INSET_TOGGLE:
+ recordUndo(cur);
+ //lockToggle();
+ if (cur.pos() != cur.lastpos()) {
+ // toggle previous inset ...
+ cur.nextAtom().nucleus()->lock(!cur.nextAtom()->lock());
+ } else if (cur.popLeft() && cur.pos() != cur.lastpos()) {
+ // ... or enclosing inset if we are in the last inset position
+ cur.nextAtom().nucleus()->lock(!cur.nextAtom()->lock());
+ ++cur.pos();
+ }
+ break;
+
+ case LFUN_SELFINSERT:
+ if (cmd.argument.size() != 1) {
+ recordUndo(cur);
+ cur.insert(cmd.argument);
+ break;
+ }
+ // Don't record undo steps if we are in macro mode and
+ // cmd.argument is the next character of the macro name.
+ // Otherwise we'll get an invalid cursor if we undo after
+ // the macro was finished and the macro is a known command,
+ // e.g. sqrt. LCursor::macroModeClose replaces in this case
+ // the MathUnknownInset with name "frac" by an empty
+ // MathFracInset -> a pos value > 0 is invalid.
+ // A side effect is that an undo before the macro is finished
+ // undoes the complete macro, not only the last character.
+ if (!cur.inMacroMode())
+ recordUndo(cur);
+ if (!interpret(cur, cmd.argument[0])) {
+ cmd = FuncRequest(LFUN_FINISHED_RIGHT);
+ cur.undispatched();
+ }
+ break;
+
+ //case LFUN_GETXY:
+ // sprintf(dispatch_buffer, "%d %d",);
+ // break;
+
+ case LFUN_SETXY: {
+ lyxerr << "LFUN_SETXY broken!" << endl;
+ int x = 0;
+ int y = 0;
+ istringstream is(cmd.argument);
+ is >> x >> y;
+ cur.setScreenPos(x, y);
+ break;
+ }
+
+ // Special casing for superscript in case of LyX handling
+ // dead-keys:
+ case LFUN_CIRCUMFLEX:
+ if (cmd.argument.empty()) {
+ // do superscript if LyX handles
+ // deadkeys
+ recordUndo(cur, Undo::ATOMIC);
+ script(cur, true);