Patch below works for me. Justification: just because the inset wants to lose the focus lock (FINISHED*) doesn't mean that the func is DISPATCHED. If this is no good, then we need to split the state into two, one for FINISHED* and one for (UN)DISPATCHED thanks john Index: lyxfunc.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxfunc.C,v retrieving revision 1.256 diff -u -r1.256 lyxfunc.C --- lyxfunc.C 2001/08/19 19:53:54 1.256 +++ lyxfunc.C 2001/08/31 23:03:35 @@ -871,26 +871,23 @@ (result == UpdatableInset::DISPATCHED_NOUPDATE)) return string(); else if (result == UpdatableInset::FINISHED) { - if (TEXT()->cursor.par()->isRightToLeftPar(owner->buffer()->params)) { - TEXT()->cursorRight(owner->view()); - moveCursorUpdate(true, false); - owner->showState(); - } - return string(); + if +(TEXT()->cursor.par()->isRightToLeftPar(owner->buffer()->params)) { + TEXT()->cursorRight(owner->view()); + moveCursorUpdate(true, false); + owner->showState(); + } } else if (result == UpdatableInset::FINISHED_RIGHT) { if (!TEXT()->cursor.par()->isRightToLeftPar(owner->buffer()->params)) { TEXT()->cursorRight(owner->view()); moveCursorUpdate(true, false); owner->showState(); } - return string(); } else if (result == UpdatableInset::FINISHED_UP) { if (TEXT()->cursor.row()->previous()) { TEXT()->cursorUp(owner->view()); moveCursorUpdate(true, false); owner->showState(); } - return string(); } else if (result == UpdatableInset::FINISHED_DOWN) { if (TEXT()->cursor.row()->next()) TEXT()->cursorDown(owner->view()); @@ -898,7 +895,6 @@ TEXT()->cursorRight(owner->view()); moveCursorUpdate(true, false); owner->showState(); - return string(); } else { //setMessage(N_("Text mode")); switch (action) {