X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fkbmap.C;h=858edad8b0b55268d5fbc4326668bb8cfb09da56;hb=1bc4b735755ab8addc9e7bca305889e4784e7ceb;hp=ca24e92654a4f0d081e2156682944eec3cb2033d;hpb=7c6267e4b10364cc892776e0a426eb32ade6b0b4;p=lyx.git diff --git a/src/kbmap.C b/src/kbmap.C index ca24e92654..858edad8b0 100644 --- a/src/kbmap.C +++ b/src/kbmap.C @@ -10,7 +10,8 @@ #include #include -#include +#include + #include "support/lstrings.h" #include "gettext.h" @@ -40,7 +41,7 @@ enum { ModsMask = ShiftMask | ControlMask | Mod1Mask}; Returns : length of printed string if ok, 0 otherwise. \* ---F------------------------------------------------------------------- */ static -void printKeysym( KeySym key, unsigned int mod, string & buf) +void printKeysym(unsigned long key, unsigned int mod, string & buf) { mod &= ModsMask; @@ -64,7 +65,7 @@ void printKeysym( KeySym key, unsigned int mod, string & buf) \* ---F------------------------------------------------------------------- */ static -void printKeyTab( kb_key * tabPt, string & buf) +void printKeyTab(kb_key * tabPt, string & buf) { unsigned int ksym, mod; @@ -91,7 +92,7 @@ void printKeyTab( kb_key * tabPt, string & buf) Returns : action or -1 if error (no map defined or key not found) \* ---F------------------------------------------------------------------- */ -int kb_sequence::addkey(KeySym key, +int kb_sequence::addkey(unsigned long key, unsigned int mod, unsigned int nmod /*= 0*/) { if(length < 0) length = 0; @@ -131,59 +132,55 @@ int kb_sequence::addkey(KeySym key, int kb_sequence::parse(char const * s) { + if(!s[0]) return 1; + int i = 0; unsigned int mod = 0, nmod = 0; - KeySym key = 0; - char tbuf[100]; - - if(!s[0]) return 1; - while(s[i]) { if(s[i] && (s[i]) <= ' ') ++i; if(!s[i]) break; - if(s[i+1] == '-') { // is implicit that s[i] == true + if(s[i + 1] == '-') { // is implicit that s[i] == true switch(s[i]) { case 's': case 'S': mod |= ShiftMask; - i+= 2; + i += 2; continue; case 'c': case 'C': mod |= ControlMask; - i+= 2; + i += 2; continue; case 'm': case 'M': mod |= Mod1Mask; - i+= 2; + i += 2; continue; default: - return i+1; + return i + 1; } - } else if(s[i] == '~' && s[i+1] && s[i+2] == '-') { - switch(s[i+1]) { + } else if(s[i] == '~' && s[i + 1] && s[i + 2] == '-') { + switch(s[i + 1]) { case 's': case 'S': nmod |= ShiftMask; - i+= 3; + i += 3; continue; case 'c': case 'C': nmod |= ControlMask; - i+= 3; + i += 3; continue; case 'm': case 'M': nmod |= Mod1Mask; - i+= 3; + i += 3; continue; default: - return i+2; + return i + 2; } } else { - int j = 0; - for(j = i; s[j] && s[j] > ' '; ++j) - tbuf[j-i] = s[j]; // (!!!check bounds :-) + string tbuf; + int j = i; + for(; s[j] && s[j] > ' '; ++j) + tbuf += s[j]; // (!!!check bounds :-) - tbuf[j-i] = '\0'; - - key = XStringToKeysym(tbuf); + KeySym key = XStringToKeysym(tbuf.c_str()); if(key == NoSymbol) { lyxerr[Debug::KBMAP] << "kbmap.C: No such keysym: " @@ -282,7 +279,7 @@ KeySym kb_sequence::getsym() int l = length; if(l == 0) return NoSymbol; if(l < 0) l = -l; - return sequence[l-1]; + return sequence[l - 1]; } @@ -316,7 +313,7 @@ void kb_sequence::reset() { delseq(); curmap = stdmap; - if ( length > 0 ) length = -length; + if (length > 0) length = -length; } @@ -348,11 +345,8 @@ int kb_keymap::bind(char const * seq, int action) Returns : user defined action; 0 for prefix key, -1 if key not found \* ---F------------------------------------------------------------------- */ -int kb_keymap::lookup(KeySym key, unsigned int mod, kb_sequence * seq) +int kb_keymap::lookup(unsigned long key, unsigned int mod, kb_sequence * seq) { -#ifndef NO_HASH - unsigned int hashval; -#endif unsigned int ksym, msk1, msk0; kb_key * tab; @@ -366,22 +360,11 @@ int kb_keymap::lookup(KeySym key, unsigned int mod, kb_sequence * seq) return -1; } -#ifndef NO_HASH - if(size < 0) { // --- if hash table --- - hashval = ((key&0xff) ^ ((key>>8)&0xff)) % KB_HASHSIZE; - tab = htable[hashval]; - if(!tab) { - seq->curmap = seq->stdmap; - seq->delseq(); - return -1; - } - } else // --- else: linear list --- -#endif - tab = table; + tab = table; // --- now search the list of keys --- - for( ; (tab->code & 0xffff) != NoSymbol; ++tab) { + for(; (tab->code & 0xffff) != NoSymbol; ++tab) { ksym = tab->code; msk1 = tab->mod & 0xffff; msk0 = (tab->mod >> 16) & 0xffff; @@ -423,16 +406,7 @@ void kb_keymap::print(string & buf) const if (!table) return; // Process each of its slots recursively and return. -#ifndef NO_HASH - if ( size < 0 ) { // Hash table - for ( int ix = 0; ix < KB_HASHSIZE; ++ix ) { - if ( htable[ix] ) { - printKeyTab(htable[ix], buf); - } - } - } else // Normal table -#endif - printKeyTab(table, buf); + printKeyTab(table, buf); } @@ -461,19 +435,6 @@ int kb_keymap::defkey(kb_sequence * seq, int action, int idx /*= 0*/) tab = table; ptab = &table; size = KB_PREALLOC; -#ifndef NO_HASH - } else if(size < 0) { - // Hash table. - int hashval = code & 0xffff; - hashval = ((hashval & 0xff) ^ ((hashval >> 8) & 0xff)) % KB_HASHSIZE; - tab = htable[hashval]; - ptab = htable+hashval; - if(!tab) { - tab = new kb_key[KB_PREALLOC]; - tab[0].code = NoSymbol; - *ptab = tab; - } -#endif } else { tab = table; ptab = &table; @@ -485,7 +446,7 @@ int kb_keymap::defkey(kb_sequence * seq, int action, int idx /*= 0*/) int tsize; for(t = tab, tsize = 1; t->code != NoSymbol; ++t, ++tsize) { if(code == t->code && modmsk == t->mod) { // -- overwrite binding --- - if(idx+1 == seq->length) { + if(idx + 1 == seq->length) { string buf; seq->print(buf, true); lyxerr[Debug::KEY] @@ -532,61 +493,15 @@ int kb_keymap::defkey(kb_sequence * seq, int action, int idx /*= 0*/) tab[tsize].mod = modmsk; kb_key * newone = &tab[tsize]; - // --- convert list to hash table if necessary ---------------------- - -#ifndef NO_HASH - if(size >= 0 && tsize >= 32) { - kb_key * oldtab = tab; - kb_key ** nht = new kb_key*[KB_HASHSIZE]; - for(int i = 0; i < KB_HASHSIZE; ++i) - nht[i] = 0; - htable = nht; - size = -KB_HASHSIZE; - - // --- copy old keys to new hash table --- - int hashval; - for(kb_key * tu = oldtab; tu->code != NoSymbol; ++tu) { - // copy values from oldtab to htable - hashval = (tu->code & 0xffff); - hashval = ((hashval & 0xff) ^ ((hashval>>8) & 0xff)) % KB_HASHSIZE; - tab = htable[hashval]; - - if(!tab){ - htable[hashval] = tab = new kb_key[KB_PREALLOC]; - tab->code = NoSymbol; - } - int ts = 1; - for(kb_key * tt = tab; tt->code != NoSymbol; ++tt) - ++ts; - if(ts % KB_PREALLOC == 0){ - // extend table - kb_key * nt = new kb_key[ts+KB_PREALLOC]; - memcpy(nt, tab, ts * sizeof(kb_key)); - htable[hashval] = nt; - delete[] tab; - tab = nt; - } - tab[ts--].code = NoSymbol; - tab[ts].code = tu->code; - tab[ts].mod = tu->mod; - tab[ts].action = tu->action; - tab[ts].table = tu->table; - - if(tu == newone) - newone = &tab[ts]; - } - delete[] oldtab; - } -#endif // --- define rest of sequence -------------------------------------- - if(idx+1 == seq->length) { + if(idx + 1 == seq->length) { newone->action = action; newone->table = 0; return 0; } else { newone->table = new kb_keymap; - int res = newone->table->defkey(seq, action, idx+1); + int res = newone->table->defkey(seq, action, idx + 1); return res; } } @@ -603,27 +518,10 @@ int kb_keymap::defkey(kb_sequence * seq, int action, int idx /*= 0*/) kb_keymap::~kb_keymap() { if(!table) return; -#ifndef NO_HASH - if(size < 0) { - for(int i = 0; i < KB_HASHSIZE; ++i) { - if(htable[i]) { - for(kb_key * t = htable[i]; - t->code != NoSymbol; ++t) - if(t->table) - delete t->table; - delete htable[i]; - } - } - delete htable; - } else { -#endif - for(kb_key * t = table; t->code != NoSymbol; ++t) - if(t->table) - delete t->table; - delete table; -#ifndef NO_HASH - } -#endif + for(kb_key * t = table; t->code != NoSymbol; ++t) + if(t->table) + delete t->table; + delete table; } @@ -641,44 +539,19 @@ string kb_keymap::findbinding(int act) const string res; if (!table) return res; -#ifndef NO_HASH - if (size < 0) { - for(int i = 0; i < KB_HASHSIZE; ++i) { - if(htable[i]) { - for(kb_key * t = htable[i]; - t->code != NoSymbol; ++t) { - if(t->table) { - string suffix = t->table->findbinding(act); - suffix = strip(suffix, ' '); - suffix = strip(suffix, ']'); - suffix = frontStrip(suffix, '['); - if (!suffix.empty()) { - res += "[" + keyname(*t) + " " + suffix + "] "; - } - } else if (t->action == act) { - res += "[" + keyname(*t) + "] "; - } - } - } - } - } else { -#endif - for(kb_key * t = table; t->code != NoSymbol; ++t) { - if(t->table) { - string suffix = t->table->findbinding(act); - suffix = strip(suffix, ' '); - suffix = strip(suffix, ']'); - suffix = frontStrip(suffix, '['); - if (!suffix.empty()) { - res += "[" + keyname(*t) + " " + suffix + "] "; - } - } else if (t->action == act) { - res += "[" + keyname(*t) + "] "; + for(kb_key * t = table; t->code != NoSymbol; ++t) { + if(t->table) { + string suffix = t->table->findbinding(act); + suffix = strip(suffix, ' '); + suffix = strip(suffix, ']'); + suffix = frontStrip(suffix, '['); + if (!suffix.empty()) { + res += "[" + keyname(*t) + " " + suffix + "] "; } + } else if (t->action == act) { + res += "[" + keyname(*t) + "] "; } -#ifndef NO_HASH } -#endif return res; }