| 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 | 
|---|