diff --git a/src/KeyMap.cpp b/src/KeyMap.cpp index 7cc25765ab..3f0407833a 100644 --- a/src/KeyMap.cpp +++ b/src/KeyMap.cpp @@ -85,6 +85,95 @@ size_t KeyMap::unbind(string const & seq, FuncRequest const & func) } +void KeyMap::bind(KeySequence * seq, FuncRequest const & func, unsigned int r) +{ + KeySymbol code = seq->sequence[r]; + if (!code.isOK()) + return; + + KeyModifier const mod1 = seq->modifiers[r].first; + KeyModifier const mod2 = seq->modifiers[r].second; + + // check if key is already there + 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) { + // overwrite binding + if (r + 1 == seq->length()) { + LYXERR(Debug::KBMAP, "Warning: New binding for '" + << to_utf8(seq->print(KeySequence::Portable)) + << "' is overriding old binding..."); + if (it->table.get()) { + it->table.reset(); + } + it->func = func; + it->func.origin = FuncRequest::KEYBOARD; + return; + } else if (!it->table.get()) { + lyxerr << "Error: New binding for '" + << to_utf8(seq->print(KeySequence::Portable)) + << "' is overriding old binding..." + << endl; + return; + } else { + it->table->bind(seq, func, r + 1); + return; + } + } + } + + Table::iterator newone = table.insert(table.end(), Key()); + newone->code = code; + newone->mod = seq->modifiers[r]; + if (r + 1 == seq->length()) { + newone->func = func; + newone->func.origin = FuncRequest::KEYBOARD; + newone->table.reset(); + } else { + newone->table.reset(new KeyMap); + newone->table->bind(seq, func, r + 1); + } +} + + +void KeyMap::unbind(KeySequence * seq, FuncRequest const & func, unsigned int r) +{ + KeySymbol code = seq->sequence[r]; + if (!code.isOK()) + return; + + KeyModifier const mod1 = seq->modifiers[r].first; + KeyModifier const mod2 = seq->modifiers[r].second; + + // check if key is already there + Table::iterator end = table.end(); + Table::iterator remove = end; + for (Table::iterator it = table.begin(); it != end; ++it) { + if (code == it->code + && mod1 == it->mod.first + && mod2 == it->mod.second) { + // remove + if (r + 1 == seq->length()) { + if (it->func == func) { + remove = it; + if (it->table.get()) + it->table.reset(); + } + } else if (it->table.get()) { + it->table->unbind(seq, func, r + 1); + if (it->table->empty()) + remove = it; + return; + } + } + } + if (remove != end) + table.erase(remove); +} + + FuncRequest KeyMap::getBinding(KeySequence const & seq, unsigned int r) { KeySymbol code = seq.sequence[r]; @@ -305,95 +394,6 @@ docstring const KeyMap::print(bool forgui) const } -void KeyMap::bind(KeySequence * seq, FuncRequest const & func, unsigned int r) -{ - KeySymbol code = seq->sequence[r]; - if (!code.isOK()) - return; - - KeyModifier const mod1 = seq->modifiers[r].first; - KeyModifier const mod2 = seq->modifiers[r].second; - - // check if key is already there - 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) { - // overwrite binding - if (r + 1 == seq->length()) { - LYXERR(Debug::KBMAP, "Warning: New binding for '" - << to_utf8(seq->print(KeySequence::Portable)) - << "' is overriding old binding..."); - if (it->table.get()) { - it->table.reset(); - } - it->func = func; - it->func.origin = FuncRequest::KEYBOARD; - return; - } else if (!it->table.get()) { - lyxerr << "Error: New binding for '" - << to_utf8(seq->print(KeySequence::Portable)) - << "' is overriding old binding..." - << endl; - return; - } else { - it->table->bind(seq, func, r + 1); - return; - } - } - } - - Table::iterator newone = table.insert(table.end(), Key()); - newone->code = code; - newone->mod = seq->modifiers[r]; - if (r + 1 == seq->length()) { - newone->func = func; - newone->func.origin = FuncRequest::KEYBOARD; - newone->table.reset(); - } else { - newone->table.reset(new KeyMap); - newone->table->bind(seq, func, r + 1); - } -} - - -void KeyMap::unbind(KeySequence * seq, FuncRequest const & func, unsigned int r) -{ - KeySymbol code = seq->sequence[r]; - if (!code.isOK()) - return; - - KeyModifier const mod1 = seq->modifiers[r].first; - KeyModifier const mod2 = seq->modifiers[r].second; - - // check if key is already there - Table::iterator end = table.end(); - Table::iterator remove = end; - for (Table::iterator it = table.begin(); it != end; ++it) { - if (code == it->code - && mod1 == it->mod.first - && mod2 == it->mod.second) { - // remove - if (r + 1 == seq->length()) { - if (it->func == func) { - remove = it; - if (it->table.get()) - it->table.reset(); - } - } else if (it->table.get()) { - it->table->unbind(seq, func, r + 1); - if (it->table->empty()) - remove = it; - return; - } - } - } - if (remove != end) - table.erase(remove); -} - - docstring KeyMap::printBindings(FuncRequest const & func, KeySequence::outputFormat format) const {