]> git.lyx.org Git - lyx.git/blobdiff - src/KeyMap.cpp
- Coding style
[lyx.git] / src / KeyMap.cpp
index 8c28b50031263e981064e2de056da0c0f67c0a11..ffd55c4970a01865515bf71f28a43c550d37fcb8 100644 (file)
@@ -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-";
 
@@ -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);
@@ -263,11 +291,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 +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");
@@ -328,7 +363,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 +381,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 != LFUN_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 " << LFUN_FORMAT << "\n\n";
+
        string tag = unbind ? "\\unbind" : "\\bind";
        BindingList const list = listBindings(false);
        BindingList::const_iterator it = list.begin();
@@ -371,12 +414,12 @@ void KeyMap::write(string const & bind_file, bool append, bool unbind) const
                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();