From: André Pönitz Date: Thu, 4 Apr 2002 10:11:13 +0000 (+0000) Subject: fix bug that disabled entering 'special char macros' like \, and \: X-Git-Tag: 1.6.10~19506 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=12f082c3ba3d4e0924a518bcb22d2e3e05b01d2c;p=features.git fix bug that disabled entering 'special char macros' like \, and \: git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@3898 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/mathed/formulabase.C b/src/mathed/formulabase.C index 3636d9b6c0..68d1189bfd 100644 --- a/src/mathed/formulabase.C +++ b/src/mathed/formulabase.C @@ -155,10 +155,9 @@ string const InsetFormulaBase::editMessage() const } -void InsetFormulaBase::edit(BufferView * bv, int x, int y, unsigned int -button) +void InsetFormulaBase::edit(BufferView * bv, int x, int /*y*/, unsigned int) { - lyxerr << "edit: " << x << " " << y << " button: " << button << "\n"; + //lyxerr << "edit: " << x << " " << y << " button: " << button << "\n"; if (!bv->lockInset(this)) lyxerr[Debug::MATHED] << "Cannot lock inset!!!" << endl; @@ -685,7 +684,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, case LFUN_INSET_ERT: // interpret this as if a backslash was typed bv->lockedInsetStoreUndo(Undo::EDIT); - mathcursor->interpret("\\"); + mathcursor->interpret('\\'); updateLocal(bv, true); break; @@ -694,7 +693,10 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action, case LFUN_SELFINSERT: if (!arg.empty()) { bv->lockedInsetStoreUndo(Undo::EDIT); - result = mathcursor->interpret(arg) ? DISPATCHED : FINISHED_RIGHT; + if (arg.size() == 1) + result = mathcursor->interpret(arg[0]) ? DISPATCHED : FINISHED_RIGHT; + else + result = mathcursor->interpret(arg) ? DISPATCHED : FINISHED_RIGHT; updateLocal(bv, true); } break; diff --git a/src/mathed/math_cursor.C b/src/mathed/math_cursor.C index 4280c68ebe..ba00fe0e75 100644 --- a/src/mathed/math_cursor.C +++ b/src/mathed/math_cursor.C @@ -1333,9 +1333,6 @@ bool MathCursor::interpret(string const & s) if (s.empty()) return true; - if (s.size() == 1) - return interpret(s[0]); - //lyxerr << "char: '" << s[0] << "' int: " << int(s[0]) << endl; //owner_->getIntl()->getTrans().TranslateAndInsert(s[0], lt); //lyxerr << "trans: '" << s[0] << "' int: " << int(s[0]) << endl; @@ -1375,9 +1372,11 @@ bool MathCursor::interpret(string const & s) return true; } - if (s == "\\over" || s == "\\choose" || s == "\\atop") { + string name = s.substr(1); + + if (name == "over" || name == "choose" || name == "atop") { MathArray ar = array(); - MathAtom t(createMathInset(s.substr(1))); + MathAtom t(createMathInset(name)); t->asNestInset()->cell(0).swap(array()); pos() = 0; niceInsert(t); @@ -1386,7 +1385,7 @@ bool MathCursor::interpret(string const & s) return true; } - latexkeys const * l = in_word_set(s.substr(1)); + latexkeys const * l = in_word_set(name); if (l && (l->token == LM_TK_FONT || l->token == LM_TK_OLDFONT)) { lastcode_ = static_cast(l->id); return true; @@ -1394,13 +1393,13 @@ bool MathCursor::interpret(string const & s) // prevent entering of recursive macros if (formula()->lyxCode() == Inset::MATHMACRO_CODE - && formula()->getInsetName() == s.substr(1)) + && formula()->getInsetName() == name) { lyxerr << "can't enter recursive macro\n"; return true; } - niceInsert(createMathInset(s.substr(1))); + niceInsert(createMathInset(name)); return true; } @@ -1434,6 +1433,7 @@ bool MathCursor::script(bool up) bool MathCursor::interpret(char c) { + //lyxerr << "interpret 2: '" << c << "'\n"; if (inMacroArgMode()) { --pos(); plainErase(); @@ -1451,28 +1451,34 @@ bool MathCursor::interpret(char c) // handle macroMode if (inMacroMode()) { string name = macroName(); + //lyxerr << "interpret name: '" << name << "'\n"; - if (name == "\\" && c == '\\') { - backspace(); - interpret("\\backslash"); - return true; - } - + // extend macro name if possible if (isalpha(c)) { insert(c, LM_TC_TEX); return true; } - macroModeClose(); - - if (c == '{' || c == '}') { - insert(MathAtom(new MathSpecialCharInset(c))); + // leave macro mode if explicitly requested + if (c == ' ') { + macroModeClose(); return true; } - if (c != ' ') - interpret(c); + // handle 'special char' macros + if (name == "\\") { + // remove the '\\' + backspace(); + if (c == '\\') + interpret("\\backslash"); + else + interpret(string("\\") + c); + return true; + } + // leave macro mode and try again + macroModeClose(); + interpret(c); return true; }