Author: rgheck
Date: Sun Jan 16 20:53:36 2011
New Revision: 37231
URL: http://www.lyx.org/trac/changeset/37231

Log:
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

Modified:
   lyx-devel/trunk/src/KeyMap.cpp
   lyx-devel/trunk/src/KeyMap.h

Modified: lyx-devel/trunk/src/KeyMap.cpp
==============================================================================
--- lyx-devel/trunk/src/KeyMap.cpp      Sun Jan 16 20:51:02 2011        (r37230)
+++ lyx-devel/trunk/src/KeyMap.cpp      Sun Jan 16 20:53:36 2011        (r37231)
@@ -37,6 +37,10 @@
 
 namespace lyx {
 
+namespace {
+       // current format of bind files
+       static unsigned int const BIND_FORMAT = 1;
+}
 
 string const KeyMap::printKeySym(KeySymbol const & key, KeyModifier mod)
 {
@@ -244,9 +248,31 @@
 
 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 @@
                { "\\bind",      BN_BIND },
                { "\\bind_file", BN_BINDFILE },
                { "\\unbind",    BN_UNBIND },
+               { "format",      BN_FORMAT }
        };
 
        Lexer lexrc(bindTags);
@@ -263,11 +290,13 @@
        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 @@
                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 @@
                                error = true;
                                break;
                        }
-                       
+
                        if (unbind_map)
                                unbind_map->bind(seq, func);
                        else
@@ -346,23 +380,31 @@
                        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();

Modified: lyx-devel/trunk/src/KeyMap.h
==============================================================================
--- lyx-devel/trunk/src/KeyMap.h        Sun Jan 16 20:51:02 2011        (r37230)
+++ lyx-devel/trunk/src/KeyMap.h        Sun Jan 16 20:53:36 2011        (r37231)
@@ -168,8 +168,16 @@
                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

Reply via email to