X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fkbmap.C;h=d2492e73096562303a0d39e2c6e11569144ece70;hb=b9963e1a57135c3e2ab128a9ec4300f0e4886992;hp=81fb7060685d091d118f8d65ca3b1e0b46368f77;hpb=500fa5f5912440de5cc5f1dcb75955f4b09b9e50;p=lyx.git diff --git a/src/kbmap.C b/src/kbmap.C index 81fb706068..d2492e7309 100644 --- a/src/kbmap.C +++ b/src/kbmap.C @@ -24,6 +24,8 @@ #include "support/filetools.h" +#include + using lyx::support::i18nLibFileSearch; using std::endl; @@ -112,7 +114,7 @@ bool kb_keymap::read(string const & bind_file) lyxerr[Debug::KBMAP] << "Reading bind file:" << tmp << endl; bool error = false; - while (!error && lexrc.isOK()) { + while (lexrc.isOK()) { switch (lexrc.lex()) { case LyXLex::LEX_UNDEF: lexrc.printError("Unknown tag `$$Token'"); @@ -154,7 +156,7 @@ bool kb_keymap::read(string const & bind_file) case BN_BINDFILE: if (lexrc.next()) { string const tmp(lexrc.getString()); - error = !read(tmp); + error |= !read(tmp); } else { lexrc.printError("BN_BINDFILE: Missing file name"); error = true; @@ -253,6 +255,7 @@ void kb_keymap::defkey(kb_sequence * seq, it->table.reset(); } it->func = func; + it->func.origin = FuncRequest::KEYBOARD; return; } else if (!it->table.get()) { lyxerr << "Error: New binding for '" << seq->print() @@ -271,6 +274,7 @@ void kb_keymap::defkey(kb_sequence * seq, newone->mod = seq->modifiers[r]; if (r + 1 == seq->length()) { newone->func = func; + newone->func.origin = FuncRequest::KEYBOARD; newone->table.reset(); return; } else { @@ -281,26 +285,60 @@ void kb_keymap::defkey(kb_sequence * seq, } -string const kb_keymap::findbinding(FuncRequest const & func, - string const & prefix) const +string const kb_keymap::printbindings(FuncRequest const & func) const +{ + std::ostringstream res; + Bindings bindings = findbindings(func); + for (Bindings::const_iterator cit = bindings.begin(); + cit != bindings.end() ; ++cit) + res << '[' << cit->print() << ']'; + return res.str(); +} + + +kb_keymap::Bindings +kb_keymap::findbindings(FuncRequest const & func) const +{ + return findbindings(func, kb_sequence(0, 0)); +} + + +kb_keymap::Bindings +kb_keymap::findbindings(FuncRequest const & func, + kb_sequence const & prefix) const { - string res; + Bindings res; if (table.empty()) return res; Table::const_iterator end = table.end(); for (Table::const_iterator cit = table.begin(); cit != end; ++cit) { if (cit->table.get()) { - res += cit->table->findbinding(func, - prefix - + printKey((*cit)) - + ' '); + kb_sequence seq = prefix; + seq.addkey(cit->code, cit->mod.first); + Bindings res2 = + cit->table->findbindings(func, seq); + res.insert(res.end(), res2.begin(), res2.end()); } else if (cit->func == func) { - res += '['; - res += prefix + printKey((*cit)); - res += "] "; + kb_sequence seq = prefix; + seq.addkey(cit->code, cit->mod.first); + res.push_back(seq); } } return res; } + + +std::pair +kb_keymap::find1keybinding(FuncRequest const & func) const +{ + Table::const_iterator end = table.end(); + for (Table::const_iterator cit = table.begin(); + cit != end; ++cit) { + if (!cit->table.get() && cit->func == func) + return std::make_pair(cit->code.get(), cit->mod.first); + } + + return std::make_pair(0, key_modifier::none); +}