--- rxvt-unicode/src/keyboard.C 2006/10/09 23:12:45 1.26 +++ rxvt-unicode/src/keyboard.C 2008/01/10 11:30:45 1.30 @@ -70,7 +70,7 @@ keysym_t keyboard_manager::stock_keymap[] = { /* examples */ - /* keysym, state, range, handler, str */ + /* keysym, state, range, type, str */ //{XK_ISO_Left_Tab, 0, 1, keysym_t::STRING, "\033[Z"}, //{ 'a', 0, 26, keysym_t::RANGE_META8, "a" "%c"}, //{ 'a', ControlMask, 26, keysym_t::RANGE_META8, "" "%c"}, @@ -140,30 +140,13 @@ return len; } -//////////////////////////////////////////////////////////////////////////////// -// return: #bits of '1' -#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3) -# define bitcount(n) (__extension__ ({ uint32_t n__ = (n); __builtin_popcount (n__); })) -#else -static int -bitcount (uint16_t n) -{ - int i; - - for (i = 0; n; ++i, n &= n - 1) - ; - - return i; -} -#endif - // return: priority_of_a - priority_of_b static int compare_priority (keysym_t *a, keysym_t *b) { // (the more '1's in state; the less range): the greater priority - int ca = bitcount (a->state /* & OtherModMask */); - int cb = bitcount (b->state /* & OtherModMask */); + int ca = popcount (a->state /* & OtherModMask */); + int cb = popcount (b->state /* & OtherModMask */); if (ca != cb) return ca - cb; @@ -232,7 +215,7 @@ { char *middle = strchr (translation + 5, translation [4]); char *suffix = strrchr (translation + 5, translation [4]); - + if (suffix && middle && suffix > middle + 1) { key->type = keysym_t::LIST; @@ -471,8 +454,9 @@ assert (index >= 0); keysym_t *b = keymap [index]; - assert (i == (signed) index || // the normally expected result - (a->keysym + j) >= b->keysym && (a->keysym + j) <= (b->keysym + b->range) && compare_priority (a, b) <= 0); // is effectively the same or a closer match + assert (i == index // the normally expected result + || IN_RANGE_INC (a->keysym + j, b->keysym, b->keysym + b->range) + && compare_priority (a, b) <= 0); // is effectively the same or a closer match } } #endif @@ -484,7 +468,7 @@ int hashkey = keysym & KEYSYM_HASH_MASK; unsigned int index = hash [hashkey]; unsigned int end = hashkey < KEYSYM_HASH_BUDGETS - 1 - ? hash [hashkey + 1] + ? hash [hashkey + 1] : keymap.size (); for (; index < end; ++index)