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
24 #ifndef __LP64__
25
26 #include "mac/MacKeyboard.h"
27 #include "mac/MacInputManager.h"
28 #include "mac/MacHelpers.h"
29 #include "OISException.h"
30 #include "OISEvents.h"
31
32 #include <Carbon/Carbon.h>
33
34 #include <list>
35 #include <string>
36
37 const EventTypeSpec DownSpec[] = {{kEventClassKeyboard, kEventRawKeyDown}, //non - repeats
38 {kEventClassKeyboard, kEventRawKeyRepeat}}; //repeats
39 const EventTypeSpec UpSpec = {kEventClassKeyboard, kEventRawKeyUp},
40 ModSpec = {kEventClassKeyboard, kEventRawKeyModifiersChanged};
41
42 const EventTypeSpec AllSpecs[] = {{kEventClassKeyboard, kEventRawKeyDown},
43 {kEventClassKeyboard, kEventRawKeyRepeat},
44 {kEventClassKeyboard, kEventRawKeyUp},
45 {kEventClassKeyboard, kEventRawKeyModifiersChanged}};
46
47 using namespace OIS;
48
49 //-------------------------------------------------------------------//
MacKeyboard(InputManager * creator,bool buffered,bool repeat)50 MacKeyboard::MacKeyboard( InputManager* creator, bool buffered, bool repeat )
51 : Keyboard(creator->inputSystemName(), buffered, 0, creator)
52 {
53 keyDownEventRef = NULL;
54 keyUpEventRef = NULL;
55 keyModEventRef = NULL;
56
57 useRepeat = repeat;
58
59 // Get a so-called "Univeral procedure pointer" for our callback
60 keyDownUPP = NewEventHandlerUPP( KeyDownWrapper );
61 keyUpUPP = NewEventHandlerUPP( KeyUpWrapper );
62 keyModUPP = NewEventHandlerUPP( KeyModWrapper );
63
64 // populate the conversion map
65 populateKeyConversion();
66
67 static_cast<MacInputManager*>(mCreator)->_setKeyboardUsed(true);
68 }
69
70 //-------------------------------------------------------------------//
~MacKeyboard()71 MacKeyboard::~MacKeyboard()
72 {
73 // Remove our handlers so that this instance doesn't get called
74 // after it is deleted
75 if (keyDownEventRef != NULL)
76 RemoveEventHandler(keyDownEventRef);
77
78 if (keyUpEventRef != NULL)
79 RemoveEventHandler(keyUpEventRef);
80
81 if (keyModEventRef != NULL)
82 RemoveEventHandler(keyModEventRef);
83
84 // dispose of our UPPs
85 DisposeEventHandlerUPP(keyDownUPP);
86 DisposeEventHandlerUPP(keyUpUPP);
87 DisposeEventHandlerUPP(keyModUPP);
88
89 //Free the input managers keyboard
90 static_cast<MacInputManager*>(mCreator)->_setKeyboardUsed(false);
91 }
92
93 //-------------------------------------------------------------------//
_initialize()94 void MacKeyboard::_initialize()
95 {
96 EventTargetRef event = ((MacInputManager*)mCreator)->_getEventTarget();
97
98 memset( &KeyBuffer, 0, 256 );
99 mModifiers = 0;
100 prevModMask = 0;
101
102 // just in case this gets called after the first time.. better safe
103 if (keyDownEventRef != NULL)
104 RemoveEventHandler(keyDownEventRef);
105
106 if (keyUpEventRef != NULL)
107 RemoveEventHandler(keyUpEventRef);
108
109 if (keyModEventRef != NULL)
110 RemoveEventHandler(keyModEventRef);
111
112 keyDownEventRef = NULL;
113 keyUpEventRef = NULL;
114 keyModEventRef = NULL;
115
116 OSStatus status;
117 // send both elements of downspec array... second index is for repeat events
118 if ( useRepeat )
119 status = InstallEventHandler( event, keyDownUPP, 2, DownSpec, this, &keyDownEventRef );
120 else
121 status = InstallEventHandler( event, keyDownUPP, 1, DownSpec, this, &keyDownEventRef );
122
123 if (status != noErr)
124 OIS_EXCEPT( E_General, "MacKeyboard::_initialize >> Error loading KeyDown event handler" );
125
126 if (InstallEventHandler( event, keyUpUPP, 1, &UpSpec, this, &keyUpEventRef ) != noErr)
127 OIS_EXCEPT( E_General, "MacKeyboard::_initialize >> Error loading KeyUp event handler" );
128
129 if (InstallEventHandler( event, keyModUPP, 1, &ModSpec, this, &keyModEventRef ) != noErr )
130 OIS_EXCEPT( E_General, "MacKeyboard::_initialize >> Error loading Keymods event handler" );
131 }
132
133 //-------------------------------------------------------------------//
isKeyDown(KeyCode key) const134 bool MacKeyboard::isKeyDown( KeyCode key ) const
135 {
136 return (bool)KeyBuffer[key];
137 }
138
139
140 //-------------------------------------------------------------------//
capture()141 void MacKeyboard::capture()
142 {
143 // if not buffered just return, we update the unbuffered automatically
144 if ( !mBuffered || !mListener )
145 return;
146
147 // run through our event stack
148 eventStack::iterator cur_it;
149
150 for (cur_it = pendingEvents.begin(); cur_it != pendingEvents.end(); cur_it++)
151 {
152
153 if ( (*cur_it).Type == MAC_KEYDOWN || (*cur_it).Type == MAC_KEYREPEAT)
154 mListener->keyPressed( (*cur_it).Event );
155 else if ( (*cur_it).Type == MAC_KEYUP )
156 mListener->keyReleased( (*cur_it).Event );
157 }
158
159 pendingEvents.clear();
160 }
161
162
163 //-------------------------------------------------------------------//
getAsString(KeyCode key)164 std::string& MacKeyboard::getAsString( KeyCode key )
165 {
166 CGKeyCode deviceKeycode;
167
168 // Convert OIS KeyCode back into device keycode
169 for(VirtualtoOIS_KeyMap::iterator it = keyConversion.begin(); it != keyConversion.end(); ++it)
170 {
171 if(it->second == key)
172 deviceKeycode = it->first;
173 }
174
175 UniChar unicodeString[1];
176 UniCharCount actualStringLength = 0;
177
178 CGEventSourceRef sref = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
179 CGEventRef ref = CGEventCreateKeyboardEvent(sref, deviceKeycode, true);
180 CGEventKeyboardGetUnicodeString(ref, sizeof(unicodeString) / sizeof(*unicodeString), &actualStringLength, unicodeString);
181 // NSLog([NSString stringWithFormat:@"%C\n", unicodeString[0]]);
182 getString = unicodeString[0];
183
184 return getString;
185 }
186
187 //-------------------------------------------------------------------//
setBuffered(bool buffered)188 void MacKeyboard::setBuffered( bool buffered )
189 {
190 mBuffered = buffered;
191 }
192
193 #include <iostream>
194 //-------------------------------------------------------------------//
_keyDownCallback(EventRef theEvent)195 void MacKeyboard::_keyDownCallback( EventRef theEvent )
196 {
197
198 UInt32 virtualKey;
199 OSStatus status;
200
201 unsigned int time = (unsigned int)GetEventTime(theEvent);
202
203 status = GetEventParameter(theEvent,
204 'kcod', // get it in virtual keycode
205 typeUInt32, NULL, // desired return type
206 sizeof(UInt32), NULL, // bufsize
207 &virtualKey );
208
209 KeyCode kc = keyConversion[virtualKey];
210
211 // record what kind of text we should pass the KeyEvent
212 UniChar text[10];
213 char macChar;
214
215 // TODO clean this up
216 if (mTextMode == Unicode)
217 {
218 //get string size
219 UInt32 stringsize;
220 //status = GetEventParameter( theEvent, 'kuni', typeUnicodeText, NULL, 0, &stringsize, NULL);
221 //status = GetEventParameter( theEvent, 'kuni', typeUnicodeText, NULL, sizeof(UniChar)*10, NULL, &text );
222 status = GetEventParameter( theEvent, 'kuni', typeUnicodeText, NULL, sizeof(UniChar) * 10, &stringsize, &text );
223 // std::cout << "String length: " << stringsize << std::endl;
224
225 //wstring unitext;
226 //for (int i=0;i<10;i++) unitext += (wchar_t)text[i];
227 //wcout << "Unicode out: " << unitext << endl;
228
229 if(stringsize > 0)
230 {
231 // for each unicode char, send an event
232 stringsize--; // no termination char
233 for ( int i = 0; i < stringsize; i++ )
234 {
235 injectEvent( kc, time, MAC_KEYDOWN, (unsigned int)text[i] );
236 }
237 }
238 }
239 else if (mTextMode == Ascii)
240 {
241
242 status = GetEventParameter( theEvent, 'kchr', typeChar, NULL, sizeof(char), NULL, &macChar );
243 injectEvent( kc, time, MAC_KEYDOWN, (unsigned int)macChar );
244 }
245 else
246 {
247 injectEvent( kc, time, MAC_KEYDOWN );
248 }
249 }
250
251 //-------------------------------------------------------------------//
_keyUpCallback(EventRef theEvent)252 void MacKeyboard::_keyUpCallback( EventRef theEvent )
253 {
254 UInt32 virtualKey;
255
256 OSStatus status;
257 status = GetEventParameter( theEvent, kEventParamKeyCode, typeUInt32,
258 NULL, sizeof(UInt32), NULL, &virtualKey );
259
260 KeyCode kc = keyConversion[virtualKey];
261 injectEvent( kc, (int)GetEventTime(theEvent), MAC_KEYUP );
262
263 }
264
265 //-------------------------------------------------------------------//
_modChangeCallback(EventRef theEvent)266 void MacKeyboard::_modChangeCallback( EventRef theEvent )
267 {
268 UInt32 mods;
269
270 OSStatus status;
271 status = GetEventParameter( theEvent, kEventParamKeyModifiers,
272 typeUInt32, NULL, sizeof(UInt32), NULL, &mods );
273
274 // find the changed bit
275 UInt32 change = prevModMask ^ mods;
276 MacEventType newstate = ((change & prevModMask) > 0) ? MAC_KEYUP : MAC_KEYDOWN;
277 unsigned int time = (int)GetEventTime( theEvent );
278
279 //cout << "preMask: " << hex << prevModMask << endl;
280 //cout << "ModMask: " << hex << mods << endl;
281 //cout << "Change: " << hex << (change & prevModMask) << endl << endl;
282
283 // TODO test modifiers on a full keyboard to check if different mask for left/right
284 switch (change)
285 {
286 case (shiftKey): // shift
287 mModifiers &= (newstate == MAC_KEYDOWN) ? Shift : ~Shift;
288 injectEvent( KC_LSHIFT, time, newstate );
289 //injectEvent( KC_RSHIFT, time, newstate );
290 break;
291
292 case (optionKey): // option (alt)
293 mModifiers &= (newstate == MAC_KEYDOWN) ? Alt : -Alt;
294 //injectEvent( KC_RMENU, time, newstate );
295 injectEvent( KC_LMENU, time, newstate );
296 break;
297
298 case (controlKey): // Ctrl
299 mModifiers += (newstate == MAC_KEYDOWN) ? Ctrl : -Ctrl;
300 //injectEvent( KC_RCONTROL, time, newstate );
301 injectEvent( KC_LCONTROL, time, newstate );
302 break;
303
304 case (cmdKey): // apple
305 //injectEvent( KC_RWIN, time, newstate );
306 injectEvent( KC_LWIN, time, newstate );
307 break;
308
309 case (kEventKeyModifierFnMask): // fn key
310 injectEvent( KC_APPS, time, newstate );
311 break;
312
313 case (kEventKeyModifierNumLockMask): // numlock
314 injectEvent( KC_NUMLOCK, time, newstate );
315 break;
316
317 case (alphaLock): // caps lock
318 injectEvent( KC_CAPITAL, time, newstate );
319 break;
320 }
321
322 prevModMask = mods;
323 }
324
325 //-------------------------------------------------------------------//
injectEvent(KeyCode kc,unsigned int time,MacEventType type,unsigned int txt)326 void MacKeyboard::injectEvent( KeyCode kc, unsigned int time, MacEventType type, unsigned int txt )
327 {
328 // set to 1 if this is either a keydown or repeat
329 KeyBuffer[kc] = ( type == MAC_KEYUP ) ? 0 : 1;
330
331 if ( mBuffered && mListener )
332 pendingEvents.push_back( MacKeyStackEvent( KeyEvent(this, kc, txt), type) );
333 }
334
335
336 //-------------------------------------------------------------------//
copyKeyStates(char keys[256]) const337 void MacKeyboard::copyKeyStates( char keys[256] ) const
338 {
339 memcpy( keys, KeyBuffer, 256 );
340 }
341
342
343
344 //-------------------------------------------------------------------//
populateKeyConversion()345 void MacKeyboard::populateKeyConversion()
346 {
347 // TODO finish the key mapping
348
349 // Virtual Key Map to KeyCode
350 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x12, KC_1));
351 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x13, KC_2));
352 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x14, KC_3));
353 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x15, KC_4));
354 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x17, KC_5));
355 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x16, KC_6));
356 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1A, KC_7));
357 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1C, KC_8));
358 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x19, KC_9));
359 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1D, KC_0));
360
361 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x33, KC_BACK)); // might be wrong
362
363 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1B, KC_MINUS));
364 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x18, KC_EQUALS));
365 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x31, KC_SPACE));
366 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2B, KC_COMMA));
367 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2F, KC_PERIOD));
368
369 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2A, KC_BACKSLASH));
370 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2C, KC_SLASH));
371 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x21, KC_LBRACKET));
372 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1E, KC_RBRACKET));
373
374 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x35, KC_ESCAPE));
375 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x39, KC_CAPITAL));
376
377 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x30, KC_TAB));
378 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x24, KC_RETURN)); // double check return/enter
379
380 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_colon, KC_COLON)); // no colon?
381 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x29, KC_SEMICOLON));
382 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x27, KC_APOSTROPHE));
383 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x32, KC_GRAVE));
384
385 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x0B, KC_B));
386 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x00, KC_A));
387 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x08, KC_C));
388 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x02, KC_D));
389 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x0E, KC_E));
390 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x03, KC_F));
391 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x05, KC_G));
392 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x04, KC_H));
393 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x22, KC_I));
394 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x26, KC_J));
395 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x28, KC_K));
396 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x25, KC_L));
397 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2E, KC_M));
398 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2D, KC_N));
399 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1F, KC_O));
400 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x23, KC_P));
401 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x0C, KC_Q));
402 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x0F, KC_R));
403 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x01, KC_S));
404 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x11, KC_T));
405 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x20, KC_U));
406 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x09, KC_V));
407 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x0D, KC_W));
408 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x07, KC_X));
409 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x10, KC_Y));
410 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x06, KC_Z));
411
412 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x7A, KC_F1));
413 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x78, KC_F2));
414 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x63, KC_F3));
415 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x76, KC_F4));
416 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x60, KC_F5));
417 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x61, KC_F6));
418 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x62, KC_F7));
419 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x64, KC_F8));
420 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x65, KC_F9));
421 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x6D, KC_F10));
422 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x67, KC_F11));
423 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x6F, KC_F12));
424 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x69, KC_F13));
425 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x6B, KC_F14));
426 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x71, KC_F15));
427
428 //Keypad
429 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x52, KC_NUMPAD0));
430 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x53, KC_NUMPAD1));
431 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x54, KC_NUMPAD2));
432 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x55, KC_NUMPAD3));
433 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x56, KC_NUMPAD4));
434 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x57, KC_NUMPAD5));
435 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x58, KC_NUMPAD6));
436 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x59, KC_NUMPAD7));
437 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x5B, KC_NUMPAD8));
438 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x5C, KC_NUMPAD9));
439 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x45, KC_ADD));
440 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x4E, KC_SUBTRACT));
441 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x41, KC_DECIMAL));
442 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x51, KC_NUMPADEQUALS));
443 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x4B, KC_DIVIDE));
444 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x43, KC_MULTIPLY));
445 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x4C, KC_NUMPADENTER));
446
447 //Keypad with numlock off
448 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x73, KC_NUMPAD7)); // not sure of these
449 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_KP_Up, KC_NUMPAD8)); // check on a non-laptop
450 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_KP_Page_Up, KC_NUMPAD9));
451 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_KP_Left, KC_NUMPAD4));
452 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_KP_Begin, KC_NUMPAD5));
453 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_KP_Right, KC_NUMPAD6));
454 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_KP_End, KC_NUMPAD1));
455 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_KP_Down, KC_NUMPAD2));
456 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_KP_Page_Down, KC_NUMPAD3));
457 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_KP_Insert, KC_NUMPAD0));
458 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_KP_Delete, KC_DECIMAL));
459
460 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x7E, KC_UP));
461 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x7D, KC_DOWN));
462 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x7B, KC_LEFT));
463 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x7C, KC_RIGHT));
464
465 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x74, KC_PGUP));
466 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x79, KC_PGDOWN));
467 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x73, KC_HOME));
468 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x77, KC_END));
469
470 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_Print, KC_SYSRQ)); // ??
471 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_Scroll_Lock, KC_SCROLL)); // ??
472 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_Pause, KC_PAUSE)); // ??
473
474
475 //keyConversion.insert(VirtualtoOIS_KeyMap::value_type(XK_Insert, KC_INSERT)); // ??
476 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x75, KC_DELETE)); // del under help key?
477 }
478
479 #endif
480