diff options
| -rw-r--r-- | backends/keymapper/hardware-key.h | 6 | ||||
| -rw-r--r-- | backends/keymapper/keymap-manager.cpp | 13 | ||||
| -rw-r--r-- | backends/keymapper/keymap-manager.h | 2 | ||||
| -rw-r--r-- | backends/keymapper/keymap.cpp | 19 | ||||
| -rw-r--r-- | backends/keymapper/keymap.h | 14 | ||||
| -rw-r--r-- | backends/keymapper/keymapper.cpp | 20 | ||||
| -rw-r--r-- | backends/keymapper/keymapper.h | 16 | ||||
| -rw-r--r-- | backends/keymapper/remap-dialog.cpp | 19 | ||||
| -rw-r--r-- | backends/vkeybd/vkeybd.zip | bin | 170515 -> 335613 bytes | |||
| -rw-r--r-- | common/stack.h | 6 | 
10 files changed, 79 insertions, 36 deletions
| diff --git a/backends/keymapper/hardware-key.h b/backends/keymapper/hardware-key.h index 7ddb4dacd1..8807e6db9f 100644 --- a/backends/keymapper/hardware-key.h +++ b/backends/keymapper/hardware-key.h @@ -69,7 +69,7 @@ struct HardwareKey {  class HardwareKeySet {  public: -	HardwareKeySet() {} +	HardwareKeySet() : _count(0) {}  	virtual ~HardwareKeySet() {  		List<const HardwareKey*>::iterator it;  		for (it = _keys.begin(); it != _keys.end(); it++) @@ -79,6 +79,7 @@ public:  	void addHardwareKey(HardwareKey *key) {  		checkForKey(key);  		_keys.push_back(key); +		++_count;  	}  	const HardwareKey *findHardwareKey(int32 id) const { @@ -104,7 +105,7 @@ public:  	}  	uint count() const { -		return _keys.size(); +		return _count;  	} @@ -121,6 +122,7 @@ private:  	}  	List<const HardwareKey*> _keys; +	uint _count;  }; diff --git a/backends/keymapper/keymap-manager.cpp b/backends/keymapper/keymap-manager.cpp index a9ab1c7069..1b6b547858 100644 --- a/backends/keymapper/keymap-manager.cpp +++ b/backends/keymapper/keymap-manager.cpp @@ -73,6 +73,7 @@ void KeymapManager::registerGlobalKeymap(Keymap *map) {  void KeymapManager::refreshGameDomain() {  	if (_gameDomain.getConfigDomain() != ConfMan.getActiveDomain()) {  		_gameDomain.deleteAllKeyMaps(); +  		_gameDomain.setConfigDomain(ConfMan.getActiveDomain());  	}  } @@ -85,7 +86,8 @@ void KeymapManager::registerGameKeymap(Keymap *map) {  void KeymapManager::initKeymap(ConfigManager::Domain *domain,   							   Keymap *map) { -	map->loadMappings(domain, _hardwareKeys); +	map->setConfigDomain(domain); +	map->loadMappings(_hardwareKeys);  	if (map->isComplete(_hardwareKeys) == false) {  		automaticMap(map);  		map->saveMappings(domain); @@ -206,6 +208,8 @@ void KeymapManager::automaticMap(Keymap *map) {  			break;  		}  	} +	map->saveMappings(); +	ConfMan.flushToDisk();  }  Action *KeymapManager::getParentMappedAction(Keymap *map, KeyState key) { @@ -221,10 +225,13 @@ Action *KeymapManager::getParentMappedAction(Keymap *map, KeyState key) {  	}  } -Keymap *KeymapManager::getKeymap(const String& name) { +Keymap *KeymapManager::getKeymap(const String& name, bool *global) {  	Keymap *keymap = _gameDomain.getKeymap(name); -	if (!keymap) +	*global = false; +	if (!keymap) {  		keymap = _globalDomain.getKeymap(name); +		*global = true; +	}  	return keymap;  } diff --git a/backends/keymapper/keymap-manager.h b/backends/keymapper/keymap-manager.h index b76273f124..b9afaee80b 100644 --- a/backends/keymapper/keymap-manager.h +++ b/backends/keymapper/keymap-manager.h @@ -83,7 +83,7 @@ public:  	void refreshGameDomain();  	void registerGameKeymap(Keymap *map); -	Keymap *getKeymap(const String& name); +	Keymap *getKeymap(const String& name, bool *global);  	Domain& getGlobalDomain() { return _globalDomain; }  	Domain& getGameDomain() { return _gameDomain; } diff --git a/backends/keymapper/keymap.cpp b/backends/keymapper/keymap.cpp index 28d0afd51e..64076d4457 100644 --- a/backends/keymapper/keymap.cpp +++ b/backends/keymapper/keymap.cpp @@ -28,7 +28,7 @@  namespace Common { -Keymap::Keymap(const Keymap& km) : _actions(km._actions), _keymap() { +Keymap::Keymap(const Keymap& km) : _actions(km._actions), _keymap(), _configDomain(0) {  	List<Action*>::iterator it;  	for (it = _actions.begin(); it != _actions.end(); it++) {  		const HardwareKey *hwKey = (*it)->getMappedKey(); @@ -94,10 +94,15 @@ Action *Keymap::getMappedAction(const KeyState& ks) const {  		return it->_value;  } -void Keymap::loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *hwKeys) { +void Keymap::setConfigDomain(ConfigManager::Domain *dom) { +	_configDomain = dom; +} + +void Keymap::loadMappings(const HardwareKeySet *hwKeys) { +	if (!_configDomain) return;  	ConfigManager::Domain::iterator it;	  	String prefix = "km_" + _name + "_"; -	for (it = domain->begin(); it != domain->end(); it++) { +	for (it = _configDomain->begin(); it != _configDomain->end(); it++) {  		const String& key = it->_key;  		if (!key.hasPrefix(prefix.c_str()))  			continue; @@ -114,6 +119,7 @@ void Keymap::loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *h  		if (!ua) {  			warning("'%s' keymap does not contain Action with ID %d",   				_name.c_str(), (int)actionId); +			_configDomain->erase(key);  			continue;  		} @@ -126,6 +132,7 @@ void Keymap::loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *h  		const HardwareKey *hwKey = hwKeys->findHardwareKey(hwKeyId);  		if (!hwKey) {  			warning("HardwareKey with ID %d not known", (int)hwKeyId); +			_configDomain->erase(key);  			continue;  		} @@ -133,8 +140,8 @@ void Keymap::loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *h  	}  } -void Keymap::saveMappings(ConfigManager::Domain *domain) { -	if (!domain) return; +void Keymap::saveMappings() { +	if (!_configDomain) return;  	List<Action*>::const_iterator it;  	char buf[12];  	String prefix = "km_" + _name + "_"; @@ -145,7 +152,7 @@ void Keymap::saveMappings(ConfigManager::Domain *domain) {  			sprintf(buf, "%d", (*it)->getMappedKey()->id);  		else  			strcpy(buf, ""); -		domain->setVal(key, buf); +		_configDomain->setVal(key, buf);  	}  } diff --git a/backends/keymapper/keymap.h b/backends/keymapper/keymap.h index 5694bfaa18..3159dab7f8 100644 --- a/backends/keymapper/keymap.h +++ b/backends/keymapper/keymap.h @@ -81,19 +81,20 @@ public:  	 */  	Action *getMappedAction(const KeyState& ks) const; +	void setConfigDomain(ConfigManager::Domain *dom); +  	/** -	 * Load this keymap's mappings from the given config domain and hardware key set -	 * @param domain	config domain to load keymap from +	 * Load this keymap's mappings from the config manager.  	 * @param hwKeys	the set to retrieve hardware key pointers from  	 */ -	void loadMappings(ConfigManager::Domain *domain, const HardwareKeySet *hwKeys); +	void loadMappings(const HardwareKeySet *hwKeys);  	/** -	 * Save this keymap's mappings to the given config domain -	 * @param domain	config domain to save keymap to +	 * Save this keymap's mappings to the config manager +	 * @note Changes are *not* flushed to disk, to do so call ConfMan.flushToDisk()  	 * @note Changes are *not* flushed to disk, to do so call ConfMan.flushToDisk()  	 */ -	void saveMappings(ConfigManager::Domain *domain); +	void saveMappings();  	/**  	 * Returns true if all UserAction's in Keymap are mapped, or, @@ -130,6 +131,7 @@ private:  	Keymap *_parent;  	List<Action*> _actions;  	HashMap<KeyState, Action*> _keymap;  +	ConfigManager::Domain *_configDomain;  }; diff --git a/backends/keymapper/keymapper.cpp b/backends/keymapper/keymapper.cpp index 93b45e1d99..e011b215f0 100644 --- a/backends/keymapper/keymapper.cpp +++ b/backends/keymapper/keymapper.cpp @@ -52,20 +52,28 @@ void Keymapper::addGameKeymap(Keymap *keymap) {  	_keymapMan->registerGameKeymap(keymap);  } +void Keymapper::cleanupGameKeymaps() { +	Stack<MapRecord> newStack; +	for (int i = 0; i < _activeMaps.size(); i++) { +		if (!_activeMaps[i].global) +			newStack.push(_activeMaps[i]); +	} +	_activeMaps = newStack; +} +  bool Keymapper::pushKeymap(const String& name, bool inherit) { -	Keymap *newMap = _keymapMan->getKeymap(name); +	bool global; +	Keymap *newMap = _keymapMan->getKeymap(name, &global);  	if (!newMap) {  		warning("Keymap '%s' not registered", name.c_str());  		return false;  	} -	pushKeymap(newMap, inherit); +	pushKeymap(newMap, inherit, global);  	return true;  } -void Keymapper::pushKeymap(Keymap *newMap, bool inherit) { -	MapRecord mr; -	mr.inherit = inherit; -	mr.keymap = newMap; +void Keymapper::pushKeymap(Keymap *newMap, bool inherit, bool global) { +	MapRecord mr = {newMap, inherit, global};  	_activeMaps.push(mr);  } diff --git a/backends/keymapper/keymapper.h b/backends/keymapper/keymapper.h index 7ef2ef96cb..fc76a7d45c 100644 --- a/backends/keymapper/keymapper.h +++ b/backends/keymapper/keymapper.h @@ -41,6 +41,7 @@ public:  	struct MapRecord {  		Keymap* keymap;  		bool inherit; +		bool global;  	};  	Keymapper(EventManager *eventMan); @@ -61,13 +62,18 @@ public:  	void addGlobalKeymap(Keymap *keymap);  	/** -	* Add a keymap to the game domain. -	* @see addGlobalKeyMap -	* @note initGame() should be called before any game keymaps are added. -	*/ +	 * Add a keymap to the game domain. +	 * @see addGlobalKeyMap +	 * @note initGame() should be called before any game keymaps are added. +	 */  	void addGameKeymap(Keymap *keymap);  	/** +	 * Should be called at end of game to tell Keymapper to deactivate and free +	 * any game keymaps that are loaded. +	 */ +	void cleanupGameKeymaps(); +	/**  	 * Push a new keymap to the top of the active stack, activating   	 * it for use.  	 * @param name		name of the keymap to push @@ -113,7 +119,7 @@ public:  private: -	void pushKeymap(Keymap *newMap, bool inherit); +	void pushKeymap(Keymap *newMap, bool inherit, bool global);  	typedef List<HardwareKey*>::iterator Iterator; diff --git a/backends/keymapper/remap-dialog.cpp b/backends/keymapper/remap-dialog.cpp index 24da9d1b35..57e4578629 100644 --- a/backends/keymapper/remap-dialog.cpp +++ b/backends/keymapper/remap-dialog.cpp @@ -51,9 +51,11 @@ RemapDialog::~RemapDialog() {  }  void RemapDialog::open() { +	bool divider = false;  	_activeKeymaps = &_keymapper->getActiveStack();  	if (_activeKeymaps->size() > 0) {  		_kmPopUp->appendEntry(_activeKeymaps->top().keymap->getName() + " (Active)"); +		divider = true;  	}  	KeymapManager::Domain *_globalKeymaps = &_keymapper->getManager()->getGlobalDomain(); @@ -78,14 +80,15 @@ void RemapDialog::open() {  	KeymapManager::Domain::iterator it;  	uint32 idx = 0;  	if (_globalKeymaps) { -		_kmPopUp->appendEntry(""); +		if (divider) _kmPopUp->appendEntry("");  		for (it = _globalKeymaps->begin(); it != _globalKeymaps->end(); it++) {  			_kmPopUp->appendEntry(it->_value->getName() + " (Global)", idx);  			_keymapTable[idx++] = it->_value;  		} +		divider = true;  	}  	if (_gameKeymaps) { -		_kmPopUp->appendEntry(""); +		if (divider) _kmPopUp->appendEntry("");  		for (it = _gameKeymaps->begin(); it != _gameKeymaps->end(); it++) {  			_kmPopUp->appendEntry(it->_value->getName() + " (Game)", idx);  			_keymapTable[idx++] = it->_value; @@ -93,10 +96,11 @@ void RemapDialog::open() {  	}  	_changes = false; -	_kmPopUp->setSelected(0); -	loadKeymap();  	Dialog::open(); + +	_kmPopUp->setSelected(0); +	loadKeymap();  }  void RemapDialog::close() { @@ -105,7 +109,8 @@ void RemapDialog::close() {  		free(_keymapTable);  		_keymapTable = 0;  	} -	if (_changes) ConfMan.flushToDisk(); +	if (_changes)  +		ConfMan.flushToDisk();  	Dialog::close();  } @@ -260,7 +265,9 @@ void RemapDialog::loadKeymap() {  		}  	} else if (_kmPopUp->getSelected() != -1) { -		Keymap *km = _keymapTable[_kmPopUp->getSelectedTag()]; +		uint32 select = _kmPopUp->getSelected(); +		uint32 tag = _kmPopUp->getSelectedTag(); +		Keymap *km = _keymapTable[tag];  		List<Action*>::iterator it;  		for (it = km->getActions().begin(); it != km->getActions().end(); it++) { diff --git a/backends/vkeybd/vkeybd.zip b/backends/vkeybd/vkeybd.zipBinary files differ index 5efbf4f660..e62498cc3d 100644 --- a/backends/vkeybd/vkeybd.zip +++ b/backends/vkeybd/vkeybd.zip diff --git a/common/stack.h b/common/stack.h index 876efacc3f..238d0f6433 100644 --- a/common/stack.h +++ b/common/stack.h @@ -88,7 +88,11 @@ protected:  public:  	Stack<T>() {}  	Stack<T>(const Array<T> &stackContent) : _stack(stackContent) {} - +	 +	Stack<T>& operator=(const Stack<T> &st) { +		_stack = st._stack; +		return *this; +	}  	bool empty() const {  		return _stack.empty();  	} | 
