]> git.lyx.org Git - lyx.git/blobdiff - src/kbmap.C
Make enter button work in GTK text dialog
[lyx.git] / src / kbmap.C
index 81fb7060685d091d118f8d65ca3b1e0b46368f77..d2492e73096562303a0d39e2c6e11569144ece70 100644 (file)
@@ -24,6 +24,8 @@
 
 #include "support/filetools.h"
 
+#include <sstream>
+
 using lyx::support::i18nLibFileSearch;
 
 using std::endl;
@@ -112,7 +114,7 @@ bool kb_keymap::read(string const & bind_file)
        lyxerr[Debug::KBMAP] << "Reading bind file:" << tmp << endl;
 
        bool error = false;
-       while (!error && lexrc.isOK()) {
+       while (lexrc.isOK()) {
                switch (lexrc.lex()) {
                case LyXLex::LEX_UNDEF:
                        lexrc.printError("Unknown tag `$$Token'");
@@ -154,7 +156,7 @@ bool kb_keymap::read(string const & bind_file)
                case BN_BINDFILE:
                        if (lexrc.next()) {
                                string const tmp(lexrc.getString());
-                               error = !read(tmp);
+                               error |= !read(tmp);
                        } else {
                                lexrc.printError("BN_BINDFILE: Missing file name");
                                error = true;
@@ -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()
@@ -271,6 +274,7 @@ void kb_keymap::defkey(kb_sequence * seq,
        newone->mod = seq->modifiers[r];
        if (r + 1 == seq->length()) {
                newone->func = func;
+               newone->func.origin = FuncRequest::KEYBOARD;
                newone->table.reset();
                return;
        } else {
@@ -281,26 +285,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);
+}