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: KeyEvent(Object * obj,KeyCode kc,unsigned int txt)186 KeyEvent(Object* obj, KeyCode kc, unsigned int txt) : EventArg(obj), key(kc), text(txt) {} ~KeyEvent()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: ~KeyListener()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: ~Keyboard()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 */ setEventCallback(KeyListener * keyListener)231 virtual void setEventCallback(KeyListener *keyListener) { mListener = keyListener;} 232 233 /** 234 @remarks 235 Returns currently set callback.. or 0 236 */ getEventCallback()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 */ getTextTranslation()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: Keyboard(const std::string & vendor,bool buffered,int devID,InputManager * creator)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 313