X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fkbmap.C;h=32fbdfd1c457bffae6aa06317deeb459b98f8f69;hb=d9e6e32961860821ecc047039ae6c1a9dcc6e35d;hp=e1a0cce71e5f2a95e985c175d78d8fe4aad9e487;hpb=80d7f70dc340e8b1ab29d38284b8327d13757196;p=lyx.git diff --git a/src/kbmap.C b/src/kbmap.C index e1a0cce71e..32fbdfd1c4 100644 --- a/src/kbmap.C +++ b/src/kbmap.C @@ -1,31 +1,43 @@ /** * \file kbmap.C - * Copyright 1995-2002 the LyX Team - * Read the file COPYING + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * \author unknown - * \author John Levon + * \author Lars Gullik Bjønnes + * \author Jean-Marc Lasgouttes + * \author John Levon + * \author André Pönitz + * + * Full author contact details are available in file CREDITS. */ #include #include "kbmap.h" -#include "lfuns.h" + +#include "debug.h" #include "kbsequence.h" #include "LyXAction.h" -#include "support/filetools.h" #include "lyxlex.h" -#include "debug.h" -using std::endl; +#include "frontends/LyXKeySym.h" + +#include "support/filetools.h" + +#include + using lyx::support::i18nLibFileSearch; -string const kb_keymap::printKeysym(LyXKeySymPtr key, +using std::endl; +using std::string; + + +string const kb_keymap::printKeySym(LyXKeySym const & key, key_modifier::state mod) { string buf; - string const s = key->getSymbolName(); + string const s = key.getSymbolName(); if (mod & key_modifier::shift) buf += "S-"; @@ -41,23 +53,23 @@ string const kb_keymap::printKeysym(LyXKeySymPtr key, string const kb_keymap::printKey(kb_key const & key) const { - return printKeysym(key.code, key.mod.first); + return key.code->print(key.mod.first); } -string::size_type kb_keymap::bind(string const & seq, int action) +string::size_type kb_keymap::bind(string const & seq, FuncRequest const & func) { if (lyxerr.debugging(Debug::KBMAP)) { lyxerr << "BIND: Sequence `" << seq << "' Action `" - << action << '\'' << endl; + << func.action << '\'' << endl; } kb_sequence k(0, 0); string::size_type const res = k.parse(seq); if (res == string::npos) { - defkey(&k, action); + defkey(&k, func); } else { lyxerr[Debug::KBMAP] << "Parse error at position " << res << " in key sequence '" << seq << "'." @@ -83,7 +95,7 @@ keyword_item bindTags[] = { } -bool kb_keymap::read(string const & bind_file) +bool kb_keymap::read(string const & bind_file) { const int bindCount = sizeof(bindTags) / sizeof(keyword_item); @@ -93,50 +105,58 @@ bool kb_keymap::read(string const & bind_file) string const tmp = i18nLibFileSearch("bind", bind_file, "bind"); lexrc.setFile(tmp); - if (!lexrc.isOK()) return false; + if (!lexrc.isOK()) { + lyxerr << "kb_keymap::read: cannot open bind file:" + << tmp << endl; + return false; + } - lyxerr[Debug::KBMAP] << "Reading bindfile:" << tmp << endl; + lyxerr[Debug::KBMAP] << "Reading bind file:" << tmp << endl; bool error = false; while (lexrc.isOK()) { switch (lexrc.lex()) { case LyXLex::LEX_UNDEF: lexrc.printError("Unknown tag `$$Token'"); + error = true; continue; case LyXLex::LEX_FEOF: continue; case BN_BIND: { string seq, cmd; - + if (lexrc.next()) { seq = lexrc.getString(); } else { lexrc.printError("BN_BIND: Missing key sequence"); + error = true; break; } - + if (lexrc.next(true)) { cmd = lexrc.getString(); } else { lexrc.printError("BN_BIND: missing command"); + error = true; break; } - - int action = lyxaction.LookupFunc(cmd); - if (!action == LFUN_UNKNOWN_ACTION) { + + FuncRequest func = lyxaction.lookupFunc(cmd); + if (func. action == LFUN_UNKNOWN_ACTION) { lexrc.printError("BN_BIND: Unknown LyX" " function `$$Token'"); + error = true; break; } - - error = (bind(seq, kb_action(action)) != string::npos); + + bind(seq, func); break; } 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; @@ -147,21 +167,23 @@ bool kb_keymap::read(string const & bind_file) } } - if (error) { - lyxerr << "Error reading bind file: " << tmp << endl; - } - - return error; + if (error) + lyxerr << "kb_keymap::read: error while reading bind file:" + << tmp << endl; + return !error; } -int kb_keymap::lookup(LyXKeySymPtr key, - key_modifier::state mod, kb_sequence * seq) const +FuncRequest const & +kb_keymap::lookup(LyXKeySymPtr key, + key_modifier::state mod, kb_sequence * seq) const { + static FuncRequest const unknown(LFUN_UNKNOWN_ACTION); + if (table.empty()) { seq->curmap = seq->stdmap; seq->mark_deleted(); - return LFUN_UNKNOWN_ACTION; + return unknown; } Table::const_iterator end = table.end(); @@ -175,12 +197,13 @@ int kb_keymap::lookup(LyXKeySymPtr key, if (cit->table.get()) { // this is a prefix key - set new map seq->curmap = cit->table.get(); - return LFUN_PREFIX; + static FuncRequest prefix(LFUN_PREFIX); + return prefix; } else { // final key - reset map seq->curmap = seq->stdmap; seq->mark_deleted(); - return cit->action; + return cit->func; } } } @@ -188,7 +211,8 @@ int kb_keymap::lookup(LyXKeySymPtr key, // error - key not found: seq->curmap = seq->stdmap; seq->mark_deleted(); - return LFUN_UNKNOWN_ACTION; + + return unknown; } @@ -204,7 +228,8 @@ string const kb_keymap::print() const } -void kb_keymap::defkey(kb_sequence * seq, int action, unsigned int r) +void kb_keymap::defkey(kb_sequence * seq, + FuncRequest const & func, unsigned int r) { LyXKeySymPtr code = seq->sequence[r]; if (!code->isOK()) @@ -229,7 +254,8 @@ void kb_keymap::defkey(kb_sequence * seq, int action, unsigned int r) if (it->table.get()) { it->table.reset(); } - it->action = action; + it->func = func; + it->func.origin = FuncRequest::KEYBOARD; return; } else if (!it->table.get()) { lyxerr << "Error: New binding for '" << seq->print() @@ -237,7 +263,7 @@ void kb_keymap::defkey(kb_sequence * seq, int action, unsigned int r) << endl; return; } else { - it->table->defkey(seq, action, r + 1); + it->table->defkey(seq, func, r + 1); return; } } @@ -247,35 +273,71 @@ void kb_keymap::defkey(kb_sequence * seq, int action, unsigned int r) newone->code = code; newone->mod = seq->modifiers[r]; if (r + 1 == seq->length()) { - newone->action = action; + newone->func = func; newone->table.reset(); return; } else { newone->table.reset(new kb_keymap); - newone->table->defkey(seq, action, r + 1); + newone->table->defkey(seq, func, r + 1); return; } } -string const kb_keymap::findbinding(int act, 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(act, - prefix - + printKey((*cit)) - + ' '); - } else if (cit->action == act) { - res += '['; - res += prefix + printKey((*cit)); - res += "] "; + 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) { + kb_sequence seq = prefix; + seq.addkey(cit->code, cit->mod.first); + res.push_back(seq); } } + return res; } + + +std::pair +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(0, key_modifier::none); +}