X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fkbmap.C;h=7f8fd03116cc0706cd6fd0759595f7026e1c4b7e;hb=c544107e324090c6eafb4c56749da2624b9b1122;hp=ba419f3be2109a1e93aff7cb334a05df3472c2de;hpb=54d9f7c0226270970adf03a233096829f43bc944;p=lyx.git diff --git a/src/kbmap.C b/src/kbmap.C index ba419f3be2..7f8fd03116 100644 --- a/src/kbmap.C +++ b/src/kbmap.C @@ -12,9 +12,13 @@ #include "kbmap.h" #include "lfuns.h" #include "kbsequence.h" +#include "LyXAction.h" +#include "support/filetools.h" +#include "lyxlex.h" #include "debug.h" using std::endl; +using lyx::support::i18nLibFileSearch; string const kb_keymap::printKeysym(LyXKeySymPtr key, key_modifier::state mod) @@ -23,13 +27,18 @@ string const kb_keymap::printKeysym(LyXKeySymPtr key, string const s = key->getSymbolName(); - if (mod & key_modifier::shift) buf += "S-"; - if (mod & key_modifier::ctrl) buf += "C-"; - if (mod & key_modifier::alt) buf += "M-"; + if (mod & key_modifier::shift) + buf += "S-"; + if (mod & key_modifier::ctrl) + buf += "C-"; + if (mod & key_modifier::alt) + buf += "M-"; + buf += s; return buf; } + string const kb_keymap::printKey(kb_key const & key) const { return printKeysym(key.code, key.mod.first); @@ -59,6 +68,100 @@ string::size_type kb_keymap::bind(string const & seq, int action) } +namespace { + +enum BindTags { + BN_BIND, + BN_BINDFILE +}; + +keyword_item bindTags[] = { + { "\\bind", BN_BIND }, + { "\\bind_file", BN_BINDFILE } +}; + +} + + +bool kb_keymap::read(string const & bind_file) +{ + const int bindCount = sizeof(bindTags) / sizeof(keyword_item); + + LyXLex lexrc(bindTags, bindCount); + if (lyxerr.debugging(Debug::PARSER)) + lexrc.printTable(lyxerr); + + string const tmp = i18nLibFileSearch("bind", bind_file, "bind"); + lexrc.setFile(tmp); + if (!lexrc.isOK()) { + lyxerr << "kb_keymap::read: cannot open bind file:" + << tmp << endl; + return false; + } + + lyxerr[Debug::KBMAP] << "Reading bind file:" << tmp << endl; + + bool error = false; + while (!error && lexrc.isOK()) { + switch (lexrc.lex()) { + case LyXLex::LEX_UNDEF: + lexrc.printError("Unknown tag `$$Token'"); + error = true; + continue; + case LyXLex::LEX_FEOF: + continue; + case BN_BIND: + { + string seq, cmd; + + if (lexrc.next()) { + seq = lexrc.getString(); + } else { + lexrc.printError("BN_BIND: Missing key sequence"); + error = true; + break; + } + + if (lexrc.next(true)) { + cmd = lexrc.getString(); + } else { + lexrc.printError("BN_BIND: missing command"); + error = true; + break; + } + + int action = lyxaction.LookupFunc(cmd); + if (!action == LFUN_UNKNOWN_ACTION) { + lexrc.printError("BN_BIND: Unknown LyX" + " function `$$Token'"); + error = true; + break; + } + + bind(seq, kb_action(action)); + break; + } + case BN_BINDFILE: + if (lexrc.next()) { + string const tmp(lexrc.getString()); + error = !read(tmp); + } else { + lexrc.printError("BN_BINDFILE: Missing file name"); + error = true; + break; + + } + break; + } + } + + if (error) + lyxerr << "kb_keymap::read: error while reading bind file:" + << tmp << endl; + return !error; +} + + int kb_keymap::lookup(LyXKeySymPtr key, key_modifier::state mod, kb_sequence * seq) const { @@ -68,8 +171,8 @@ int kb_keymap::lookup(LyXKeySymPtr key, return LFUN_UNKNOWN_ACTION; } - for (Table::const_iterator cit = table.begin(); - cit != table.end(); ++cit) { + Table::const_iterator end = table.end(); + for (Table::const_iterator cit = table.begin(); cit != end; ++cit) { key_modifier::state mask(cit->mod.second); key_modifier::state check = static_cast(mod & ~mask); @@ -99,8 +202,8 @@ int kb_keymap::lookup(LyXKeySymPtr key, string const kb_keymap::print() const { string buf; - for (Table::const_iterator cit = table.begin(); - cit != table.end(); ++cit) { + Table::const_iterator end = table.end(); + for (Table::const_iterator cit = table.begin(); cit != end; ++cit) { buf += printKey((*cit)); buf += ' '; } @@ -118,7 +221,8 @@ void kb_keymap::defkey(kb_sequence * seq, int action, unsigned int r) key_modifier::state const mod2 = seq->modifiers[r].second; // check if key is already there - for (Table::iterator it = table.begin(); it != table.end(); ++it) { + Table::iterator end = table.end(); + for (Table::iterator it = table.begin(); it != end; ++it) { if (*(code) == *(it->code) && mod1 == it->mod.first && mod2 == it->mod.second) {