diff options
Diffstat (limited to 'backends/common')
| -rw-r--r-- | backends/common/keymap.cpp | 49 | ||||
| -rw-r--r-- | backends/common/keymap.h | 55 | ||||
| -rw-r--r-- | backends/common/keymapper.h | 9 | 
3 files changed, 76 insertions, 37 deletions
diff --git a/backends/common/keymap.cpp b/backends/common/keymap.cpp index 7e6297917b..9fb80bcc58 100644 --- a/backends/common/keymap.cpp +++ b/backends/common/keymap.cpp @@ -3,16 +3,23 @@  namespace Common {  Keymap::Keymap(const Keymap& km) : _actions(km._actions), _keymap() { +	init();  	for (uint i = 0; i < _actions.size(); i++) { -		if (_actions[i]._hwKey) { -			_keymap[_actions[i]._hwKey->key] = &_actions[i]; +		if (_actions[i].hwKey) { +			_keymap[_actions[i].hwKey->key] = &_actions[i];  		}  	}  } +void Keymap::init() { +	_actions.reserve(20); +} +  void Keymap::addAction(const UserAction& action) { +	if (findUserAction(action.id)) +		error("UserAction with id %d already in KeyMap!\n", action.id);  	_actions.push_back(action); -	_actions[_actions.size()-1]._hwKey = 0; +	_actions[_actions.size()-1].hwKey = 0;  }  void Keymap::mapKeyToAction(UserAction *action, HardwareKey *key) { @@ -25,10 +32,10 @@ void Keymap::mapKeyToAction(UserAction *action, HardwareKey *key) {  	error("UserAction not contained in KeyMap\n");  } -void Keymap::mapKeyToAction(uint idx, HardwareKey *key) { -	if (idx >= _actions.size()) -		error("Key map index out of bounds!\n"); -	internalMapKey(&_actions[idx], key); +void Keymap::mapKeyToAction(int32 id, HardwareKey *key) { +	UserAction *act = findUserAction(id); +	if (act) +		internalMapKey(act, key);  }  void Keymap::internalMapKey(UserAction *action, HardwareKey *hwKey) { @@ -36,13 +43,35 @@ void Keymap::internalMapKey(UserAction *action, HardwareKey *hwKey) {  	it = _keymap.find(hwKey->key);  	// if key is already mapped to an action then un-map it  	if (it != _keymap.end()) -		it->_value->_hwKey = 0; +		it->_value->hwKey = 0; -	action->_hwKey = hwKey; +	action->hwKey = hwKey;  	_keymap[hwKey->key] = action;  } -UserAction *Keymap::getMappedAction(KeyState ks) { +const UserAction *Keymap::getUserAction(int32 id) const { +	return findUserAction(id); +} + +UserAction *Keymap::findUserAction(int32 id) { +	Array<UserAction>::iterator it; +	for (it = _actions.begin(); it != _actions.end(); it++) { +		if (it->id == id) +			return &*it; +	} +	return 0; +} + +const UserAction *Keymap::findUserAction(int32 id) const { +	Array<UserAction>::const_iterator it; +	for (it = _actions.begin(); it != _actions.end(); it++) { +		if (it->id == id) +			return &*it; +	} +	return 0; +} + +UserAction *Keymap::getMappedAction(KeyState ks) const {  	HashMap<KeyState, UserAction*>::iterator it;  	it = _keymap.find(ks);  	if (it == _keymap.end()) diff --git a/backends/common/keymap.h b/backends/common/keymap.h index 75350a992b..c03e2e03d5 100644 --- a/backends/common/keymap.h +++ b/backends/common/keymap.h @@ -9,7 +9,6 @@  namespace Common { -  enum UserActionType {  	kGenericUserActionType, @@ -39,18 +38,19 @@ enum UserActionCategory {  * Describes an available hardware key   */  struct HardwareKey { +	/** unique id used for saving/loading to config */ +	int32 id; +	/** Human readable description */ +	String description;   	/**   	* The KeyState that is generated by the back-end   	* when this hardware key is pressed.  	*/  	KeyState key; -	/** Human readable description */ -	String description;  -  	UserActionCategory preferredCategory;  	UserActionType preferredType; -	int group; +	int16 group;  	HardwareKey(KeyState ks = KeyState(), String des = "",  			UserActionCategory cat = kGenericUserActionCategory, @@ -64,16 +64,20 @@ struct HardwareKey {  };  struct UserAction { -	/** Events to be sent when mapped key is pressed */ -	List<Event> events; +	/** unique id used for saving/loading to config */ +	int32 id;  	/** Human readable description */  	String description; +	/** Events to be sent when mapped key is pressed */ +	List<Event> events;  	UserActionCategory category;  	UserActionType type;  	int priority;  	int group;  	int flags; +	HardwareKey *hwKey; +  	UserAction(	String des = "",   				UserActionCategory cat = kGenericUserActionCategory,  				UserActionType ty = kGenericUserActionType, @@ -84,17 +88,8 @@ struct UserAction {  		priority = pr;  		group = gr;  		flags = fl; -		_hwKey = 0; +		hwKey = 0;  	} - -	friend class Keymap; - -	HardwareKey *mappedKey() { return _hwKey; } -private: -	/**  -	* Key that is mapped to this UserAction, only KeyMap can set this -	*/ -	HardwareKey *_hwKey;  };  /** @@ -123,10 +118,12 @@ template<> struct Hash<KeyState>  class Keymap {  public: - -	Keymap() {} +	Keymap() { init(); }  	Keymap(const Keymap& km); +private: +	void init(); +public:  	/**  	 * Adds a new UserAction to this Map,   	 * adding it at the back of the internal array @@ -144,25 +141,35 @@ public:  	void mapKeyToAction(UserAction *action, HardwareKey *key);  	/** -	 * Maps a HardwareKey to the UserAction at the given index -	 * @param index Index of UserAction in the internal array +	 * Maps a HardwareKey to the UserAction of the given id +	 * @param id id of the UserAction to map to  	 * @param key pointer to HardwareKey to map  	 */ -	void mapKeyToAction(uint index, HardwareKey *key); +	void mapKeyToAction(int32 id, HardwareKey *key); + +	/** +	 * Retrieves the UserAction with the given id +	 * @param id id of UserAction to retrieve +	 * @return Pointer to the UserAction or 0 if not found +	 */ +	const UserAction *getUserAction(int32 id) const;  	/**  	 * Get a read-only array of all the UserActions contained in this Keymap  	 */ -	const Array<UserAction>& getUserActions() { return _actions; } +	const Array<UserAction>& getUserActions() const { return _actions; }  	/**  	 * Find the UserAction that a key is mapped to  	 * @param key the key that is mapped to the required UserAction  	 * @return a pointer to the UserAction or 0 if no  	 */ -	UserAction *getMappedAction(KeyState key); +	UserAction *getMappedAction(KeyState key) const;  private: +	 +	UserAction *findUserAction(int32 id); +	const UserAction *findUserAction(int32 id) const;  	void internalMapKey(UserAction *action, HardwareKey *hwKey); diff --git a/backends/common/keymapper.h b/backends/common/keymapper.h index fd1e46968e..1b3518c224 100644 --- a/backends/common/keymapper.h +++ b/backends/common/keymapper.h @@ -10,14 +10,17 @@ public:  	Keymapper(); -	 +	void addHardwareKey(const HardwareKey& key); +	void addGlobalKeyMap(const String& name, Keymap& keymap);  private:  	KeymapManager _manager; -	List<HardwareKey> _hardwareKeys; +	List<HardwareKey*> _hardwareKeys;  }; -} // end of namespace Common
\ No newline at end of file +} // end of namespace Common + +#endif
\ No newline at end of file  | 
