]> git.lyx.org Git - lyx.git/blobdiff - src/kbmap.C
fix bug 2089: Touching Navigate menu crashes Lyx when a TOC inset is in a section...
[lyx.git] / src / kbmap.C
index e494868c77e305b044a4a80e4c0cd93a55acfd97..32fbdfd1c457bffae6aa06317deeb459b98f8f69 100644 (file)
@@ -24,6 +24,8 @@
 
 #include "support/filetools.h"
 
+#include <sstream>
+
 using lyx::support::i18nLibFileSearch;
 
 using std::endl;
@@ -253,6 +255,7 @@ void kb_keymap::defkey(kb_sequence * seq,
                                        it->table.reset();
                                }
                                it->func = func;
+                               it->func.origin = FuncRequest::KEYBOARD;
                                return;
                        } else if (!it->table.get()) {
                                lyxerr << "Error: New binding for '" << seq->print()
@@ -281,26 +284,60 @@ void kb_keymap::defkey(kb_sequence * seq,
 }
 
 
-string const kb_keymap::findbinding(FuncRequest const & func,
-                                   string const & prefix) const
+string const kb_keymap::printbindings(FuncRequest const & func) const
+{
+       std::ostringstream res;
+       Bindings bindings = findbindings(func);
+       for (Bindings::const_iterator cit = bindings.begin();
+            cit != bindings.end() ; ++cit)
+               res << '[' << cit->print() << ']';
+       return res.str();
+}
+
+
+kb_keymap::Bindings
+kb_keymap::findbindings(FuncRequest const & func) const
+{
+       return findbindings(func, kb_sequence(0, 0));
+}
+
+
+kb_keymap::Bindings
+kb_keymap::findbindings(FuncRequest const & func,
+                       kb_sequence const & prefix) const
 {
-       string res;
+       Bindings res;
        if (table.empty()) return res;
 
        Table::const_iterator end = table.end();
        for (Table::const_iterator cit = table.begin();
            cit != end; ++cit) {
                if (cit->table.get()) {
-                       res += cit->table->findbinding(func,
-                                                      prefix
-                                                      + printKey((*cit))
-                                                      + ' ');
+                       kb_sequence seq = prefix;
+                       seq.addkey(cit->code, cit->mod.first);
+                       Bindings res2 =
+                               cit->table->findbindings(func, seq);
+                       res.insert(res.end(), res2.begin(), res2.end());
                } else if (cit->func == func) {
-                       res += '[';
-                       res += prefix + printKey((*cit));
-                       res += "] ";
+                       kb_sequence seq = prefix;
+                       seq.addkey(cit->code, cit->mod.first);
+                       res.push_back(seq);
                }
        }
 
        return res;
 }
+
+
+std::pair<LyXKeySym const *, key_modifier::state>
+kb_keymap::find1keybinding(FuncRequest const & func) const
+{
+       Table::const_iterator end = table.end();
+       for (Table::const_iterator cit = table.begin();
+           cit != end; ++cit) {
+               if (!cit->table.get() && cit->func == func)
+                       return std::make_pair(cit->code.get(), cit->mod.first);
+       }
+
+       return std::make_pair<LyXKeySym const *, key_modifier::state>(0, key_modifier::none);
+}