- (int)keyCodeForCharacter
: (NSString*)character
{
if(![character length]) return -1;
char code;
BOOL shift, alt;
if(Ascii2Virtual( (char)[character characterAtIndex: 0],shift,alt,code)) {
return code;
}
return -1;
}
BOOL Ascii2Virtual(char pcar, BOOL *pshift, BOOL *palt, char *pkeycode)
{
KeyboardLayoutRef keyboard;
const void *keyboardData; // keyboard layout data
UInt16 nbblocs;
char *modblocs, *blocs, *deadkeys;
int ix, ifin, numbloc, keycode;
BOOL shift, alt;
// get the current keyboard
if(KLGetCurrentKeyboardLayout(&keyboard;)) return NO;
// get the description of the current keyboard layout
if(KLGetKeyboardLayoutProperty(keyboard, kKLKCHRData, &keyboardData;)) return NO;
// get pointer early numbers of blocks for each combination of modifiers
modblocs = ((char *)keyboardData) + 2;
// get number of blocks keycode->ascii
nbblocs = *((UInt16 *)(keyboardData + 258));
// get pointer early blocks keycode-> ascii
blocs = ((char *)keyboardData) + 260;
// determining the size of all tables keycode-> ascii a scanner
ifin = nbblocs*128;
// determining pointer early in the tables of dead keys
deadkeys = blocs+ifin;
// Now it runs blocks keycode-> ascii to find the car ascii
for (ix=0; ix<ifin ; ix++)
{
if (blocs[ix]==pcar)
{
// found ascii value: now we must determine which block it is
keycode = ix & 0×7f; // 0111 1111 mask
numbloc = ix >> 7;
break;
}
}
// not found: bail out (error)
if (ix >= ifin) return NO;
// from block number, we must find the combination of modifiers using this block
for (ix=0; ix<15; ix++)
{
// it does not address whether the modifiers are not "capital" and "option"
if (ix&1 || ix&4) continue;
// Combining modifiers found for the block
if (modblocs[ix]==numbloc)
{
shift = (ix&2) ? YES : NO;
alt = (ix&8) ? YES : NO;
break;
}
}
// combination modifiers not found: bail
if (ix>=15) return NO;
// save our parameters
*pkeycode=keycode;
*pshift=shift;
*palt=alt;
return YES;
}
</ifin>
//objectc/5094