X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fkbmap.C;h=8b528c49f1d046bae6fb066cd8b101b692dcbc66;hb=cb52251ccff29d6cbfa13ab90a96be566e3f41ac;hp=8c11970cdb43809b93d30bcd911e636546254b35;hpb=9ce32d63e5ff1dbf4c04e3d8263b2649ef3ac595;p=lyx.git diff --git a/src/kbmap.C b/src/kbmap.C index 8c11970cdb..8b528c49f1 100644 --- a/src/kbmap.C +++ b/src/kbmap.C @@ -4,13 +4,13 @@ * LyX, The Document Processor * * Copyright 1995 Matthias Ettrich - * Copyright 1995-2000 The LyX Team. + * Copyright 1995-2001 The LyX Team. * * ====================================================== */ #include -#include +//#include #include #ifdef __GNUG__ @@ -21,6 +21,8 @@ #include "kbsequence.h" #include "debug.h" +using std::endl; + // The only modifiers that we handle. We want to throw away things // like NumLock. enum { ModsMask = ShiftMask | ControlMask | Mod1Mask }; @@ -43,7 +45,7 @@ void printKeysym(unsigned int key, unsigned int mod, string & buf) { mod &= ModsMask; - char * s = XKeysymToString(key); + char const * const s = XKeysymToString(key); if (mod & ShiftMask) buf += "S-"; if (mod & ControlMask) buf += "C-"; @@ -69,12 +71,18 @@ void kb_keymap::printKey(kb_key const & key, string & buf) // This binds a key to an action -int kb_keymap::bind(char const * seq, int action) +string::size_type kb_keymap::bind(string const & seq, int action) { + if (lyxerr.debugging(Debug::KBMAP)) { + lyxerr << "BIND: Sequence `" + << seq << "' Action `" + << action << "'" << endl; + } + kb_sequence k; - int res = k.parse(seq); - if (!res) { + string::size_type const res = k.parse(seq); + if (res == string::npos) { defkey(&k, action); } else lyxerr[Debug::KBMAP] << "Parse error at position " << res @@ -103,25 +111,25 @@ int kb_keymap::lookup(unsigned int key, return -1; } - unsigned int msk1, msk0; + //unsigned int msk1, msk0; //suppress modifier bits we do not handle mod &= ModsMask; for (Table::const_iterator cit = table.begin(); cit != table.end(); ++cit) { - msk1 = (*cit).mod & 0xffff; - msk0 = ((*cit).mod >> 16) & 0xffff; - if ((*cit).code == key && (mod & ~msk0) == msk1) { + unsigned int const msk1 = cit->mod & 0xffff; + unsigned int const msk0 = (cit->mod >> 16) & 0xffff; + if (cit->code == key && (mod & ~msk0) == msk1) { // math found: - if ((*cit).table) { + if (cit->table.get()) { // this is a prefix key - set new map - seq->curmap = (*cit).table; + seq->curmap = cit->table.get(); return 0; } else { // final key - reset map seq->curmap = seq->stdmap; seq->delseq(); - return (*cit).action; + return cit->action; } } } @@ -164,31 +172,31 @@ void kb_keymap::print(string & buf) const int kb_keymap::defkey(kb_sequence * seq, int action, int idx /*= 0*/) { - unsigned int code = seq->sequence[idx]; - if(code == NoSymbol) return -1; + unsigned int const code = seq->sequence[idx]; + if (code == NoSymbol) return -1; - unsigned int modmsk = seq->modifiers[idx]; + unsigned int const modmsk = seq->modifiers[idx]; // --- check if key is already there -------------------------------- - if (table.size() != 0) // without this I get strange crashes - for (Table::iterator it = table.begin(); it != table.end(); ++it) { - if (code == (*it).code && modmsk == (*it).mod) { + if (table.size() != 0) { // without this I get strange crashes + Table::iterator end = table.end(); + for (Table::iterator it = table.begin(); it != end; ++it) { + if (code == it->code && modmsk == it->mod) { // overwrite binding if (idx + 1 == seq->length) { string buf; seq->print(buf, true); - lyxerr[Debug::KEY] + lyxerr[Debug::KBMAP] << "Warning: New binding for '" << buf << "' is overriding old binding..." << endl; - if((*it).table) { - delete (*it).table; - (*it).table = 0; + if (it->table.get()) { + it->table.reset(0); } - (*it).action = action; + it->action = action; return 0; - } else if (!(*it).table) { + } else if (!it->table.get()) { string buf; seq->print(buf, true); lyxerr << "Error: New binding for '" << buf @@ -196,44 +204,28 @@ int kb_keymap::defkey(kb_sequence * seq, int action, int idx /*= 0*/) << endl; return -1; } else { - return (*it).table->defkey(seq, action, - idx + 1); + return it->table->defkey(seq, action, + idx + 1); } } } - + } + Table::iterator newone = table.insert(table.end(), kb_key()); - (*newone).code = code; - (*newone).mod = modmsk; + newone->code = code; + newone->mod = modmsk; if (idx + 1 == seq->length) { - (*newone).action = action; - (*newone).table = 0; + newone->action = action; + newone->table.reset(0); return 0; } else { - (*newone).table = new kb_keymap; - return (*newone).table->defkey(seq, action, idx + 1); - } -} - - -/* ---F+------------------------------------------------------------------ *\ - Function : kb_keymap::~kb_keymap - Called by : [destructor] - Purpose : free keymap and its descendents - Parameters: none - Returns : nothing -\* ---F------------------------------------------------------------------- */ - -kb_keymap::~kb_keymap() -{ - // This could be done by a destructor in kb_key. - for(Table::iterator it = table.begin(); it != table.end(); ++it) { - delete (*it).table; + newone->table.reset(new kb_keymap); + return newone->table->defkey(seq, action, idx + 1); } } -string kb_keymap::keyname(kb_key const & k) +string const kb_keymap::keyname(kb_key const & k) { string buf; printKeysym(k.code, k.mod, buf); @@ -242,24 +234,23 @@ string kb_keymap::keyname(kb_key const & k) // Finds a key for a keyaction, if possible -string kb_keymap::findbinding(int act) const +string const kb_keymap::findbinding(int act, string const & prefix) const { string res; if (table.empty()) return res; - for(Table::const_iterator cit = table.begin(); - cit != table.end(); ++cit) { - if ((*cit).table) { - string suffix = (*cit).table->findbinding(act); - suffix = strip(suffix, ' '); - suffix = strip(suffix, ']'); - suffix = frontStrip(suffix, '['); - if (!suffix.empty()) { - res += "[" + keyname((*cit)) + " " - + suffix + "] "; - } - } else if ((*cit).action == act) { - res += "[" + keyname((*cit)) + "] "; + 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 + + keyname((*cit)) + + " "); + } else if (cit->action == act) { + res += "["; + res += prefix + keyname((*cit)); + res += "] "; } } return res;