From f05e76c330f5745ccd83d76a06cf64225be19390 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Sun, 16 Jan 2011 19:53:36 +0000 Subject: [PATCH] Conversion routines for bind files. All the LFUNs listed in the release notes should be properly converted. If not, then changes should be made to the file: lib/scripts/prefs2prefs-lfuns.py git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@37231 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/KeyMap.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++------- src/KeyMap.h | 8 ++++++++ 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/KeyMap.cpp b/src/KeyMap.cpp index 091bf89327..8d51d77462 100644 --- a/src/KeyMap.cpp +++ b/src/KeyMap.cpp @@ -37,6 +37,10 @@ using namespace lyx::support; namespace lyx { +namespace { + // current format of bind files + static unsigned int const BIND_FORMAT = 1; +} string const KeyMap::printKeySym(KeySymbol const & key, KeyModifier mod) { @@ -243,10 +247,32 @@ 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 " << BIND_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 " << BIND_FORMAT); + return false; + } + retval = readWithoutConv(tempfile, unbind_map); + //tempfile.removeFile(); + return retval == ReadOK; + return true; +} + + +KeyMap::ReturnValues KeyMap::readWithoutConv(FileName const & bind_file, KeyMap * unbind_map) { enum { BN_BIND, BN_BINDFILE, + BN_FORMAT, BN_UNBIND }; @@ -254,6 +280,7 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map) { "\\bind", BN_BIND }, { "\\bind_file", BN_BINDFILE }, { "\\unbind", BN_UNBIND }, + { "format", BN_FORMAT } }; Lexer lexrc(bindTags); @@ -263,11 +290,13 @@ 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; + return FileError; } 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 +309,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"); @@ -328,7 +362,7 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map) error = true; break; } - + if (unbind_map) unbind_map->bind(seq, func); else @@ -346,23 +380,31 @@ 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 != BIND_FORMAT) + return FormatMismatch; } - if (error) + if (error) { LYXERR0("KeyMap::read: error while reading bind file:" << bind_file.absFileName()); - return !error; + 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 " << BIND_FORMAT << "\n\n"; + string tag = unbind ? "\\unbind" : "\\bind"; BindingList const list = listBindings(false); BindingList::const_iterator it = list.begin(); diff --git a/src/KeyMap.h b/src/KeyMap.h index e2d0f3aac0..cd28782356 100644 --- a/src/KeyMap.h +++ b/src/KeyMap.h @@ -168,8 +168,16 @@ private: FuncRequest func; }; + enum ReturnValues { + ReadOK, + ReadError, + FileError, + FormatMismatch + }; /// bool read(support::FileName const & bind_file, KeyMap * unbind_map = 0); + /// + ReturnValues readWithoutConv(support::FileName const & bind_file, KeyMap * unbind_map = 0); /** * Given an action, find all keybindings