void InputManager::addActionKey(int action, int type, int val) { if (action < 0 || action >= Input::KEY_TOTAL) return; int idx = -1; KeyFunction &key = mKey[action]; for (size_t i = 0; i < KeyFunctionSize; i ++) { if (key.values[i].type == INPUT_UNKNOWN || (key.values[i].type == type && key.values[i].value == val)) { idx = i; break; } } if (idx == -1) { for (size_t i = 1; i < KeyFunctionSize; i ++) { key.values[i - 1].type = key.values[i].type; key.values[i - 1].value = key.values[i].value; } idx = KeyFunctionSize - 1; } key.values[idx] = KeyItem(type, val); }
void InputManager::retrieve() { for (int i = 0; i < Input::KEY_TOTAL; i++) { if (*keyData[i].configField) { KeyFunction &kf = mKey[i]; std::string keyStr = config.getValue(keyData[i].configField, ""); if (keyStr.empty()) continue; StringVect keys; splitToStringVector(keys, keyStr, ','); int i2 = 0; for (StringVectCIter it = keys.begin(), it_end = keys.end(); it != it_end && i2 < KeyFunctionSize; ++ it) { std::string keyStr2 = *it; if (keyStr.size() < 2) continue; int type = INPUT_KEYBOARD; if ((keyStr2[0] < '0' || keyStr2[0] > '9') && keyStr2[0] != '-') { switch (keyStr2[0]) { case 'm': type = INPUT_MOUSE; break; case 'j': type = INPUT_JOYSTICK; break; default: break; } keyStr2 = keyStr2.substr(1); } int key = atoi(keyStr2.c_str()); if (key >= -255 && key < SDLK_LAST) { kf.values[i2] = KeyItem(type, key); i2 ++; } } } } }
/****************************************************************************** Routine to insert a new Item into the HashTable. The data is assumed to be * new one. * ******************************************************************************/ void _InsertHashTable(GifHashTableType *HashTable, uint32_t Key, int Code) { int HKey = KeyItem(Key); uint32_t *HTable = HashTable -> HTable; #ifdef DEBUG_HIT_RATE NumberOfTests++; NumberOfMisses++; #endif /* DEBUG_HIT_RATE */ while (HT_GET_KEY(HTable[HKey]) != 0xFFFFFL) { #ifdef DEBUG_HIT_RATE NumberOfMisses++; #endif /* DEBUG_HIT_RATE */ HKey = (HKey + 1) & HT_KEY_MASK; } HTable[HKey] = HT_PUT_KEY(Key) | HT_PUT_CODE(Code); }
/****************************************************************************** Routine to test if given Key exists in HashTable and if so returns its code * Returns the Code if key was found, -1 if not. * ******************************************************************************/ int _ExistsHashTable(GifHashTableType *HashTable, uint32_t Key) { int HKey = KeyItem(Key); uint32_t *HTable = HashTable -> HTable, HTKey; #ifdef DEBUG_HIT_RATE NumberOfTests++; NumberOfMisses++; #endif /* DEBUG_HIT_RATE */ while ((HTKey = HT_GET_KEY(HTable[HKey])) != 0xFFFFFL) { #ifdef DEBUG_HIT_RATE NumberOfMisses++; #endif /* DEBUG_HIT_RATE */ if (Key == HTKey) return HT_GET_CODE(HTable[HKey]); HKey = (HKey + 1) & HT_KEY_MASK; } return -1; }