| 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: | 
|---|
| 186 | KeyEvent( Object* obj, KeyCode kc, unsigned int txt ) : EventArg(obj), key(kc), text(txt) {} | 
|---|
| 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() {} | 
|---|
| 203 | virtual bool keyPressed( const KeyEvent &arg ) = 0; | 
|---|
| 204 | virtual bool keyReleased( const KeyEvent &arg ) = 0; | 
|---|
| 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 | */ | 
|---|
| 222 | virtual bool isKeyDown( KeyCode key ) const = 0; | 
|---|
| 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 | */ | 
|---|
| 231 | virtual void setEventCallback( KeyListener *keyListener ) { mListener = keyListener;} | 
|---|
| 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 | */ | 
|---|
| 256 | virtual void setTextTranslation( TextTranslationMode mode ); | 
|---|
| 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 | */ | 
|---|
| 274 | virtual const std::string& getAsString( KeyCode kc ) = 0; | 
|---|
| 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 | */ | 
|---|
| 288 | bool isModifierDown( Modifier mod ) const; | 
|---|
| 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 | */ | 
|---|
| 295 | virtual void copyKeyStates( char keys[256] ) const = 0; | 
|---|
| 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 | 
|---|