aboutsummaryrefslogtreecommitdiff
path: root/backends/common/keymap-manager.cpp
blob: 9386dc5b5ee8c33f80636cee738a03e975b6c269 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include "backends/common/keymap-manager.h"

namespace Common {


void KeymapManager::Domain::addDefaultKeymap(Keymap *map) {
	_defaultKeymap = map;
}

void KeymapManager::Domain::addKeymap(const String& name, Keymap *map) {
	if (_keymaps.contains(name))
		delete _keymaps[name];
	_keymaps[name] = map;
}

void KeymapManager::Domain::deleteAllKeyMaps() {
	KeymapMap::iterator it;
	for (it = _keymaps.begin(); it != _keymaps.end(); it++)
		delete it->_value;
	_keymaps.clear();
}

Keymap *KeymapManager::Domain::getDefaultKeymap() {
	return _defaultKeymap;
}

Keymap *KeymapManager::Domain::getKeymap(const String& name) {
	KeymapMap::iterator it = _keymaps.find(name);
	if (it != _keymaps.end())
		return it->_value;
	else
		return 0;
}

void KeymapManager::registerHardwareKeySet(HardwareKeySet *keys) {
	if (_hardwareKeys)
		error("Hardware key set already registered!");
	_hardwareKeys = keys;
}

void KeymapManager::registerDefaultGlobalKeymap(Keymap *map) {
	ConfigManager::Domain *dom = ConfMan.getDomain(ConfigManager::kApplicationDomain);
	assert(dom);
	initKeymap(dom, "default", map);
	_globalDomain.addDefaultKeymap(map);
}

void KeymapManager::registerGlobalKeymap(const String& name, Keymap *map) {
	ConfigManager::Domain *dom = ConfMan.getDomain(ConfigManager::kApplicationDomain);
	assert(dom);

	initKeymap(dom, name, map);
	_globalDomain.addKeymap(name, map);
}

void KeymapManager::registerDefaultGameKeymap(Keymap *map) {
	ConfigManager::Domain *dom = ConfMan.getActiveDomain();
	assert(dom);

	initKeymap(dom, "default", map);
	_gameDomain.addDefaultKeymap(map);
}

void KeymapManager::registerGameKeymap(const String& name, Keymap *map) {
	ConfigManager::Domain *dom = ConfMan.getActiveDomain();
	assert(dom);

	initKeymap(dom, name, map);
	_gameDomain.addKeymap(name, map);
}

void KeymapManager::initKeymap(ConfigManager::Domain *domain, 
							   const String& name, 
							   Keymap *map) {
	if (!loadKeymap(domain, name, map))
		return;
	automaticMap(map);
}

bool KeymapManager::loadKeymap(ConfigManager::Domain *domain, 
							   const String& name, 
							   Keymap *map) {
	ConfigManager::Domain::iterator it;	
	String prefix = "km_" + name + "_";
	for (it = domain->begin(); it != domain->end(); it++) {
		const String& key = it->_key;
		if (!key.hasPrefix(prefix.c_str()))
			continue;

		// parse UserAction ID
		const char *actionIdStart = key.c_str() + prefix.size();
		char *err;
		int32 actionId = (int32) strtol(actionIdStart, &err, 0);
		if (err == actionIdStart) {
			warning("'%s' is not a valid UserAction ID", err);
			continue;
		}
		UserAction *ua = map->getUserAction(actionId);
		if (!ua) {
			warning("'%s' keymap does not contain UserAction with ID %d", 
				name.c_str(), (int)actionId);
			continue;
		}

		// parse HardwareKey ID
		int32 hwKeyId = (int32) strtol(it->_value.c_str(), &err, 0);
		if (err == it->_value.c_str()) {
			warning("'%s' is not a valid HardwareKey ID", err);
			continue;
		}
		const HardwareKey *hwKey = _hardwareKeys->findHardwareKey(hwKeyId);
		if (!hwKey) {
			warning("HardwareKey with ID %d not known", (int)hwKeyId);
			continue;
		}

		ua->mapKey(hwKey);
	}
	return isMapComplete(map);
}

bool KeymapManager::isMapComplete(const Keymap *map) {
	return false;
}

void KeymapManager::saveKeymap(ConfigManager::Domain *domain, 
							   const String& name, 
							   const Keymap *map) {
	const Array<UserAction>& actions = map->getUserActions();
	Array<UserAction>::const_iterator it;
	char buf[11];
	for (it = actions.begin(); it != actions.end(); it++) {
		String key("km_");
		sprintf(buf, "%d", it->id);
		key += name + "_" + buf;
		if (it->getMappedKey())
			sprintf(buf, "%d", it->getMappedKey()->id);
		else
			strcpy(buf, "");
		domain->setVal(key, buf);
	}
}


void KeymapManager::automaticMap(Keymap *map) {

}

void KeymapManager::unregisterAllGameKeymaps() {
	_gameDomain.deleteAllKeyMaps();
}

Keymap *KeymapManager::getKeymap(const String& name) {
	Keymap *keymap = _gameDomain.getKeymap(name);
	if (!keymap)
		_globalDomain.getKeymap(name);
	return keymap;
}

} // end of namespace Common