X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FKeyMap.cpp;h=ffd55c4970a01865515bf71f28a43c550d37fcb8;hb=9e57044ff18ea1e83471f549011bba205ca584ab;hp=2bb5c091948f67168bc33c025cf24375591e446c;hpb=4c7a5d00245799695ea81aa0192151eed8f9c5fb;p=lyx.git diff --git a/src/KeyMap.cpp b/src/KeyMap.cpp index 2bb5c09194..ffd55c4970 100644 --- a/src/KeyMap.cpp +++ b/src/KeyMap.cpp @@ -37,7 +37,6 @@ using namespace lyx::support; namespace lyx { - string const KeyMap::printKeySym(KeySymbol const & key, KeyModifier mod) { string buf; @@ -46,8 +45,15 @@ string const KeyMap::printKeySym(KeySymbol const & key, KeyModifier mod) if (mod & ControlModifier) buf += "C-"; +#if defined(USE_MACOSX_PACKAGING) || defined(USE_META_KEYBINDING) + if (mod & MetaModifier) + buf += "M-"; + if (mod & AltModifier) + buf += "A-"; +#else if (mod & AltModifier) buf += "M-"; +#endif if (mod & ShiftModifier) buf += "S-"; @@ -59,7 +65,7 @@ string const KeyMap::printKeySym(KeySymbol const & key, KeyModifier mod) size_t KeyMap::bind(string const & seq, FuncRequest const & func) { LYXERR(Debug::KBMAP, "BIND: Sequence `" << seq << "' Action `" - << func.action_ << '\''); + << func.action() << '\''); KeySequence k(0, 0); @@ -113,7 +119,7 @@ void KeyMap::bind(KeySequence * seq, FuncRequest const & func, unsigned int r) it->prefixes.reset(); } it->func = func; - it->func.origin_ = FuncRequest::KEYBOARD; + it->func.setOrigin(FuncRequest::KEYBOARD); return; } else if (!it->prefixes.get()) { lyxerr << "Error: New binding for '" @@ -133,7 +139,7 @@ void KeyMap::bind(KeySequence * seq, FuncRequest const & func, unsigned int r) newone->mod = seq->modifiers[r]; if (r + 1 == seq->length()) { newone->func = func; - newone->func.origin_ = FuncRequest::KEYBOARD; + newone->func.setOrigin(FuncRequest::KEYBOARD); newone->prefixes.reset(); } else { newone->prefixes.reset(new KeyMap); @@ -243,17 +249,39 @@ bool KeyMap::read(string const & bind_file, KeyMap * unbind_map, BindReadType rt bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map) +{ + ReturnValues retval = readWithoutConv(bind_file, unbind_map); + if (retval != FormatMismatch) + return retval == ReadOK; + + LYXERR(Debug::FILES, "Converting bind file to " << LFUN_FORMAT); + FileName const tempfile = FileName::tempName("convert_bind"); + bool const success = prefs2prefs(bind_file, tempfile, true); + if (!success) { + LYXERR0 ("Unable to convert " << bind_file << + " to format " << LFUN_FORMAT); + return false; + } + retval = readWithoutConv(tempfile, unbind_map); + tempfile.removeFile(); + return retval == ReadOK; +} + + +KeyMap::ReturnValues KeyMap::readWithoutConv(FileName const & bind_file, KeyMap * unbind_map) { enum { BN_BIND, BN_BINDFILE, - BN_UNBIND, + BN_FORMAT, + BN_UNBIND }; LexerKeyword bindTags[] = { { "\\bind", BN_BIND }, { "\\bind_file", BN_BINDFILE }, { "\\unbind", BN_UNBIND }, + { "format", BN_FORMAT } }; Lexer lexrc(bindTags); @@ -262,12 +290,14 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map) lexrc.setFile(bind_file); if (!lexrc.isOK()) { - LYXERR0("KeyMap::read: cannot open bind file:" << bind_file.absFilename()); - return false; + LYXERR0("KeyMap::read: cannot open bind file:" << bind_file.absFileName()); + return FileError; } - LYXERR(Debug::KBMAP, "Reading bind file:" << bind_file.absFilename()); + LYXERR(Debug::KBMAP, "Reading bind file:" << bind_file.absFileName()); + // format of pre-2.0 bind files, before this tag was introduced. + unsigned int format = 0; bool error = false; while (lexrc.isOK()) { switch (lexrc.lex()) { @@ -280,6 +310,11 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map) case Lexer::LEX_FEOF: continue; + case BN_FORMAT: + if (lexrc.next()) + format = lexrc.getInteger(); + break; + case BN_BIND: { if (!lexrc.next()) { lexrc.printError("BN_BIND: Missing key sequence"); @@ -296,7 +331,7 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map) string cmd = lexrc.getString(); FuncRequest func = lyxaction.lookupFunc(cmd); - if (func.action_ == LFUN_UNKNOWN_ACTION) { + if (func.action() == LFUN_UNKNOWN_ACTION) { lexrc.printError("BN_BIND: Unknown LyX function `$$Token'"); error = true; break; @@ -322,13 +357,13 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map) string cmd = lexrc.getString(); FuncRequest func = lyxaction.lookupFunc(cmd); - if (func.action_ == LFUN_UNKNOWN_ACTION) { + if (func.action() == LFUN_UNKNOWN_ACTION) { lexrc.printError("BN_UNBIND: Unknown LyX" " function `$$Token'"); error = true; break; } - + if (unbind_map) unbind_map->bind(seq, func); else @@ -346,37 +381,45 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map) error |= !read(tmp, unbind_map); break; } + + // This is triggered the first time through the loop unless + // we hit a format tag. + if (format != LFUN_FORMAT) + return FormatMismatch; } - if (error) - LYXERR0("KeyMap::read: error while reading bind file:" << bind_file.absFilename()); - return !error; + if (error) { + LYXERR0("KeyMap::read: error while reading bind file:" << bind_file.absFileName()); + return ReadError; + } + return ReadOK; } void KeyMap::write(string const & bind_file, bool append, bool unbind) const { - ofstream os(bind_file.c_str(), + ofstream os(bind_file.c_str(), append ? (ios::app | ios::out) : ios::out); if (!append) os << "## This file is automatically generated by lyx\n" - << "## All modifications will be lost\n\n"; - + << "## All modifications will be lost\n\n" + << "Format " << LFUN_FORMAT << "\n\n"; + string tag = unbind ? "\\unbind" : "\\bind"; BindingList const list = listBindings(false); BindingList::const_iterator it = list.begin(); BindingList::const_iterator it_end = list.end(); for (; it != it_end; ++it) { - FuncCode action = it->request.action_; + FuncCode action = it->request.action(); string arg = to_utf8(it->request.argument()); + string const cmd = lyxaction.getActionName(action) + + (arg.empty() ? string() : " " + arg) ; os << tag << " \"" - << to_utf8(it->sequence.print(KeySequence::BindFile)) - << "\" \"" - << lyxaction.getActionName(action) - << (arg.empty() ? "" : " ") << arg - << "\"\n"; + << to_utf8(it->sequence.print(KeySequence::BindFile)) + << "\" " << Lexer::quoteString(cmd) + << "\n"; } os << "\n"; os.close(); @@ -493,7 +536,7 @@ KeyMap::BindingList KeyMap::listBindings(bool unbound, KeyMap::ItemType tag) con BindingList::const_iterator bit = list.begin(); BindingList::const_iterator const ben = list.end(); for (; bit != ben; ++bit) - if (bit->request.action_ == action) { + if (bit->request.action() == action) { has_action = true; break; }