PageRenderTime 33ms CodeModel.GetById 17ms app.highlight 12ms RepoModel.GetById 1ms app.codeStats 0ms

/src/ois/includes/OISKeyboard.h

https://bitbucket.org/cabalistic/ogredeps/
C++ Header | 312 lines | 203 code | 19 blank | 90 comment | 0 complexity | 97a4ffefa8372badc51c4cccbcd4cf7a MD5 | raw file
  1/*
  2The zlib/libpng License
  3
  4Copyright (c) 2005-2007 Phillip Castaneda (pjcast -- www.wreckedgames.com)
  5
  6This software is provided 'as-is', without any express or implied warranty. In no event will
  7the authors be held liable for any damages arising from the use of this software.
  8
  9Permission is granted to anyone to use this software for any purpose, including commercial 
 10applications, and to alter it and redistribute it freely, subject to the following
 11restrictions:
 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
 28namespace 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 &inVendor, bool inBuffered, int devID, InputManager* creator)
299			: Object(inVendor, OISKeyboard, inBuffered, 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