[Scummvm-cvs-logs] SF.net SVN: scummvm:[33853] scummvm/branches/gsoc2008-vkeybd

kenny-d at users.sourceforge.net kenny-d at users.sourceforge.net
Thu Aug 14 03:42:03 CEST 2008


Revision: 33853
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33853&view=rev
Author:   kenny-d
Date:     2008-08-14 01:42:02 +0000 (Thu, 14 Aug 2008)

Log Message:
-----------
* Saving of keymaps fully implemented
* Added Keymapper::cleanupGameKeymaps() with code to remove game keymaps from active stack

Modified Paths:
--------------
    scummvm/branches/gsoc2008-vkeybd/backends/keymapper/hardware-key.h
    scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap-manager.cpp
    scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap-manager.h
    scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap.cpp
    scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap.h
    scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymapper.cpp
    scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymapper.h
    scummvm/branches/gsoc2008-vkeybd/backends/keymapper/remap-dialog.cpp
    scummvm/branches/gsoc2008-vkeybd/backends/vkeybd/vkeybd.zip
    scummvm/branches/gsoc2008-vkeybd/common/stack.h

Modified: scummvm/branches/gsoc2008-vkeybd/backends/keymapper/hardware-key.h
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/keymapper/hardware-key.h	2008-08-14 00:26:57 UTC (rev 33852)
+++ scummvm/branches/gsoc2008-vkeybd/backends/keymapper/hardware-key.h	2008-08-14 01:42:02 UTC (rev 33853)
@@ -69,7 +69,7 @@
 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 @@
 	void addHardwareKey(HardwareKey *key) {
 		checkForKey(key);
 		_keys.push_back(key);
+		++_count;
 	}
 
 	const HardwareKey *findHardwareKey(int32 id) const {
@@ -104,7 +105,7 @@
 	}
 
 	uint count() const {
-		return _keys.size();
+		return _count;
 	}
 
 
@@ -121,6 +122,7 @@
 	}
 
 	List<const HardwareKey*> _keys;
+	uint _count;
 };
 
 

Modified: scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap-manager.cpp
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap-manager.cpp	2008-08-14 00:26:57 UTC (rev 33852)
+++ scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap-manager.cpp	2008-08-14 01:42:02 UTC (rev 33853)
@@ -73,6 +73,7 @@
 void KeymapManager::refreshGameDomain() {
 	if (_gameDomain.getConfigDomain() != ConfMan.getActiveDomain()) {
 		_gameDomain.deleteAllKeyMaps();
+
 		_gameDomain.setConfigDomain(ConfMan.getActiveDomain());
 	}
 }
@@ -85,7 +86,8 @@
 
 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 @@
 			break;
 		}
 	}
+	map->saveMappings();
+	ConfMan.flushToDisk();
 }
 
 Action *KeymapManager::getParentMappedAction(Keymap *map, KeyState key) {
@@ -221,10 +225,13 @@
 	}
 }
 
-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;
 }
 

Modified: scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap-manager.h
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap-manager.h	2008-08-14 00:26:57 UTC (rev 33852)
+++ scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap-manager.h	2008-08-14 01:42:02 UTC (rev 33853)
@@ -83,7 +83,7 @@
 	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; }

Modified: scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap.cpp
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap.cpp	2008-08-14 00:26:57 UTC (rev 33852)
+++ scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap.cpp	2008-08-14 01:42:02 UTC (rev 33853)
@@ -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 @@
 		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 @@
 		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 @@
 		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::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 @@
 			sprintf(buf, "%d", (*it)->getMappedKey()->id);
 		else
 			strcpy(buf, "");
-		domain->setVal(key, buf);
+		_configDomain->setVal(key, buf);
 	}
 }
 

Modified: scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap.h
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap.h	2008-08-14 00:26:57 UTC (rev 33852)
+++ scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymap.h	2008-08-14 01:42:02 UTC (rev 33853)
@@ -81,19 +81,20 @@
 	 */
 	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 @@
 	Keymap *_parent;
 	List<Action*> _actions;
 	HashMap<KeyState, Action*> _keymap; 
+	ConfigManager::Domain *_configDomain;
 
 };
 

Modified: scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymapper.cpp
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymapper.cpp	2008-08-14 00:26:57 UTC (rev 33852)
+++ scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymapper.cpp	2008-08-14 01:42:02 UTC (rev 33853)
@@ -52,20 +52,28 @@
 	_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);
 }
 

Modified: scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymapper.h
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymapper.h	2008-08-14 00:26:57 UTC (rev 33852)
+++ scummvm/branches/gsoc2008-vkeybd/backends/keymapper/keymapper.h	2008-08-14 01:42:02 UTC (rev 33853)
@@ -41,6 +41,7 @@
 	struct MapRecord {
 		Keymap* keymap;
 		bool inherit;
+		bool global;
 	};
 
 	Keymapper(EventManager *eventMan);
@@ -61,13 +62,18 @@
 	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 @@
 
 private:
 
-	void pushKeymap(Keymap *newMap, bool inherit);
+	void pushKeymap(Keymap *newMap, bool inherit, bool global);
 
 	typedef List<HardwareKey*>::iterator Iterator;
 

Modified: scummvm/branches/gsoc2008-vkeybd/backends/keymapper/remap-dialog.cpp
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/keymapper/remap-dialog.cpp	2008-08-14 00:26:57 UTC (rev 33852)
+++ scummvm/branches/gsoc2008-vkeybd/backends/keymapper/remap-dialog.cpp	2008-08-14 01:42:02 UTC (rev 33853)
@@ -51,9 +51,11 @@
 }
 
 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 @@
 	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 @@
 	}
 
 	_changes = false;
+
+	Dialog::open();
+
 	_kmPopUp->setSelected(0);
 	loadKeymap();
-
-	Dialog::open();
 }
 
 void RemapDialog::close() {
@@ -105,7 +109,8 @@
 		free(_keymapTable);
 		_keymapTable = 0;
 	}
-	if (_changes) ConfMan.flushToDisk();
+	if (_changes) 
+		ConfMan.flushToDisk();
 	Dialog::close();
 }
 
@@ -260,7 +265,9 @@
 		}
 
 	} 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++) {

Modified: scummvm/branches/gsoc2008-vkeybd/common/stack.h
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/common/stack.h	2008-08-14 00:26:57 UTC (rev 33852)
+++ scummvm/branches/gsoc2008-vkeybd/common/stack.h	2008-08-14 01:42:02 UTC (rev 33853)
@@ -88,7 +88,11 @@
 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();
 	}


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list