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