/src/ois/src/mac/MacKeyboard.cpp

https://bitbucket.org/cabalistic/ogredeps/ · C++ · 478 lines · 300 code · 91 blank · 87 comment · 48 complexity · 37891f668e08ce8d259706aa6445ee3b MD5 · raw file

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