Improve azerty handling in osx
TODO: fix "~" typing
This commit is contained in:
parent
280152479d
commit
185b468cb4
@ -234,6 +234,7 @@ namespace irr
|
|||||||
void storeMouseLocation();
|
void storeMouseLocation();
|
||||||
void postMouseEvent(void *event, irr::SEvent &ievent);
|
void postMouseEvent(void *event, irr::SEvent &ievent);
|
||||||
void postKeyEvent(void *event, irr::SEvent &ievent, bool pressed);
|
void postKeyEvent(void *event, irr::SEvent &ievent, bool pressed);
|
||||||
|
void charToKeys(void* str, irr::u32& character, irr::u32& key_code);
|
||||||
void pollJoysticks();
|
void pollJoysticks();
|
||||||
|
|
||||||
NSWindow *Window;
|
NSWindow *Window;
|
||||||
|
@ -1194,68 +1194,109 @@ bool CIrrDeviceMacOSX::isWindowMinimized() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static irr::u32 irrKeyCodeFromChar(irr::u32 character)
|
||||||
|
{
|
||||||
|
switch (character)
|
||||||
|
{
|
||||||
|
case 'a': case 'A': return irr::IRR_KEY_A;
|
||||||
|
case 'b': case 'B': return irr::IRR_KEY_B;
|
||||||
|
case 'c': case 'C': return irr::IRR_KEY_C;
|
||||||
|
case 'd': case 'D': return irr::IRR_KEY_D;
|
||||||
|
case 'e': case 'E': return irr::IRR_KEY_E;
|
||||||
|
case 'f': case 'F': return irr::IRR_KEY_F;
|
||||||
|
case 'g': case 'G': return irr::IRR_KEY_G;
|
||||||
|
case 'h': case 'H': return irr::IRR_KEY_H;
|
||||||
|
case 'i': case 'I': return irr::IRR_KEY_I;
|
||||||
|
case 'j': case 'J': return irr::IRR_KEY_J;
|
||||||
|
case 'k': case 'K': return irr::IRR_KEY_K;
|
||||||
|
case 'l': case 'L': return irr::IRR_KEY_L;
|
||||||
|
case 'm': case 'M': return irr::IRR_KEY_M;
|
||||||
|
case 'n': case 'N': return irr::IRR_KEY_N;
|
||||||
|
case 'o': case 'O': return irr::IRR_KEY_O;
|
||||||
|
case 'p': case 'P': return irr::IRR_KEY_P;
|
||||||
|
case 'q': case 'Q': return irr::IRR_KEY_Q;
|
||||||
|
case 'r': case 'R': return irr::IRR_KEY_R;
|
||||||
|
case 's': case 'S': return irr::IRR_KEY_S;
|
||||||
|
case 't': case 'T': return irr::IRR_KEY_T;
|
||||||
|
case 'u': case 'U': return irr::IRR_KEY_U;
|
||||||
|
case 'v': case 'V': return irr::IRR_KEY_V;
|
||||||
|
case 'w': case 'W': return irr::IRR_KEY_W;
|
||||||
|
case 'x': case 'X': return irr::IRR_KEY_X;
|
||||||
|
case 'y': case 'Y': return irr::IRR_KEY_Y;
|
||||||
|
case 'z': case 'Z': return irr::IRR_KEY_Z;
|
||||||
|
// This is for U.S. keyboard mapping, and doesn't necessarily make sense for different keyboard layouts.
|
||||||
|
// For example, '"' on Windows Russian layout is VK_2, not VK_OEM_7.
|
||||||
|
case ';': case ':': return irr::IRR_KEY_OEM_1;
|
||||||
|
case '=': case '+': return irr::IRR_KEY_PLUS;
|
||||||
|
case ',': case '<': return irr::IRR_KEY_COMMA;
|
||||||
|
case '-': case '_': return irr::IRR_KEY_MINUS;
|
||||||
|
case '.': case '>': return irr::IRR_KEY_PERIOD;
|
||||||
|
case '/': case '?': return irr::IRR_KEY_OEM_2;
|
||||||
|
case '`': case '~': return irr::IRR_KEY_OEM_3;
|
||||||
|
case '[': case '{': return irr::IRR_KEY_OEM_4;
|
||||||
|
case '\\': case '|': return irr::IRR_KEY_OEM_5;
|
||||||
|
case ']': case '}': return irr::IRR_KEY_OEM_6;
|
||||||
|
case '\'': case '"': return irr::IRR_KEY_OEM_7;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CIrrDeviceMacOSX::charToKeys(void* str, irr::u32& character, irr::u32& key_code)
|
||||||
|
{
|
||||||
|
u32 cur_character = [(NSString*) str characterAtIndex:0];
|
||||||
|
int cur_key = irrKeyCodeFromChar(cur_character);
|
||||||
|
if (cur_key != irr::IRR_KEY_UNKNOWN)
|
||||||
|
{
|
||||||
|
key_code = cur_key;
|
||||||
|
character = cur_character;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void CIrrDeviceMacOSX::postKeyEvent(void *event,irr::SEvent &ievent,bool pressed)
|
void CIrrDeviceMacOSX::postKeyEvent(void *event,irr::SEvent &ievent,bool pressed)
|
||||||
{
|
{
|
||||||
NSString *str;
|
NSString* str;
|
||||||
|
NSString* str_im;
|
||||||
std::map<int,int>::const_iterator iter;
|
std::map<int,int>::const_iterator iter;
|
||||||
unsigned int result,c,mkey,mchar;
|
unsigned int mkey, mchar;
|
||||||
const unsigned char *cStr;
|
mkey = mchar = 0;
|
||||||
BOOL skipCommand;
|
|
||||||
|
|
||||||
|
ievent.KeyInput.PressedDown = pressed;
|
||||||
|
ievent.KeyInput.Shift = ([(NSEvent *)event modifierFlags] & NSShiftKeyMask) != 0;
|
||||||
|
ievent.KeyInput.Control = ([(NSEvent *)event modifierFlags] & NSControlKeyMask) != 0;
|
||||||
str = [(NSEvent *)event characters];
|
str = [(NSEvent *)event characters];
|
||||||
|
str_im = [(NSEvent *)event charactersIgnoringModifiers];
|
||||||
if ((str != nil) && ([str length] > 0))
|
if ((str != nil) && ([str length] > 0))
|
||||||
{
|
{
|
||||||
mkey = mchar = 0;
|
// First check keycode from characeter
|
||||||
skipCommand = false;
|
charToKeys(str, mchar, mkey);
|
||||||
c = [str characterAtIndex:0];
|
if (mkey == irr::IRR_KEY_UNKNOWN)
|
||||||
mchar = c;
|
{
|
||||||
|
// Ctrl+A on an AZERTY keyboard would get Q keyCode if we relied on str below.
|
||||||
|
if (ievent.KeyInput.Control && (str_im != nil) && ([str_im length] > 0))
|
||||||
|
charToKeys(str_im, mchar, mkey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mkey == irr::IRR_KEY_UNKNOWN)
|
||||||
|
{
|
||||||
|
// Get keycodes directly if not found above
|
||||||
|
if ((str != nil) && ([str length] > 0))
|
||||||
|
mchar = [str characterAtIndex:0];
|
||||||
iter = KeyCodes.find([(NSEvent *)event keyCode]);
|
iter = KeyCodes.find([(NSEvent *)event keyCode]);
|
||||||
if (iter != KeyCodes.end())
|
if (iter != KeyCodes.end())
|
||||||
mkey = (*iter).second;
|
mkey = (*iter).second;
|
||||||
else if ((iter = KeyCodes.find(c)) != KeyCodes.end())
|
|
||||||
mkey = (*iter).second;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// workaround for period character
|
|
||||||
if (c == 0x2E)
|
|
||||||
{
|
|
||||||
mkey = irr::IRR_KEY_PERIOD;
|
|
||||||
mchar = '.';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cStr = (unsigned char *)[str cStringUsingEncoding:NSWindowsCP1252StringEncoding];
|
|
||||||
if (cStr != NULL && strlen((char*)cStr) > 0)
|
|
||||||
{
|
|
||||||
mchar = cStr[0];
|
|
||||||
mkey = toupper(mchar);
|
|
||||||
if ([(NSEvent *)event modifierFlags] & NSCommandKeyMask)
|
|
||||||
{
|
|
||||||
if (mkey == 'C' || mkey == 'V' || mkey == 'X')
|
|
||||||
{
|
|
||||||
mchar = 0;
|
|
||||||
skipCommand = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ievent.EventType = irr::EET_KEY_INPUT_EVENT;
|
|
||||||
ievent.KeyInput.Key = (irr::EKEY_CODE)mkey;
|
|
||||||
ievent.KeyInput.PressedDown = pressed;
|
|
||||||
ievent.KeyInput.Shift = ([(NSEvent *)event modifierFlags] & NSShiftKeyMask) != 0;
|
|
||||||
ievent.KeyInput.Control = ([(NSEvent *)event modifierFlags] & NSControlKeyMask) != 0;
|
|
||||||
ievent.KeyInput.Char = mchar;
|
|
||||||
|
|
||||||
if (skipCommand)
|
|
||||||
ievent.KeyInput.Control = true;
|
|
||||||
else if ([(NSEvent *)event modifierFlags] & NSCommandKeyMask)
|
|
||||||
[NSApp sendEvent:(NSEvent *)event];
|
|
||||||
|
|
||||||
postEventFromUser(ievent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ievent.EventType = irr::EET_KEY_INPUT_EVENT;
|
||||||
|
ievent.KeyInput.Key = (irr::EKEY_CODE)mkey;
|
||||||
|
ievent.KeyInput.Char = mchar;
|
||||||
|
|
||||||
|
if ([(NSEvent *)event modifierFlags] & NSCommandKeyMask)
|
||||||
|
[NSApp sendEvent:(NSEvent *)event];
|
||||||
|
|
||||||
|
postEventFromUser(ievent);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1424,33 +1465,6 @@ void CIrrDeviceMacOSX::initKeycodes()
|
|||||||
KeyCodes[kVK_RightShift] = irr::IRR_KEY_RSHIFT;
|
KeyCodes[kVK_RightShift] = irr::IRR_KEY_RSHIFT;
|
||||||
KeyCodes[kVK_Space] = irr::IRR_KEY_SPACE;
|
KeyCodes[kVK_Space] = irr::IRR_KEY_SPACE;
|
||||||
|
|
||||||
KeyCodes[kVK_ANSI_A] = irr::IRR_KEY_A;
|
|
||||||
KeyCodes[kVK_ANSI_B] = irr::IRR_KEY_B;
|
|
||||||
KeyCodes[kVK_ANSI_C] = irr::IRR_KEY_C;
|
|
||||||
KeyCodes[kVK_ANSI_D] = irr::IRR_KEY_D;
|
|
||||||
KeyCodes[kVK_ANSI_E] = irr::IRR_KEY_E;
|
|
||||||
KeyCodes[kVK_ANSI_F] = irr::IRR_KEY_F;
|
|
||||||
KeyCodes[kVK_ANSI_G] = irr::IRR_KEY_G;
|
|
||||||
KeyCodes[kVK_ANSI_H] = irr::IRR_KEY_H;
|
|
||||||
KeyCodes[kVK_ANSI_I] = irr::IRR_KEY_I;
|
|
||||||
KeyCodes[kVK_ANSI_J] = irr::IRR_KEY_J;
|
|
||||||
KeyCodes[kVK_ANSI_K] = irr::IRR_KEY_K;
|
|
||||||
KeyCodes[kVK_ANSI_L] = irr::IRR_KEY_L;
|
|
||||||
KeyCodes[kVK_ANSI_M] = irr::IRR_KEY_M;
|
|
||||||
KeyCodes[kVK_ANSI_N] = irr::IRR_KEY_N;
|
|
||||||
KeyCodes[kVK_ANSI_O] = irr::IRR_KEY_O;
|
|
||||||
KeyCodes[kVK_ANSI_P] = irr::IRR_KEY_P;
|
|
||||||
KeyCodes[kVK_ANSI_Q] = irr::IRR_KEY_Q;
|
|
||||||
KeyCodes[kVK_ANSI_R] = irr::IRR_KEY_R;
|
|
||||||
KeyCodes[kVK_ANSI_S] = irr::IRR_KEY_S;
|
|
||||||
KeyCodes[kVK_ANSI_T] = irr::IRR_KEY_T;
|
|
||||||
KeyCodes[kVK_ANSI_U] = irr::IRR_KEY_U;
|
|
||||||
KeyCodes[kVK_ANSI_V] = irr::IRR_KEY_V;
|
|
||||||
KeyCodes[kVK_ANSI_W] = irr::IRR_KEY_W;
|
|
||||||
KeyCodes[kVK_ANSI_X] = irr::IRR_KEY_X;
|
|
||||||
KeyCodes[kVK_ANSI_Y] = irr::IRR_KEY_Y;
|
|
||||||
KeyCodes[kVK_ANSI_Z] = irr::IRR_KEY_Z;
|
|
||||||
|
|
||||||
KeyCodes[kVK_ANSI_0] = irr::IRR_KEY_0;
|
KeyCodes[kVK_ANSI_0] = irr::IRR_KEY_0;
|
||||||
KeyCodes[kVK_ANSI_1] = irr::IRR_KEY_1;
|
KeyCodes[kVK_ANSI_1] = irr::IRR_KEY_1;
|
||||||
KeyCodes[kVK_ANSI_2] = irr::IRR_KEY_2;
|
KeyCodes[kVK_ANSI_2] = irr::IRR_KEY_2;
|
||||||
|
Loading…
Reference in New Issue
Block a user