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