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