1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\r
8 # include "keyboard.h"
\r
9 # include "function.h"
\r
25 Action(const Action &i_action);
\r
30 virtual ~Action() { }
\r
32 virtual Type getType() const = 0;
\r
34 virtual Action *clone() const = 0;
\r
36 virtual tostream &output(tostream &i_ost) const = 0;
\r
40 tostream &operator<<(tostream &i_ost, const Action &i_action);
\r
43 class ActionKey : public Action
\r
47 const ModifiedKey m_modifiedKey;
\r
50 ActionKey(const ActionKey &i_actionKey);
\r
54 ActionKey(const ModifiedKey &i_mk);
\r
56 virtual Type getType() const;
\r
58 virtual Action *clone() const;
\r
60 virtual tostream &output(tostream &i_ost) const;
\r
66 class ActionKeySeq : public Action
\r
69 KeySeq * const m_keySeq; ///
\r
72 ActionKeySeq(const ActionKeySeq &i_actionKeySeq);
\r
76 ActionKeySeq(KeySeq *i_keySeq);
\r
78 virtual Type getType() const;
\r
80 virtual Action *clone() const;
\r
82 virtual tostream &output(tostream &i_ost) const;
\r
87 class ActionFunction : public Action
\r
90 FunctionData * const m_functionData; /// function data
\r
91 const Modifier m_modifier; /// modifier for &Sync
\r
94 ActionFunction(const ActionFunction &i_actionFunction);
\r
98 ActionFunction(FunctionData *i_functionData,
\r
99 Modifier i_modifier = Modifier());
\r
101 virtual ~ActionFunction();
\r
103 virtual Type getType() const;
\r
105 virtual Action *clone() const;
\r
107 virtual tostream &output(tostream &i_ost) const;
\r
115 typedef std::vector<Action *> Actions; ///
\r
118 Actions m_actions; ///
\r
119 tstringi m_name; ///
\r
120 Modifier::Type m_mode; /** Either Modifier::Type_KEYSEQ
\r
121 or Modifier::Type_ASSIGN */
\r
131 KeySeq(const tstringi &i_name);
\r
133 KeySeq(const KeySeq &i_ks);
\r
138 const Actions &getActions() const {
\r
143 KeySeq &operator=(const KeySeq &i_ks);
\r
146 KeySeq &add(const Action &i_action);
\r
148 /// get the first modified key of this key sequence
\r
149 ModifiedKey getFirstModifiedKey() const;
\r
152 const tstringi &getName() const {
\r
157 friend tostream &operator<<(tostream &i_ost, const KeySeq &i_ks);
\r
160 bool isCorrectMode(Modifier::Type i_mode) {
\r
161 return m_mode <= i_mode;
\r
165 void setMode(Modifier::Type i_mode) {
\r
166 if (m_mode < i_mode)
\r
168 ASSERT( m_mode == Modifier::Type_KEYSEQ ||
\r
169 m_mode == Modifier::Type_ASSIGN);
\r
173 Modifier::Type getMode() const {
\r
185 Type_keymap, /// this is keymap
\r
186 Type_windowAnd, /// this is window &&
\r
187 Type_windowOr, /// this is window ||
\r
190 enum AssignOperator {
\r
194 AO_overwrite, /// !, !!
\r
198 AM_notModifier, /// not modifier
\r
199 AM_normal, /// normal modifier
\r
200 AM_true, /** ! true modifier(doesn't
\r
201 generate scan code) */
\r
202 AM_oneShot, /// !! one shot modifier
\r
203 AM_oneShotRepeatable, /// !!! one shot modifier
\r
207 class KeyAssignment
\r
210 ModifiedKey m_modifiedKey; ///
\r
211 KeySeq *m_keySeq; ///
\r
215 KeyAssignment(const ModifiedKey &i_modifiedKey, KeySeq *i_keySeq)
\r
216 : m_modifiedKey(i_modifiedKey), m_keySeq(i_keySeq) { }
\r
218 KeyAssignment(const KeyAssignment &i_o)
\r
219 : m_modifiedKey(i_o.m_modifiedKey), m_keySeq(i_o.m_keySeq) { }
\r
221 bool operator<(const KeyAssignment &i_o) const {
\r
222 return m_modifiedKey < i_o.m_modifiedKey;
\r
226 /// modifier assignments
\r
227 class ModAssignment
\r
230 AssignOperator m_assignOperator; ///
\r
231 AssignMode m_assignMode; ///
\r
234 typedef std::list<ModAssignment> ModAssignments; ///
\r
236 /// parameter for describe();
\r
237 class DescribeParam
\r
240 typedef std::list<ModifiedKey> DescribedKeys;
\r
241 typedef std::list<const Keymap *> DescribedKeymap;
\r
242 friend class Keymap;
\r
245 DescribedKeys m_dk;
\r
246 DescribedKeymap m_dkeymap;
\r
247 bool m_doesDescribeModifiers;
\r
250 DescribeParam() : m_doesDescribeModifiers(true) { }
\r
254 /// key assignments (hashed by first scan code)
\r
255 typedef std::list<KeyAssignment> KeyAssignments;
\r
257 HASHED_KEY_ASSIGNMENT_SIZE = 32, ///
\r
261 KeyAssignments m_hashedKeyAssignments[HASHED_KEY_ASSIGNMENT_SIZE]; ///
\r
263 /// modifier assignments
\r
264 ModAssignments m_modAssignments[Modifier::Type_ASSIGN];
\r
266 Type m_type; /// type
\r
267 tstringi m_name; /// keymap name
\r
268 tregex m_windowClass; /// window class name regexp
\r
269 tregex m_windowTitle; /// window title name regexp
\r
271 KeySeq *m_defaultKeySeq; /// default keySeq
\r
272 Keymap *m_parentKeymap; /// parent keymap
\r
276 KeyAssignments &getKeyAssignments(const ModifiedKey &i_mk);
\r
278 const KeyAssignments &getKeyAssignments(const ModifiedKey &i_mk) const;
\r
282 Keymap(Type i_type,
\r
283 const tstringi &i_name,
\r
284 const tstringi &i_windowClass,
\r
285 const tstringi &i_windowTitle,
\r
286 KeySeq *i_defaultKeySeq,
\r
287 Keymap *i_parentKeymap);
\r
289 /// add a key assignment;
\r
290 void addAssignment(const ModifiedKey &i_mk, KeySeq *i_keySeq);
\r
293 void addModifier(Modifier::Type i_mt, AssignOperator i_ao,
\r
294 AssignMode i_am, Key *i_key);
\r
297 const KeyAssignment *searchAssignment(const ModifiedKey &i_mk) const;
\r
300 const KeySeq *getDefaultKeySeq() const {
\r
301 return m_defaultKeySeq;
\r
304 Keymap *getParentKeymap() const {
\r
305 return m_parentKeymap;
\r
308 const tstringi &getName() const {
\r
312 /// does same window
\r
313 bool doesSameWindow(const tstringi i_className,
\r
314 const tstringi &i_titleName);
\r
316 /// adjust modifier
\r
317 void adjustModifier(Keyboard &i_keyboard);
\r
319 /// get modAssignments
\r
320 const ModAssignments &getModAssignments(Modifier::Type i_mt) const {
\r
321 return m_modAssignments[i_mt];
\r
325 void describe(tostream &i_ost, DescribeParam *i_dp) const;
\r
327 /// set default keySeq and parent keymap if default keySeq has not been set
\r
328 bool setIfNotYet(KeySeq *i_keySeq, Keymap *i_parentKeymap);
\r
333 extern tostream &operator<<(tostream &i_ost, const Keymap *i_keymap);
\r
340 typedef std::list<Keymap *> KeymapPtrList; ///
\r
343 typedef std::list<Keymap> KeymapList; ///
\r
346 KeymapList m_keymapList; /** pointer into keymaps may
\r
354 Keymap *searchByName(const tstringi &i_name);
\r
357 void searchWindow(KeymapPtrList *o_keymapPtrList,
\r
358 const tstringi &i_className,
\r
359 const tstringi &i_titleName);
\r
362 Keymap *add(const Keymap &i_keymap);
\r
364 /// adjust modifier
\r
365 void adjustModifier(Keyboard &i_keyboard);
\r
373 typedef std::list<KeySeq> KeySeqList; ///
\r
376 KeySeqList m_keySeqList; ///
\r
379 /// add a named keyseq (name can be empty)
\r
380 KeySeq *add(const KeySeq &i_keySeq);
\r
383 KeySeq *searchByName(const tstringi &i_name);
\r
387 #endif // !_KEYMAP_H
\r