[1505] | 1 | /* |
---|
| 2 | The zlib/libpng License |
---|
| 3 | |
---|
| 4 | Copyright (c) 2005-2007 Phillip Castaneda (pjcast -- www.wreckedgames.com) |
---|
| 5 | |
---|
| 6 | This software is provided 'as-is', without any express or implied warranty. In no event will |
---|
| 7 | the authors be held liable for any damages arising from the use of this software. |
---|
| 8 | |
---|
| 9 | Permission is granted to anyone to use this software for any purpose, including commercial |
---|
| 10 | applications, and to alter it and redistribute it freely, subject to the following |
---|
| 11 | restrictions: |
---|
| 12 | |
---|
| 13 | 1. The origin of this software must not be misrepresented; you must not claim that |
---|
| 14 | you wrote the original software. If you use this software in a product, |
---|
| 15 | an acknowledgment in the product documentation would be appreciated but is |
---|
| 16 | not required. |
---|
| 17 | |
---|
| 18 | 2. Altered source versions must be plainly marked as such, and must not be |
---|
| 19 | misrepresented as being the original software. |
---|
| 20 | |
---|
| 21 | 3. This notice may not be removed or altered from any source distribution. |
---|
| 22 | */ |
---|
| 23 | #ifndef OIS_Keyboard_H |
---|
| 24 | #define OIS_Keyboard_H |
---|
| 25 | #include "OISObject.h" |
---|
| 26 | #include "OISEvents.h" |
---|
| 27 | |
---|
| 28 | namespace OIS |
---|
| 29 | { |
---|
| 30 | //! Keyboard scan codes |
---|
| 31 | enum KeyCode |
---|
| 32 | { |
---|
| 33 | KC_UNASSIGNED = 0x00, |
---|
| 34 | KC_ESCAPE = 0x01, |
---|
| 35 | KC_1 = 0x02, |
---|
| 36 | KC_2 = 0x03, |
---|
| 37 | KC_3 = 0x04, |
---|
| 38 | KC_4 = 0x05, |
---|
| 39 | KC_5 = 0x06, |
---|
| 40 | KC_6 = 0x07, |
---|
| 41 | KC_7 = 0x08, |
---|
| 42 | KC_8 = 0x09, |
---|
| 43 | KC_9 = 0x0A, |
---|
| 44 | KC_0 = 0x0B, |
---|
| 45 | KC_MINUS = 0x0C, // - on main keyboard |
---|
| 46 | KC_EQUALS = 0x0D, |
---|
| 47 | KC_BACK = 0x0E, // backspace |
---|
| 48 | KC_TAB = 0x0F, |
---|
| 49 | KC_Q = 0x10, |
---|
| 50 | KC_W = 0x11, |
---|
| 51 | KC_E = 0x12, |
---|
| 52 | KC_R = 0x13, |
---|
| 53 | KC_T = 0x14, |
---|
| 54 | KC_Y = 0x15, |
---|
| 55 | KC_U = 0x16, |
---|
| 56 | KC_I = 0x17, |
---|
| 57 | KC_O = 0x18, |
---|
| 58 | KC_P = 0x19, |
---|
| 59 | KC_LBRACKET = 0x1A, |
---|
| 60 | KC_RBRACKET = 0x1B, |
---|
| 61 | KC_RETURN = 0x1C, // Enter on main keyboard |
---|
| 62 | KC_LCONTROL = 0x1D, |
---|
| 63 | KC_A = 0x1E, |
---|
| 64 | KC_S = 0x1F, |
---|
| 65 | KC_D = 0x20, |
---|
| 66 | KC_F = 0x21, |
---|
| 67 | KC_G = 0x22, |
---|
| 68 | KC_H = 0x23, |
---|
| 69 | KC_J = 0x24, |
---|
| 70 | KC_K = 0x25, |
---|
| 71 | KC_L = 0x26, |
---|
| 72 | KC_SEMICOLON = 0x27, |
---|
| 73 | KC_APOSTROPHE = 0x28, |
---|
| 74 | KC_GRAVE = 0x29, // accent |
---|
| 75 | KC_LSHIFT = 0x2A, |
---|
| 76 | KC_BACKSLASH = 0x2B, |
---|
| 77 | KC_Z = 0x2C, |
---|
| 78 | KC_X = 0x2D, |
---|
| 79 | KC_C = 0x2E, |
---|
| 80 | KC_V = 0x2F, |
---|
| 81 | KC_B = 0x30, |
---|
| 82 | KC_N = 0x31, |
---|
| 83 | KC_M = 0x32, |
---|
| 84 | KC_COMMA = 0x33, |
---|
| 85 | KC_PERIOD = 0x34, // . on main keyboard |
---|
| 86 | KC_SLASH = 0x35, // / on main keyboard |
---|
| 87 | KC_RSHIFT = 0x36, |
---|
| 88 | KC_MULTIPLY = 0x37, // * on numeric keypad |
---|
| 89 | KC_LMENU = 0x38, // left Alt |
---|
| 90 | KC_SPACE = 0x39, |
---|
| 91 | KC_CAPITAL = 0x3A, |
---|
| 92 | KC_F1 = 0x3B, |
---|
| 93 | KC_F2 = 0x3C, |
---|
| 94 | KC_F3 = 0x3D, |
---|
| 95 | KC_F4 = 0x3E, |
---|
| 96 | KC_F5 = 0x3F, |
---|
| 97 | KC_F6 = 0x40, |
---|
| 98 | KC_F7 = 0x41, |
---|
| 99 | KC_F8 = 0x42, |
---|
| 100 | KC_F9 = 0x43, |
---|
| 101 | KC_F10 = 0x44, |
---|
| 102 | KC_NUMLOCK = 0x45, |
---|
| 103 | KC_SCROLL = 0x46, // Scroll Lock |
---|
| 104 | KC_NUMPAD7 = 0x47, |
---|
| 105 | KC_NUMPAD8 = 0x48, |
---|
| 106 | KC_NUMPAD9 = 0x49, |
---|
| 107 | KC_SUBTRACT = 0x4A, // - on numeric keypad |
---|
| 108 | KC_NUMPAD4 = 0x4B, |
---|
| 109 | KC_NUMPAD5 = 0x4C, |
---|
| 110 | KC_NUMPAD6 = 0x4D, |
---|
| 111 | KC_ADD = 0x4E, // + on numeric keypad |
---|
| 112 | KC_NUMPAD1 = 0x4F, |
---|
| 113 | KC_NUMPAD2 = 0x50, |
---|
| 114 | KC_NUMPAD3 = 0x51, |
---|
| 115 | KC_NUMPAD0 = 0x52, |
---|
| 116 | KC_DECIMAL = 0x53, // . on numeric keypad |
---|
| 117 | KC_OEM_102 = 0x56, // < > | on UK/Germany keyboards |
---|
| 118 | KC_F11 = 0x57, |
---|
| 119 | KC_F12 = 0x58, |
---|
| 120 | KC_F13 = 0x64, // (NEC PC98) |
---|
| 121 | KC_F14 = 0x65, // (NEC PC98) |
---|
| 122 | KC_F15 = 0x66, // (NEC PC98) |
---|
| 123 | KC_KANA = 0x70, // (Japanese keyboard) |
---|
| 124 | KC_ABNT_C1 = 0x73, // / ? on Portugese (Brazilian) keyboards |
---|
| 125 | KC_CONVERT = 0x79, // (Japanese keyboard) |
---|
| 126 | KC_NOCONVERT = 0x7B, // (Japanese keyboard) |
---|
| 127 | KC_YEN = 0x7D, // (Japanese keyboard) |
---|
| 128 | KC_ABNT_C2 = 0x7E, // Numpad . on Portugese (Brazilian) keyboards |
---|
| 129 | KC_NUMPADEQUALS= 0x8D, // = on numeric keypad (NEC PC98) |
---|
| 130 | KC_PREVTRACK = 0x90, // Previous Track (KC_CIRCUMFLEX on Japanese keyboard) |
---|
| 131 | KC_AT = 0x91, // (NEC PC98) |
---|
| 132 | KC_COLON = 0x92, // (NEC PC98) |
---|
| 133 | KC_UNDERLINE = 0x93, // (NEC PC98) |
---|
| 134 | KC_KANJI = 0x94, // (Japanese keyboard) |
---|
| 135 | KC_STOP = 0x95, // (NEC PC98) |
---|
| 136 | KC_AX = 0x96, // (Japan AX) |
---|
| 137 | KC_UNLABELED = 0x97, // (J3100) |
---|
| 138 | KC_NEXTTRACK = 0x99, // Next Track |
---|
| 139 | KC_NUMPADENTER = 0x9C, // Enter on numeric keypad |
---|
| 140 | KC_RCONTROL = 0x9D, |
---|
| 141 | KC_MUTE = 0xA0, // Mute |
---|
| 142 | KC_CALCULATOR = 0xA1, // Calculator |
---|
| 143 | KC_PLAYPAUSE = 0xA2, // Play / Pause |
---|
| 144 | KC_MEDIASTOP = 0xA4, // Media Stop |
---|
| 145 | KC_VOLUMEDOWN = 0xAE, // Volume - |
---|
| 146 | KC_VOLUMEUP = 0xB0, // Volume + |
---|
| 147 | KC_WEBHOME = 0xB2, // Web home |
---|
| 148 | KC_NUMPADCOMMA = 0xB3, // , on numeric keypad (NEC PC98) |
---|
| 149 | KC_DIVIDE = 0xB5, // / on numeric keypad |
---|
| 150 | KC_SYSRQ = 0xB7, |
---|
| 151 | KC_RMENU = 0xB8, // right Alt |
---|
| 152 | KC_PAUSE = 0xC5, // Pause |
---|
| 153 | KC_HOME = 0xC7, // Home on arrow keypad |
---|
| 154 | KC_UP = 0xC8, // UpArrow on arrow keypad |
---|
| 155 | KC_PGUP = 0xC9, // PgUp on arrow keypad |
---|
| 156 | KC_LEFT = 0xCB, // LeftArrow on arrow keypad |
---|
| 157 | KC_RIGHT = 0xCD, // RightArrow on arrow keypad |
---|
| 158 | KC_END = 0xCF, // End on arrow keypad |
---|
| 159 | KC_DOWN = 0xD0, // DownArrow on arrow keypad |
---|
| 160 | KC_PGDOWN = 0xD1, // PgDn on arrow keypad |
---|
| 161 | KC_INSERT = 0xD2, // Insert on arrow keypad |
---|
| 162 | KC_DELETE = 0xD3, // Delete on arrow keypad |
---|
| 163 | KC_LWIN = 0xDB, // Left Windows key |
---|
| 164 | KC_RWIN = 0xDC, // Right Windows key |
---|
| 165 | KC_APPS = 0xDD, // AppMenu key |
---|
| 166 | KC_POWER = 0xDE, // System Power |
---|
| 167 | KC_SLEEP = 0xDF, // System Sleep |
---|
| 168 | KC_WAKE = 0xE3, // System Wake |
---|
| 169 | KC_WEBSEARCH = 0xE5, // Web Search |
---|
| 170 | KC_WEBFAVORITES= 0xE6, // Web Favorites |
---|
| 171 | KC_WEBREFRESH = 0xE7, // Web Refresh |
---|
| 172 | KC_WEBSTOP = 0xE8, // Web Stop |
---|
| 173 | KC_WEBFORWARD = 0xE9, // Web Forward |
---|
| 174 | KC_WEBBACK = 0xEA, // Web Back |
---|
| 175 | KC_MYCOMPUTER = 0xEB, // My Computer |
---|
| 176 | KC_MAIL = 0xEC, // Mail |
---|
| 177 | KC_MEDIASELECT = 0xED // Media Select |
---|
| 178 | }; |
---|
| 179 | |
---|
| 180 | /** |
---|
| 181 | Specialised for key events |
---|
| 182 | */ |
---|
| 183 | class _OISExport KeyEvent : public EventArg |
---|
| 184 | { |
---|
| 185 | public: |
---|
[8351] | 186 | KeyEvent(Object* obj, KeyCode kc, unsigned int txt) : EventArg(obj), key(kc), text(txt) {} |
---|
[1505] | 187 | virtual ~KeyEvent() {} |
---|
| 188 | |
---|
| 189 | //! KeyCode of event |
---|
| 190 | const KeyCode key; |
---|
| 191 | //! Text character, depends on current TextTranslationMode |
---|
| 192 | unsigned int text; |
---|
| 193 | }; |
---|
| 194 | |
---|
| 195 | /** |
---|
| 196 | To recieve buffered keyboard input, derive a class from this, and implement the |
---|
| 197 | methods here. Then set the call back to your Keyboard instance with Keyboard::setEventCallback |
---|
| 198 | */ |
---|
| 199 | class _OISExport KeyListener |
---|
| 200 | { |
---|
| 201 | public: |
---|
| 202 | virtual ~KeyListener() {} |
---|
[8351] | 203 | virtual bool keyPressed(const KeyEvent &arg) = 0; |
---|
| 204 | virtual bool keyReleased(const KeyEvent &arg) = 0; |
---|
[1505] | 205 | }; |
---|
| 206 | |
---|
| 207 | /** |
---|
| 208 | Keyboard base class. To be implemented by specific system (ie. DirectX Keyboard) |
---|
| 209 | This class is useful as you remain OS independent using this common interface. |
---|
| 210 | */ |
---|
| 211 | class _OISExport Keyboard : public Object |
---|
| 212 | { |
---|
| 213 | public: |
---|
| 214 | virtual ~Keyboard() {}; |
---|
| 215 | |
---|
| 216 | /** |
---|
| 217 | @remarks |
---|
| 218 | Returns true if key is donwn |
---|
| 219 | @param key |
---|
| 220 | A KeyCode to check |
---|
| 221 | */ |
---|
[8351] | 222 | virtual bool isKeyDown(KeyCode key) const = 0; |
---|
[1505] | 223 | |
---|
| 224 | /** |
---|
| 225 | @remarks |
---|
| 226 | Register/unregister a Keyboard Listener - Only one allowed for simplicity. If broadcasting |
---|
| 227 | is neccessary, just broadcast from the callback you registered. |
---|
| 228 | @param keyListener |
---|
| 229 | Send a pointer to a class derived from KeyListener or 0 to clear the callback |
---|
| 230 | */ |
---|
[8351] | 231 | virtual void setEventCallback(KeyListener *keyListener) { mListener = keyListener;} |
---|
[1505] | 232 | |
---|
| 233 | /** |
---|
| 234 | @remarks |
---|
| 235 | Returns currently set callback.. or 0 |
---|
| 236 | */ |
---|
| 237 | KeyListener* getEventCallback() const {return mListener;} |
---|
| 238 | |
---|
| 239 | //! TextTranslation Mode |
---|
| 240 | enum TextTranslationMode |
---|
| 241 | { |
---|
| 242 | Off, |
---|
| 243 | Unicode, |
---|
| 244 | Ascii |
---|
| 245 | }; |
---|
| 246 | |
---|
| 247 | /** |
---|
| 248 | @remarks |
---|
| 249 | Enable extra processing to translate KC_*** to an |
---|
| 250 | actual text character based off of locale. Different |
---|
| 251 | managers may implement none or all. Check the |
---|
| 252 | translation mode after setting to be sure |
---|
| 253 | @param mode |
---|
| 254 | Off, Unicode, Ascii |
---|
| 255 | */ |
---|
[8351] | 256 | virtual void setTextTranslation(TextTranslationMode mode); |
---|
[1505] | 257 | |
---|
| 258 | /** |
---|
| 259 | @remarks |
---|
| 260 | Returns current translation mode |
---|
| 261 | */ |
---|
| 262 | TextTranslationMode getTextTranslation() const {return mTextMode;} |
---|
| 263 | |
---|
| 264 | /** |
---|
| 265 | @remarks |
---|
| 266 | Translates KeyCode to string representation. |
---|
| 267 | For example, KC_ENTER will be "Enter" - Locale |
---|
| 268 | specific of course. |
---|
| 269 | @param kc |
---|
| 270 | KeyCode to convert |
---|
| 271 | @returns |
---|
| 272 | The string as determined from the current locale |
---|
| 273 | */ |
---|
[8351] | 274 | virtual const std::string& getAsString(KeyCode kc) = 0; |
---|
[1505] | 275 | |
---|
| 276 | //! Enum of bit position of modifer |
---|
| 277 | enum Modifier |
---|
| 278 | { |
---|
| 279 | Shift = 0x0000001, |
---|
| 280 | Ctrl = 0x0000010, |
---|
| 281 | Alt = 0x0000100 |
---|
| 282 | }; |
---|
| 283 | |
---|
| 284 | /** |
---|
| 285 | @remarks |
---|
| 286 | Check modifier status |
---|
| 287 | */ |
---|
[8351] | 288 | bool isModifierDown(Modifier mod) const; |
---|
[1505] | 289 | |
---|
| 290 | /** |
---|
| 291 | @remarks |
---|
| 292 | Copies the state of the keys into the sent buffer |
---|
| 293 | (in the form of 1 is down and 0 is up) |
---|
| 294 | */ |
---|
[8351] | 295 | virtual void copyKeyStates(char keys[256]) const = 0; |
---|
[1505] | 296 | |
---|
| 297 | protected: |
---|
| 298 | Keyboard(const std::string &vendor, bool buffered, int devID, InputManager* creator) |
---|
| 299 | : Object(vendor, OISKeyboard, buffered, devID, creator), |
---|
| 300 | mModifiers(0), mListener(0), mTextMode(Unicode) {} |
---|
| 301 | |
---|
| 302 | //! Bit field that holds status of Alt, Ctrl, Shift |
---|
| 303 | unsigned int mModifiers; |
---|
| 304 | |
---|
| 305 | //! Used for buffered/actionmapping callback |
---|
| 306 | KeyListener *mListener; |
---|
| 307 | |
---|
| 308 | //! The current translation mode |
---|
| 309 | TextTranslationMode mTextMode; |
---|
| 310 | }; |
---|
| 311 | } |
---|
| 312 | #endif |
---|