00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef COSXKEYSTATE_H
00020 #define COSXKEYSTATE_H
00021
00022 #include <Carbon/Carbon.h>
00023 #include "CKeyState.h"
00024 #include "stdmap.h"
00025 #include "stdset.h"
00026 #include "stdvector.h"
00027
00028 #if defined(MAC_OS_X_VERSION_10_5)
00029 typedef TISInputSourceRef KeyLayout;
00030 #else
00031 typedef KeyboardLayoutRef KeyLayout;
00032 #endif
00033
00035
00038 class COSXKeyState : public CKeyState {
00039 public:
00040 typedef std::vector<KeyID> CKeyIDs;
00041
00042 COSXKeyState();
00043 COSXKeyState(IEventQueue& eventQueue, CKeyMap& keyMap);
00044 virtual ~COSXKeyState();
00045
00047
00048
00050
00054 void handleModifierKeys(void* target,
00055 KeyModifierMask oldMask, KeyModifierMask newMask);
00056
00058
00059
00060
00062
00066 KeyModifierMask mapModifiersFromOSX(UInt32 mask) const;
00067
00069
00072 KeyModifierMask mapModifiersToCarbon(UInt32 mask) const;
00073
00075
00082 KeyButton mapKeyFromEvent(CKeyIDs& ids,
00083 KeyModifierMask* maskOut, CGEventRef event) const;
00084
00086
00090 bool mapSynergyHotKeyToMac(KeyID key, KeyModifierMask mask,
00091 UInt32& macVirtualKey,
00092 UInt32& macModifierMask) const;
00093
00095
00096
00097 virtual bool fakeCtrlAltDel();
00098 virtual KeyModifierMask
00099 pollActiveModifiers() const;
00100 virtual SInt32 pollActiveGroup() const;
00101 virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const;
00102
00103 protected:
00104
00105 virtual void getKeyMap(CKeyMap& keyMap);
00106 virtual void fakeKey(const Keystroke& keystroke);
00107
00108 private:
00109 class CKeyResource;
00110 typedef std::vector<KeyLayout> GroupList;
00111
00112
00113 void getKeyMapForSpecialKeys(
00114 CKeyMap& keyMap, SInt32 group) const;
00115
00116
00117 bool getKeyMap(CKeyMap& keyMap,
00118 SInt32 group, const CKeyResource& r) const;
00119
00120
00121 bool getGroups(GroupList&) const;
00122
00123
00124 void setGroup(SInt32 group);
00125
00126
00127
00128 void checkKeyboardLayout();
00129
00130
00131 void handleModifierKey(void* target,
00132 UInt32 virtualKey, KeyID id,
00133 bool down, KeyModifierMask newMask);
00134
00135
00136
00137
00138
00139
00140
00141 void adjustAltGrModifier(const CKeyIDs& ids,
00142 KeyModifierMask* mask, bool isCommand) const;
00143
00144
00145
00146 static KeyButton mapVirtualKeyToKeyButton(UInt32 keyCode);
00147
00148
00149
00150 static UInt32 mapKeyButtonToVirtualKey(KeyButton keyButton);
00151
00152 void init();
00153
00154 private:
00155 class CKeyResource : public IInterface {
00156 public:
00157 virtual bool isValid() const = 0;
00158 virtual UInt32 getNumModifierCombinations() const = 0;
00159 virtual UInt32 getNumTables() const = 0;
00160 virtual UInt32 getNumButtons() const = 0;
00161 virtual UInt32 getTableForModifier(UInt32 mask) const = 0;
00162 virtual KeyID getKey(UInt32 table, UInt32 button) const = 0;
00163
00164
00165 static KeyID getKeyID(UInt8);
00166
00167
00168 static KeyID unicharToKeyID(UniChar);
00169 };
00170
00171
00172 class CUCHRKeyResource : public CKeyResource {
00173 public:
00174 CUCHRKeyResource(const void*, UInt32 keyboardType);
00175
00176
00177 virtual bool isValid() const;
00178 virtual UInt32 getNumModifierCombinations() const;
00179 virtual UInt32 getNumTables() const;
00180 virtual UInt32 getNumButtons() const;
00181 virtual UInt32 getTableForModifier(UInt32 mask) const;
00182 virtual KeyID getKey(UInt32 table, UInt32 button) const;
00183
00184 private:
00185 typedef std::vector<KeyID> KeySequence;
00186
00187 bool getDeadKey(KeySequence& keys, UInt16 index) const;
00188 bool getKeyRecord(KeySequence& keys,
00189 UInt16 index, UInt16& state) const;
00190 bool addSequence(KeySequence& keys, UCKeyCharSeq c) const;
00191
00192 private:
00193 const UCKeyboardLayout* m_resource;
00194 const UCKeyModifiersToTableNum* m_m;
00195 const UCKeyToCharTableIndex* m_cti;
00196 const UCKeySequenceDataIndex* m_sdi;
00197 const UCKeyStateRecordsIndex* m_sri;
00198 const UCKeyStateTerminators* m_st;
00199 UInt16 m_spaceOutput;
00200 };
00201
00202
00203
00204
00205
00206 enum {
00207 KeyButtonOffset = 1
00208 };
00209
00210 typedef std::map<KeyLayout, SInt32> GroupMap;
00211 typedef std::map<UInt32, KeyID> CVirtualKeyMap;
00212
00213 CVirtualKeyMap m_virtualKeyMap;
00214 mutable UInt32 m_deadKeyState;
00215 GroupList m_groups;
00216 GroupMap m_groupMap;
00217
00218
00219 bool shiftPressed;
00220 bool controlPressed;
00221 bool altPressed;
00222 bool superPressed;
00223 bool capsPressed;
00224 };
00225
00226 #endif