#include "KeyMap.h"
#include "debug.h"
-#include "kb_sequence.h"
+#include "KeySequence.h"
#include "LyXAction.h"
#include "Lexer.h"
-#include "frontends/LyXKeySym.h"
-
#include "support/filetools.h"
#include <sstream>
+#include <utility>
+
+using std::endl;
+using std::string;
+using std::make_pair;
namespace lyx {
using support::FileName;
using support::i18nLibFileSearch;
-using std::endl;
-using std::string;
-
-string const KeyMap::printKeySym(LyXKeySym const & key,
- key_modifier::state mod)
+string const KeyMap::printKeySym(KeySymbol const & key, KeyModifier mod)
{
string buf;
string const s = key.getSymbolName();
- if (mod & key_modifier::shift)
+ if (mod & ShiftModifier)
buf += "S-";
- if (mod & key_modifier::ctrl)
+ if (mod & ControlModifier)
buf += "C-";
- if (mod & key_modifier::alt)
+ if (mod & AltModifier)
buf += "M-";
buf += s;
<< seq << "' Action `"
<< func.action << '\'' << endl;
- kb_sequence k(0, 0);
+ KeySequence k(0, 0);
string::size_type const res = k.parse(seq);
if (res == string::npos) {
}
-FuncRequest const &
-KeyMap::lookup(LyXKeySymPtr key,
- key_modifier::state mod, kb_sequence * seq) const
+FuncRequest const & KeyMap::lookup(KeySymbol const &key,
+ KeyModifier mod, KeySequence * seq) const
{
static FuncRequest const unknown(LFUN_UNKNOWN_ACTION);
Table::const_iterator end = table.end();
for (Table::const_iterator cit = table.begin(); cit != end; ++cit) {
- key_modifier::state mask(cit->mod.second);
- key_modifier::state check =
- static_cast<key_modifier::state>(mod & ~mask);
+ KeyModifier mask = cit->mod.second;
+ KeyModifier check = static_cast<KeyModifier>(mod & ~mask);
- if (*(cit->code) == *key && cit->mod.first == check) {
+ if (cit->code == key && cit->mod.first == check) {
// match found
if (cit->table.get()) {
// this is a prefix key - set new map
docstring buf;
Table::const_iterator end = table.end();
for (Table::const_iterator cit = table.begin(); cit != end; ++cit) {
- buf += cit->code->print(cit->mod.first, forgui);
+ buf += cit->code.print(cit->mod.first, forgui);
buf += ' ';
}
return buf;
}
-void KeyMap::defkey(kb_sequence * seq, FuncRequest const & func, unsigned int r)
+void KeyMap::defkey(KeySequence * seq, FuncRequest const & func, unsigned int r)
{
- LyXKeySymPtr code = seq->sequence[r];
- if (!code->isOK())
+ KeySymbol code = seq->sequence[r];
+ if (!code.isOK())
return;
- key_modifier::state const mod1 = seq->modifiers[r].first;
- key_modifier::state const mod2 = seq->modifiers[r].second;
+ KeyModifier const mod1 = seq->modifiers[r].first;
+ KeyModifier const mod2 = seq->modifiers[r].second;
// check if key is already there
Table::iterator end = table.end();
for (Table::iterator it = table.begin(); it != end; ++it) {
- if (*(code) == *(it->code)
+ if (code == it->code
&& mod1 == it->mod.first
&& mod2 == it->mod.second) {
// overwrite binding
it->func.origin = FuncRequest::KEYBOARD;
return;
} else if (!it->table.get()) {
- lyxerr << "Error: New binding for '"
+ lyxerr << "Error: New binding for '"
<< to_utf8(seq->print(false))
<< "' is overriding old binding..."
<< endl;
docstring const KeyMap::printbindings(FuncRequest const & func) const
{
- odocstringstream res;
Bindings bindings = findbindings(func);
- for (Bindings::const_iterator cit = bindings.begin();
- cit != bindings.end() ; ++cit)
- res << '[' << cit->print(true) << ']';
+ if (bindings.empty())
+ return docstring();
+
+ odocstringstream res;
+ Bindings::const_iterator cit = bindings.begin();
+ Bindings::const_iterator cit_end = bindings.end();
+ // prin the first item
+ res << cit->print(true);
+ // more than one shortcuts?
+ for (++cit; cit != cit_end; ++cit)
+ res << ", " << cit->print(true);
return res.str();
}
KeyMap::Bindings KeyMap::findbindings(FuncRequest const & func) const
{
- return findbindings(func, kb_sequence(0, 0));
+ return findbindings(func, KeySequence(0, 0));
}
KeyMap::Bindings KeyMap::findbindings(FuncRequest const & func,
- kb_sequence const & prefix) const
+ KeySequence const & prefix) const
{
Bindings res;
if (table.empty()) return res;
for (Table::const_iterator cit = table.begin();
cit != end; ++cit) {
if (cit->table.get()) {
- kb_sequence seq = prefix;
+ KeySequence 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;
+ KeySequence seq = prefix;
seq.addkey(cit->code, cit->mod.first);
res.push_back(seq);
}
}
-std::pair<LyXKeySym const *, key_modifier::state>
-KeyMap::find1keybinding(FuncRequest const & func) const
+KeyMap::BindingList const KeyMap::listBindings(bool unbound) 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);
+ BindingList list;
+ listBindings(list, KeySequence(0, 0));
+ if (unbound) {
+ LyXAction::const_func_iterator fit = lyxaction.func_begin();
+ LyXAction::const_func_iterator fit_end = lyxaction.func_end();
+ for (; fit != fit_end; ++fit) {
+ kb_action action = fit->second;
+ bool has_action = false;
+ BindingList::const_iterator it = list.begin();
+ BindingList::const_iterator it_end = list.end();
+ for (; it != it_end; ++it)
+ if (it->first.action == action) {
+ has_action = true;
+ break;
+ }
+ if (!has_action)
+ list.push_back(make_pair(action, KeySequence(0, 0)));
+ }
}
+ return list;
+}
- return std::make_pair<LyXKeySym const *, key_modifier::state>(0, key_modifier::none);
+
+void KeyMap::listBindings(BindingList & list,
+ KeySequence const & prefix) const
+{
+ Table::const_iterator it = table.begin();
+ Table::const_iterator it_end = table.end();
+ for (; it != it_end; ++it) {
+ // a LFUN_COMMAND_PREFIX
+ if (it->table.get()) {
+ KeySequence seq = prefix;
+ seq.addkey(it->code, it->mod.first);
+ it->table->listBindings(list, seq);
+ } else {
+ KeySequence seq = prefix;
+ seq.addkey(it->code, it->mod.first);
+ list.push_back(make_pair(it->func, seq));
+ }
+ }
}