1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\r
10 # include "stringtool.h"
\r
16 /// a scan code with flags
\r
22 BREAK = KEYBOARD_INPUT_DATA::BREAK, /// key release flag
\r
23 E0 = KEYBOARD_INPUT_DATA::E0, /// extended key flag
\r
24 E1 = KEYBOARD_INPUT_DATA::E1, /// extended key flag
\r
25 E0E1 = KEYBOARD_INPUT_DATA::E0E1, /// extended key flag
\r
34 ScanCode() : m_scan(0), m_flags(0) { }
\r
36 ScanCode(USHORT i_scan, USHORT i_flags)
\r
37 : m_scan(i_scan), m_flags(i_flags) { }
\r
39 bool operator==(const ScanCode &i_sc) const {
\r
40 return (m_scan == i_sc.m_scan &&
\r
41 (E0E1 & m_flags) == (E0E1 & i_sc.m_flags));
\r
44 bool operator!=(const ScanCode &i_sc) const {
\r
45 return !(*this == i_sc);
\r
56 MAX_SCAN_CODES_SIZE = 4,
\r
61 typedef std::vector<tstringi> Names;
\r
64 /// if this key pressed physically
\r
66 /// if this key pressed on Win32
\r
67 bool m_isPressedOnWin32;
\r
68 /// if this key pressed by assign
\r
69 bool m_isPressedByAssign;
\r
74 /// key scan code length
\r
75 size_t m_scanCodesSize;
\r
77 ScanCode m_scanCodes[MAX_SCAN_CODES_SIZE];
\r
82 : m_isPressed(false),
\r
83 m_isPressedOnWin32(false),
\r
84 m_isPressedByAssign(false),
\r
85 m_scanCodesSize(0) { }
\r
87 /// for Event::* only
\r
88 Key(const tstringi &i_name)
\r
89 : m_isPressed(false),
\r
90 m_isPressedOnWin32(false),
\r
91 m_isPressedByAssign(false),
\r
92 m_scanCodesSize(0) {
\r
94 addScanCode(ScanCode());
\r
97 /// get key name (first name)
\r
98 const tstringi &getName() const {
\r
99 return m_names.front();
\r
103 const ScanCode *getScanCodes() const {
\r
104 return m_scanCodes;
\r
107 size_t getScanCodesSize() const {
\r
108 return m_scanCodesSize;
\r
111 /// add a name of key
\r
112 void addName(const tstringi &i_name);
\r
114 /// add a scan code
\r
115 void addScanCode(const ScanCode &i_sc);
\r
120 /// equation by name
\r
121 bool operator==(const tstringi &i_name) const;
\r
123 bool operator!=(const tstringi &i_name) const {
\r
124 return !(*this == i_name);
\r
127 /// is the scan code of this key ?
\r
128 bool isSameScanCode(const Key &i_key) const;
\r
130 /// is the i_key's scan code the prefix of this key's scan code ?
\r
131 bool isPrefixScanCode(const Key &i_key) const;
\r
134 friend tostream &operator<<(tostream &i_ost, const Key &i_key);
\r
137 bool operator<(const Key &i_key) const {
\r
138 return getName() < i_key.getName();
\r
147 typedef u_int64 MODIFIERS;
\r
149 MODIFIERS m_modifiers;
\r
151 MODIFIERS m_dontcares;
\r
156 Type_begin = 0, ///
\r
158 Type_Shift = Type_begin, /// <BASIC_MODIFIER>
\r
159 Type_Alt, /// <BASIC_MODIFIER>
\r
160 Type_Control, /// <BASIC_MODIFIER>
\r
161 Type_Windows, /// <BASIC_MODIFIER>
\r
164 Type_Up = Type_BASIC, /// <KEYSEQ_MODIFIER>
\r
165 Type_Down, /// <KEYSEQ_MODIFIER>
\r
168 Type_Repeat = Type_KEYSEQ, /// <ASSIGN_MODIFIER>
\r
169 Type_ImeLock, /// <ASSIGN_MODIFIER>
\r
170 Type_ImeComp, /// <ASSIGN_MODIFIER>
\r
171 Type_NumLock, /// <ASSIGN_MODIFIER>
\r
172 Type_CapsLock, /// <ASSIGN_MODIFIER>
\r
173 Type_ScrollLock, /// <ASSIGN_MODIFIER>
\r
174 Type_KanaLock, /// <ASSIGN_MODIFIER>
\r
175 Type_Maximized, /// <ASSIGN_MODIFIER>
\r
176 Type_Minimized, /// <ASSIGN_MODIFIER>
\r
177 Type_MdiMaximized, /// <ASSIGN_MODIFIER>
\r
178 Type_MdiMinimized, /// <ASSIGN_MODIFIER>
\r
179 Type_Touchpad, /// <ASSIGN_MODIFIER>
\r
180 Type_TouchpadSticky, /// <ASSIGN_MODIFIER>
\r
181 Type_Mod0, /// <ASSIGN_MODIFIER>
\r
182 Type_Mod1, /// <ASSIGN_MODIFIER>
\r
183 Type_Mod2, /// <ASSIGN_MODIFIER>
\r
184 Type_Mod3, /// <ASSIGN_MODIFIER>
\r
185 Type_Mod4, /// <ASSIGN_MODIFIER>
\r
186 Type_Mod5, /// <ASSIGN_MODIFIER>
\r
187 Type_Mod6, /// <ASSIGN_MODIFIER>
\r
188 Type_Mod7, /// <ASSIGN_MODIFIER>
\r
189 Type_Mod8, /// <ASSIGN_MODIFIER>
\r
190 Type_Mod9, /// <ASSIGN_MODIFIER>
\r
191 Type_Lock0, /// <ASSIGN_MODIFIER>
\r
192 Type_Lock1, /// <ASSIGN_MODIFIER>
\r
193 Type_Lock2, /// <ASSIGN_MODIFIER>
\r
194 Type_Lock3, /// <ASSIGN_MODIFIER>
\r
195 Type_Lock4, /// <ASSIGN_MODIFIER>
\r
196 Type_Lock5, /// <ASSIGN_MODIFIER>
\r
197 Type_Lock6, /// <ASSIGN_MODIFIER>
\r
198 Type_Lock7, /// <ASSIGN_MODIFIER>
\r
199 Type_Lock8, /// <ASSIGN_MODIFIER>
\r
200 Type_Lock9, /// <ASSIGN_MODIFIER>
\r
203 Type_end = Type_ASSIGN ///
\r
210 Modifier &on(Type i_type) {
\r
211 return press(i_type);
\r
214 Modifier &off(Type i_type) {
\r
215 return release(i_type);
\r
218 Modifier &press(Type i_type) {
\r
219 m_modifiers |= ((MODIFIERS(1)) << i_type);
\r
220 return care(i_type);
\r
223 Modifier &release(Type i_type) {
\r
224 m_modifiers &= ~((MODIFIERS(1)) << i_type);
\r
225 return care(i_type);
\r
228 Modifier &care(Type i_type) {
\r
229 m_dontcares &= ~((MODIFIERS(1)) << i_type);
\r
233 Modifier &dontcare(Type i_type) {
\r
234 m_dontcares |= ((MODIFIERS(1)) << i_type);
\r
237 /// set all modifiers to dontcare
\r
238 Modifier &dontcare() {
\r
239 m_dontcares = ~MODIFIERS(0);
\r
244 Modifier &on(Type i_type, bool i_isOn) {
\r
245 return press(i_type, i_isOn);
\r
248 Modifier &press(Type i_type, bool i_isPressed) {
\r
249 return i_isPressed ? press(i_type) : release(i_type);
\r
252 Modifier &care(Type i_type, bool i_doCare) {
\r
253 return i_doCare ? care(i_type) : dontcare(i_type);
\r
257 bool operator==(const Modifier &i_m) const {
\r
258 return m_modifiers == i_m.m_modifiers && m_dontcares == i_m.m_dontcares;
\r
261 /// add m's modifiers where this dontcare
\r
262 void add(const Modifier &i_m);
\r
263 //Modifier &operator+=(const Modifier &i_m);
\r
265 /** does match. (except dontcare modifiers) (is the m included in the *this
\r
267 bool doesMatch(const Modifier &i_m) const {
\r
268 return ((m_modifiers | m_dontcares) == (i_m.m_modifiers | m_dontcares));
\r
272 bool isOn(Type i_type) const {
\r
273 return isPressed(i_type);
\r
276 bool isPressed(Type i_type) const {
\r
277 return !!(m_modifiers & ((MODIFIERS(1)) << i_type));
\r
280 bool isDontcare(Type i_type) const {
\r
281 return !!(m_dontcares & ((MODIFIERS(1)) << i_type));
\r
285 friend tostream &operator<<(tostream &i_ost, const Modifier &i_m);
\r
288 bool operator<(const Modifier &i_m) const {
\r
289 return m_modifiers < i_m.m_modifiers ||
\r
290 (m_modifiers == i_m.m_modifiers && m_dontcares < i_m.m_dontcares);
\r
296 tostream &operator<<(tostream &i_ost, Modifier::Type i_type);
\r
303 Modifier m_modifier; ///
\r
308 ModifiedKey() : m_key(NULL) { }
\r
310 ModifiedKey(Key *i_key) : m_key(i_key) { }
\r
312 ModifiedKey(const Modifier &i_modifier, Key *i_key)
\r
313 : m_modifier(i_modifier), m_key(i_key) { }
\r
315 bool operator==(const ModifiedKey &i_mk) const {
\r
316 return m_modifier == i_mk.m_modifier && m_key == i_mk.m_key;
\r
319 bool operator!=(const ModifiedKey &i_mk) const {
\r
320 return !operator==(i_mk);
\r
324 friend tostream &operator<<(tostream &i_ost, const ModifiedKey &i_mk);
\r
327 bool operator<(const ModifiedKey &i_mk) const {
\r
328 return *m_key < *i_mk.m_key ||
\r
329 (!(*i_mk.m_key < *m_key) && m_modifier < i_mk.m_modifier);
\r
338 /// keyboard modifiers (pointer into Keys)
\r
339 typedef std::list<Key *> Mods;
\r
342 /** keyboard keys (hashed by first scan code).
\r
343 Keys must be *list* of Key.
\r
344 Because *pointers* into Keys exist anywhere in this program, the address
\r
345 of Key's elements must be fixed. */
\r
347 HASHED_KEYS_SIZE = 128, ///
\r
349 typedef std::list<Key> Keys; ///
\r
350 typedef std::map<tstringi, Key *> Aliases; /// key name aliases
\r
355 ModifiedKey m_mkeyFrom;
\r
356 ModifiedKey m_mkeyTo;
\r
358 Substitute(const ModifiedKey &i_mkeyFrom,
\r
359 const ModifiedKey &i_mkeyTo)
\r
360 : m_mkeyFrom(i_mkeyFrom), m_mkeyTo(i_mkeyTo) {
\r
363 typedef std::list<Substitute> Substitutes; /// substitutes
\r
366 Keys m_hashedKeys[HASHED_KEYS_SIZE]; ///
\r
367 Aliases m_aliases; ///
\r
368 Substitutes m_substitutes; ///
\r
369 Key m_syncKey; /// key used to synchronize
\r
373 Mods m_mods[Modifier::Type_BASIC];
\r
380 Keys *m_hashedKeys;
\r
382 size_t m_hashedKeysSize;
\r
384 Keys::iterator m_i;
\r
391 KeyIterator(Keys *i_hashedKeys, size_t i_hashedKeysSize);
\r
395 void operator++() {
\r
402 Keys &getKeys(const Key &i_key);
\r
406 void addKey(const Key &i_key);
\r
408 /// add a key name alias
\r
409 void addAlias(const tstringi &i_aliasName, Key *i_key);
\r
412 void addSubstitute(const ModifiedKey &i_mkeyFrom,
\r
413 const ModifiedKey &i_mkeyTo);
\r
416 Key *getSyncKey() {
\r
420 /// add a modifier key
\r
421 void addModifier(Modifier::Type i_mt, Key * i_key);
\r
424 Key *searchKey(const Key &i_key);
\r
426 /// search a key (of which the key's scan code is the prefix)
\r
427 Key *searchPrefixKey(const Key &i_key);
\r
429 /// search a key by name
\r
430 Key *searchKey(const tstringi &i_name);
\r
432 /// search a key by non-alias name
\r
433 Key *searchKeyByNonAliasName(const tstringi &i_name);
\r
435 /// search a substitute
\r
436 ModifiedKey searchSubstitute(const ModifiedKey &i_mkey);
\r
439 Mods &getModifiers(Modifier::Type i_mt) {
\r
440 return m_mods[i_mt];
\r
443 /// get key iterator
\r
444 KeyIterator getKeyIterator() {
\r
445 return KeyIterator(&m_hashedKeys[0], HASHED_KEYS_SIZE);
\r
450 #endif // !_KEYBOARD_H
\r