]> git.lyx.org Git - lyx.git/blobdiff - src/KeyMap.cpp
Merge branch 'master' of git.lyx.org:lyx
[lyx.git] / src / KeyMap.cpp
index 70848610974019144af464a55f1481d8a74e385e..32f99265dd779106d2ab4626a784b460d5672938 100644 (file)
@@ -25,6 +25,7 @@
 #include "support/filetools.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
+#include "support/TempFile.h"
 
 #include "frontends/alert.h"
 
@@ -37,11 +38,6 @@ 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)
 {
        string buf;
@@ -50,8 +46,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-";
 
@@ -103,6 +106,8 @@ void KeyMap::bind(KeySequence * seq, FuncRequest const & func, unsigned int r)
        KeyModifier const mod2 = seq->modifiers[r].second;
 
        // check if key is already there
+       // FIXME perf: Profiling shows that this is responsible of 99% of the
+       // cost of GuiPrefs::applyView()
        Table::iterator end = table.end();
        for (Table::iterator it = table.begin(); it != end; ++it) {
                if (code == it->code
@@ -113,13 +118,12 @@ void KeyMap::bind(KeySequence * seq, FuncRequest const & func, unsigned int r)
                                LYXERR(Debug::KBMAP, "Warning: New binding for '"
                                        << to_utf8(seq->print(KeySequence::Portable))
                                        << "' is overriding old binding...");
-                               if (it->prefixes.get()) {
+                               if (it->prefixes)
                                        it->prefixes.reset();
-                               }
                                it->func = func;
                                it->func.setOrigin(FuncRequest::KEYBOARD);
                                return;
-                       } else if (!it->prefixes.get()) {
+                       } else if (!it->prefixes) {
                                lyxerr << "Error: New binding for '"
                                       << to_utf8(seq->print(KeySequence::Portable))
                                       << "' is overriding old binding..."
@@ -166,10 +170,10 @@ void KeyMap::unbind(KeySequence * seq, FuncRequest const & func, unsigned int r)
                        if (r + 1 == seq->length()) {
                                if (it->func == func) {
                                        remove = it;
-                                       if (it->prefixes.get())
+                                       if (it->prefixes)
                                                it->prefixes.reset();
                                }
-                       } else if (it->prefixes.get()) {
+                       } else if (it->prefixes) {
                                it->prefixes->unbind(seq, func, r + 1);
                                if (it->prefixes->empty())
                                        remove = it;
@@ -199,7 +203,7 @@ FuncRequest KeyMap::getBinding(KeySequence const & seq, unsigned int r)
                    && mod2 == it->mod.second) {
                        if (r + 1 == seq.length())
                                return it->func;
-                       else if (it->prefixes.get())
+                       else if (it->prefixes)
                                return it->prefixes->getBinding(seq, r + 1);
                }
        }
@@ -252,16 +256,16 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map)
        if (retval != FormatMismatch)
                return retval == ReadOK;
 
-       LYXERR(Debug::FILES, "Converting bind file to " << BIND_FORMAT);
-       FileName const tempfile = FileName::tempName("convert_bind");
+       LYXERR(Debug::FILES, "Converting bind file to " << LFUN_FORMAT);
+       TempFile tmp("convert_bind");
+       FileName const tempfile = tmp.name();
        bool const success = prefs2prefs(bind_file, tempfile, true);
        if (!success) {
                LYXERR0 ("Unable to convert " << bind_file <<
-                       " to format " << BIND_FORMAT);
+                       " to format " << LFUN_FORMAT);
                return false;
        }
        retval = readWithoutConv(tempfile, unbind_map);
-       tempfile.removeFile();
        return retval == ReadOK;
 }
 
@@ -382,7 +386,7 @@ KeyMap::ReturnValues KeyMap::readWithoutConv(FileName const & bind_file, KeyMap
 
                // This is triggered the first time through the loop unless
                // we hit a format tag.
-               if (format != BIND_FORMAT)
+               if (format != LFUN_FORMAT)
                        return FormatMismatch;
        }
 
@@ -402,7 +406,7 @@ void KeyMap::write(string const & bind_file, bool append, bool unbind) const
        if (!append)
                os << "## This file is automatically generated by lyx\n"
                   << "## All modifications will be lost\n\n"
-                  << "Format " << BIND_FORMAT << "\n\n";
+                  << "Format " << LFUN_FORMAT << "\n\n";
 
        string tag = unbind ? "\\unbind" : "\\bind";
        BindingList const list = listBindings(false);
@@ -439,10 +443,10 @@ FuncRequest const & KeyMap::lookup(KeySymbol const &key,
 
                if (cit->code == key && cit->mod.first == check) {
                        // match found
-                       if (cit->prefixes.get()) {
+                       if (cit->prefixes) {
                                // this is a prefix key - set new map
                                seq->curmap = cit->prefixes.get();
-                               static FuncRequest prefix(LFUN_COMMAND_PREFIX);
+                               static const FuncRequest prefix(LFUN_COMMAND_PREFIX);
                                return prefix;
                        } else {
                                // final key - reset map
@@ -505,7 +509,7 @@ KeyMap::Bindings KeyMap::findBindings(FuncRequest const & func,
 
        Table::const_iterator end = table.end();
        for (Table::const_iterator cit = table.begin(); cit != end; ++cit) {
-               if (cit->prefixes.get()) {
+               if (cit->prefixes) {
                        KeySequence seq = prefix;
                        seq.addkey(cit->code, cit->mod.first);
                        Bindings res2 = cit->prefixes->findBindings(func, seq);
@@ -553,7 +557,7 @@ void KeyMap::listBindings(BindingList & list,
        Table::const_iterator it_end = table.end();
        for (; it != it_end; ++it) {
                // a LFUN_COMMAND_PREFIX
-               if (it->prefixes.get()) {
+               if (it->prefixes) {
                        KeySequence seq = prefix;
                        seq.addkey(it->code, it->mod.first);
                        it->prefixes->listBindings(list, seq, tag);