• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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