1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
26 Action(const Action &i_action);
33 virtual Type getType() const = 0;
35 virtual Action *clone() const = 0;
37 virtual tostream &output(tostream &i_ost) const = 0;
41 tostream &operator<<(tostream &i_ost, const Action &i_action);
44 class ActionKey : public Action
48 const ModifiedKey m_modifiedKey;
51 ActionKey(const ActionKey &i_actionKey);
55 ActionKey(const ModifiedKey &i_mk);
57 virtual Type getType() const;
59 virtual Action *clone() const;
61 virtual tostream &output(tostream &i_ost) const;
67 class ActionKeySeq : public Action
70 KeySeq * const m_keySeq; ///
73 ActionKeySeq(const ActionKeySeq &i_actionKeySeq);
77 ActionKeySeq(KeySeq *i_keySeq);
79 virtual Type getType() const;
81 virtual Action *clone() const;
83 virtual tostream &output(tostream &i_ost) const;
88 class ActionFunction : public Action
91 FunctionData * const m_functionData; /// function data
92 const Modifier m_modifier; /// modifier for &Sync
95 ActionFunction(const ActionFunction &i_actionFunction);
99 ActionFunction(FunctionData *i_functionData,
100 Modifier i_modifier = Modifier());
102 virtual ~ActionFunction();
104 virtual Type getType() const;
106 virtual Action *clone() const;
108 virtual tostream &output(tostream &i_ost) const;
116 typedef std::vector<Action *> Actions; ///
119 Actions m_actions; ///
121 Modifier::Type m_mode; /** Either Modifier::Type_KEYSEQ
122 or Modifier::Type_ASSIGN */
132 KeySeq(const tstringi &i_name);
134 KeySeq(const KeySeq &i_ks);
139 const Actions &getActions() const { return m_actions; }
142 KeySeq &operator=(const KeySeq &i_ks);
145 KeySeq &add(const Action &i_action);
147 /// get the first modified key of this key sequence
148 ModifiedKey getFirstModifiedKey() const;
151 const tstringi &getName() const { return m_name; }
154 friend tostream &operator<<(tostream &i_ost, const KeySeq &i_ks);
157 bool isCorrectMode(Modifier::Type i_mode) { return m_mode <= i_mode; }
160 void setMode(Modifier::Type i_mode)
164 ASSERT( m_mode == Modifier::Type_KEYSEQ ||
165 m_mode == Modifier::Type_ASSIGN);
169 Modifier::Type getMode() const { return m_mode; }
180 Type_keymap, /// this is keymap
181 Type_windowAnd, /// this is window &&
182 Type_windowOr, /// this is window ||
190 AO_overwrite, /// !, !!
195 AM_notModifier, /// not modifier
196 AM_normal, /// normal modifier
197 AM_true, /** ! true modifier(doesn't
198 generate scan code) */
199 AM_oneShot, /// !! one shot modifier
200 AM_oneShotRepeatable, /// !!! one shot modifier
207 ModifiedKey m_modifiedKey; ///
208 KeySeq *m_keySeq; ///
212 KeyAssignment(const ModifiedKey &i_modifiedKey, KeySeq *i_keySeq)
213 : m_modifiedKey(i_modifiedKey), m_keySeq(i_keySeq) { }
215 KeyAssignment(const KeyAssignment &i_o)
216 : m_modifiedKey(i_o.m_modifiedKey), m_keySeq(i_o.m_keySeq) { }
218 bool operator<(const KeyAssignment &i_o) const
219 { return m_modifiedKey < i_o.m_modifiedKey; }
222 /// modifier assignments
226 AssignOperator m_assignOperator; ///
227 AssignMode m_assignMode; ///
230 typedef std::list<ModAssignment> ModAssignments; ///
232 /// parameter for describe();
236 typedef std::list<ModifiedKey> DescribedKeys;
237 typedef std::list<const Keymap *> DescribedKeymap;
242 DescribedKeymap m_dkeymap;
243 bool m_doesDescribeModifiers;
246 DescribeParam() : m_doesDescribeModifiers(true) { }
250 /// key assignments (hashed by first scan code)
251 typedef std::list<KeyAssignment> KeyAssignments;
253 HASHED_KEY_ASSIGNMENT_SIZE = 32, ///
257 KeyAssignments m_hashedKeyAssignments[HASHED_KEY_ASSIGNMENT_SIZE]; ///
259 /// modifier assignments
260 ModAssignments m_modAssignments[Modifier::Type_ASSIGN];
262 Type m_type; /// type
263 tstringi m_name; /// keymap name
264 tregex m_windowClass; /// window class name regexp
265 tregex m_windowTitle; /// window title name regexp
267 KeySeq *m_defaultKeySeq; /// default keySeq
268 Keymap *m_parentKeymap; /// parent keymap
272 KeyAssignments &getKeyAssignments(const ModifiedKey &i_mk);
274 const KeyAssignments &getKeyAssignments(const ModifiedKey &i_mk) const;
279 const tstringi &i_name,
280 const tstringi &i_windowClass,
281 const tstringi &i_windowTitle,
282 KeySeq *i_defaultKeySeq,
283 Keymap *i_parentKeymap);
285 /// add a key assignment;
286 void addAssignment(const ModifiedKey &i_mk, KeySeq *i_keySeq);
289 void addModifier(Modifier::Type i_mt, AssignOperator i_ao,
290 AssignMode i_am, Key *i_key);
293 const KeyAssignment *searchAssignment(const ModifiedKey &i_mk) const;
296 const KeySeq *getDefaultKeySeq() const { return m_defaultKeySeq; }
298 Keymap *getParentKeymap() const { return m_parentKeymap; }
300 const tstringi &getName() const { return m_name; }
303 bool doesSameWindow(const tstringi i_className,
304 const tstringi &i_titleName);
307 void adjustModifier(Keyboard &i_keyboard);
309 /// get modAssignments
310 const ModAssignments &getModAssignments(Modifier::Type i_mt) const
311 { return m_modAssignments[i_mt]; }
314 void describe(tostream &i_ost, DescribeParam *i_dp) const;
316 /// set default keySeq and parent keymap if default keySeq has not been set
317 bool setIfNotYet(KeySeq *i_keySeq, Keymap *i_parentKeymap);
322 extern tostream &operator<<(tostream &i_ost, const Keymap *i_keymap);
329 typedef std::list<Keymap *> KeymapPtrList; ///
332 typedef std::list<Keymap> KeymapList; ///
335 KeymapList m_keymapList; /** pointer into keymaps may
343 Keymap *searchByName(const tstringi &i_name);
346 void searchWindow(KeymapPtrList *o_keymapPtrList,
347 const tstringi &i_className,
348 const tstringi &i_titleName);
351 Keymap *add(const Keymap &i_keymap);
354 void adjustModifier(Keyboard &i_keyboard);
362 typedef std::list<KeySeq> KeySeqList; ///
365 KeySeqList m_keySeqList; ///
368 /// add a named keyseq (name can be empty)
369 KeySeq *add(const KeySeq &i_keySeq);
372 KeySeq *searchByName(const tstringi &i_name);