00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "mac/MacKeyboard.h"
00025 #include "mac/MacInputManager.h"
00026 #include "mac/MacHelpers.h"
00027 #include "OISException.h"
00028 #include "OISEvents.h"
00029
00030 #include <Carbon/Carbon.h>
00031
00032 #include <list>
00033 #include <string>
00034
00035
00036
00037
00038 using namespace OIS;
00039
00040
00041 MacKeyboard::MacKeyboard( InputManager* creator, bool buffered, bool repeat )
00042 {
00043 mCreator = creator;
00044 keyDownEventRef = NULL;
00045 keyUpEventRef = NULL;
00046 keyModEventRef = NULL;
00047
00048 mBuffered = buffered;
00049 useRepeat = repeat;
00050
00051
00052
00053 keyDownUPP = NewEventHandlerUPP( KeyDownWrapper );
00054 keyUpUPP = NewEventHandlerUPP( KeyUpWrapper );
00055 keyModUPP = NewEventHandlerUPP( KeyModWrapper );
00056
00057
00058 populateKeyConversion();
00059 }
00060
00061
00062 MacKeyboard::~MacKeyboard()
00063 {
00064
00065
00066 if ( keyDownEventRef != NULL ) RemoveEventHandler( keyDownEventRef );
00067 if ( keyUpEventRef != NULL ) RemoveEventHandler( keyUpEventRef );
00068 if ( keyModEventRef != NULL ) RemoveEventHandler( keyUpEventRef );
00069
00070
00071 DisposeEventHandlerUPP( keyDownUPP );
00072 DisposeEventHandlerUPP( keyUpUPP );
00073 DisposeEventHandlerUPP( keyModUPP );
00074 }
00075
00076
00077 void MacKeyboard::_initialize()
00078 {
00079 OSStatus status;
00080 WindowRef window = ( (MacInputManager*)mCreator)->_getWindow();
00081
00082 memset( &KeyBuffer, 0, 256 );
00083 mModifiers = 0;
00084 prevModMask = 0;
00085
00086
00087 if ( keyDownEventRef != NULL ) RemoveEventHandler( keyDownEventRef );
00088 if ( keyUpEventRef != NULL ) RemoveEventHandler( keyUpEventRef );
00089 if ( keyModEventRef != NULL ) RemoveEventHandler( keyUpEventRef );
00090 keyDownEventRef = NULL;
00091 keyUpEventRef = NULL;
00092 keyModEventRef = NULL;
00093
00094 EventTypeSpec DownSpec[2];
00095 EventTypeSpec UpSpec, ModSpec, RepeatSpec;
00096
00097
00098 DownSpec[0].eventClass = kEventClassKeyboard;
00099 DownSpec[0].eventKind = kEventRawKeyDown;
00100 DownSpec[1].eventClass = kEventClassKeyboard;
00101 DownSpec[1].eventKind = kEventRawKeyRepeat;
00102
00103 UpSpec.eventClass = kEventClassKeyboard;
00104 UpSpec.eventKind = kEventRawKeyUp;
00105
00106
00107 ModSpec.eventClass = kEventClassKeyboard;
00108 ModSpec.eventKind = kEventRawKeyModifiersChanged;
00109
00110 if ( useRepeat ) {
00111
00112 status = InstallWindowEventHandler( window, keyDownUPP, 2, DownSpec, this, &keyDownEventRef );
00113 }
00114 else {
00115 status = InstallWindowEventHandler( window, keyDownUPP, 1, DownSpec, this, &keyDownEventRef );
00116 }
00117
00118 if ( status != noErr ) {
00119 OIS_EXCEPT( E_General, "MacKeyboard::_initialize >> Error loading KeyDown event handler" );
00120 }
00121
00122 status = InstallWindowEventHandler( window, keyUpUPP, 1, &UpSpec, this, &keyUpEventRef );
00123 if ( status != noErr ) {
00124 OIS_EXCEPT( E_General, "MacKeyboard::_initialize >> Error loading KeyUp event handler" );
00125 }
00126
00127 status = InstallWindowEventHandler( window, keyModUPP, 1, &ModSpec, this, &keyModEventRef );
00128 if ( status != noErr ) {
00129 OIS_EXCEPT( E_General, "MacKeyboard::_initialize >> Error loading Keymods event handler" );
00130 }
00131 }
00132
00133
00134 bool MacKeyboard::isKeyDown( KeyCode key )
00135 {
00136 return (bool)KeyBuffer[key];
00137 }
00138
00139
00140
00141 void MacKeyboard::capture()
00142 {
00143
00144 if ( !mBuffered || !listener ) return;
00145
00146
00147 eventStack::iterator cur_it;
00148
00149 for (cur_it = pendingEvents.begin(); cur_it != pendingEvents.end(); cur_it++) {
00150
00151 if ( (*cur_it).Type == MAC_KEYDOWN || (*cur_it).Type == MAC_KEYREPEAT) {
00152 listener->keyPressed( (*cur_it).Event );
00153 }
00154 else if ( (*cur_it).Type == MAC_KEYUP ) {
00155 listener->keyReleased( (*cur_it).Event );
00156 }
00157 }
00158
00159 pendingEvents.clear();
00160 }
00161
00162
00163
00164 std::string& MacKeyboard::getAsString( KeyCode key )
00165 {
00166 getString = "";
00167
00168 return getString;
00169 }
00170
00171
00172 void MacKeyboard::setBuffered( bool buffered )
00173 {
00174 mBuffered = buffered;
00175 }
00176
00177
00178
00179 void MacKeyboard::_keyDownCallback( EventRef theEvent )
00180 {
00181
00182 UInt32 virtualKey;
00183 OSStatus status;
00184
00185 unsigned int time = (unsigned int)GetEventTime(theEvent);
00186
00187 status = GetEventParameter( theEvent,
00188 'kcod',
00189 typeUInt32, NULL,
00190 sizeof(UInt32), NULL,
00191 &virtualKey );
00192
00193 KeyCode kc = keyConversion[virtualKey];
00194
00195
00196 UniChar text[10];
00197 char macChar;
00198
00199
00200 if (mTextMode == Unicode) {
00201
00202
00203 UInt32 stringsize;
00204 status = GetEventParameter( theEvent, 'kuni', typeUnicodeText, NULL,
00205 0, &stringsize, NULL);
00206
00207
00208
00209 status = GetEventParameter( theEvent, 'kuni', typeUnicodeText, NULL,
00210 sizeof(UniChar)*10, NULL, &text );
00211
00212
00213
00214
00215
00216
00217 stringsize--;
00218 for ( int i = 0; i < stringsize; i++ ) {
00219 injectEvent( kc, time, MAC_KEYDOWN, (unsigned int)text[i] );
00220 }
00221
00222 }
00223
00224 else if (mTextMode == Ascii) {
00225
00226 status = GetEventParameter( theEvent, 'kchr', typeChar, NULL,
00227 sizeof(char), NULL, &macChar );
00228
00229 injectEvent( kc, time, MAC_KEYDOWN, (unsigned int)macChar );
00230 }
00231
00232 else {
00233 injectEvent( kc, time, MAC_KEYDOWN );
00234 }
00235 }
00236
00237
00238 void MacKeyboard::_keyUpCallback( EventRef theEvent )
00239 {
00240 UInt32 virtualKey;
00241
00242 OSStatus status;
00243 status = GetEventParameter( theEvent, kEventParamKeyCode, typeUInt32,
00244 NULL, sizeof(UInt32), NULL, &virtualKey );
00245
00246 KeyCode kc = keyConversion[virtualKey];
00247 injectEvent( kc, (int)GetEventTime(theEvent), MAC_KEYUP );
00248
00249 }
00250
00251
00252 void MacKeyboard::_modChangeCallback( EventRef theEvent )
00253 {
00254 UInt32 mods;
00255
00256 OSStatus status;
00257 status = GetEventParameter( theEvent, kEventParamKeyModifiers,
00258 typeUInt32, NULL, sizeof(UInt32), NULL, &mods );
00259
00260
00261 UInt32 change = prevModMask ^ mods;
00262 MacEventType newstate = ((change & prevModMask) > 0) ? MAC_KEYUP : MAC_KEYDOWN;
00263 unsigned int time = (int)GetEventTime( theEvent );
00264
00265
00266
00267
00268
00269
00270 switch (change)
00271 {
00272 case (shiftKey):
00273 mModifiers &= (newstate == MAC_KEYDOWN) ? Shift : ~Shift;
00274 injectEvent( KC_LSHIFT, time, newstate );
00275
00276 break;
00277
00278 case (optionKey):
00279 mModifiers &= (newstate == MAC_KEYDOWN) ? Alt : -Alt;
00280
00281 injectEvent( KC_LMENU, time, newstate );
00282 break;
00283
00284 case (controlKey):
00285 mModifiers += (newstate == MAC_KEYDOWN) ? Ctrl : -Ctrl;
00286
00287 injectEvent( KC_LCONTROL, time, newstate );
00288 break;
00289
00290 case (cmdKey):
00291
00292 injectEvent( KC_LWIN, time, newstate );
00293 break;
00294
00295 case (kEventKeyModifierFnMask):
00296 injectEvent( KC_APPS, time, newstate );
00297 break;
00298
00299 case (kEventKeyModifierNumLockMask):
00300 injectEvent( KC_NUMLOCK, time, newstate );
00301 break;
00302
00303 case (alphaLock):
00304 injectEvent( KC_CAPITAL, time, newstate );
00305 break;
00306 }
00307
00308 prevModMask = mods;
00309 }
00310
00311
00312 void MacKeyboard::injectEvent( KeyCode kc, unsigned int time, MacEventType type, unsigned int txt )
00313 {
00314
00315 KeyBuffer[kc] = ( type == MAC_KEYUP ) ? 0 : 1;
00316
00317 if ( mBuffered && listener ) {
00318 pendingEvents.push_back( MacKeyStackEvent( KeyEvent(this, kc, txt), type) );
00319 }
00320 }
00321
00322
00323
00324 void MacKeyboard::copyKeyStates( char keys[256] )
00325 {
00326 memcpy( keys, KeyBuffer, 256 );
00327 }
00328
00329
00330
00331
00332 void MacKeyboard::populateKeyConversion()
00333 {
00334
00335
00336
00337 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x12, KC_1));
00338 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x13, KC_2));
00339 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x14, KC_3));
00340 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x15, KC_4));
00341 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x17, KC_5));
00342 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x16, KC_6));
00343 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1A, KC_7));
00344 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1C, KC_8));
00345 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x19, KC_9));
00346 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1D, KC_0));
00347
00348 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x33, KC_BACK));
00349
00350 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1B, KC_MINUS));
00351 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x18, KC_EQUALS));
00352 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x31, KC_SPACE));
00353 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2B, KC_COMMA));
00354 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2F, KC_PERIOD));
00355
00356 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2A, KC_BACKSLASH));
00357 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2C, KC_SLASH));
00358 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x21, KC_LBRACKET));
00359 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1E, KC_RBRACKET));
00360
00361 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x35, KC_ESCAPE));
00362 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x39, KC_CAPITAL));
00363
00364 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x30, KC_TAB));
00365 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x24, KC_RETURN));
00366
00367
00368 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x29, KC_SEMICOLON));
00369 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x27, KC_APOSTROPHE));
00370 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x32, KC_GRAVE));
00371
00372 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x0B, KC_B));
00373 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x00, KC_A));
00374 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x08, KC_C));
00375 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x02, KC_D));
00376 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x0E, KC_E));
00377 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x03, KC_F));
00378 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x05, KC_G));
00379 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x04, KC_H));
00380 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x22, KC_I));
00381 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x26, KC_J));
00382 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x28, KC_K));
00383 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x25, KC_L));
00384 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2E, KC_M));
00385 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x2D, KC_N));
00386 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x1F, KC_O));
00387 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x23, KC_P));
00388 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x0C, KC_Q));
00389 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x0F, KC_R));
00390 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x01, KC_S));
00391 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x11, KC_T));
00392 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x20, KC_U));
00393 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x09, KC_V));
00394 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x0D, KC_W));
00395 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x07, KC_X));
00396 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x10, KC_Y));
00397 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x06, KC_Z));
00398
00399 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x7A, KC_F1));
00400 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x78, KC_F2));
00401 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x63, KC_F3));
00402 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x76, KC_F4));
00403 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x60, KC_F5));
00404 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x61, KC_F6));
00405 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x62, KC_F7));
00406 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x64, KC_F8));
00407 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x65, KC_F9));
00408 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x6D, KC_F10));
00409 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x67, KC_F11));
00410 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x6F, KC_F12));
00411 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x69, KC_F13));
00412 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x6B, KC_F14));
00413 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x71, KC_F15));
00414
00415
00416 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x52, KC_NUMPAD0));
00417 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x53, KC_NUMPAD1));
00418 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x54, KC_NUMPAD2));
00419 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x55, KC_NUMPAD3));
00420 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x56, KC_NUMPAD4));
00421 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x57, KC_NUMPAD5));
00422 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x58, KC_NUMPAD6));
00423 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x59, KC_NUMPAD7));
00424 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x5B, KC_NUMPAD8));
00425 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x5C, KC_NUMPAD9));
00426 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x45, KC_ADD));
00427 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x4E, KC_SUBTRACT));
00428 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x41, KC_DECIMAL));
00429 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x51, KC_NUMPADEQUALS));
00430 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x4B, KC_DIVIDE));
00431 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x43, KC_MULTIPLY));
00432 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x4C, KC_NUMPADENTER));
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x7E, KC_UP));
00448 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x7D, KC_DOWN));
00449 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x7B, KC_LEFT));
00450 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x7C, KC_RIGHT));
00451
00452 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x74, KC_PGUP));
00453 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x79, KC_PGDOWN));
00454 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x73, KC_HOME));
00455 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x77, KC_END));
00456
00457
00458
00459
00460
00461
00462
00463 keyConversion.insert(VirtualtoOIS_KeyMap::value_type(0x75, KC_DELETE));
00464 }
00465
00466
00467
00468