OSX: Added more key translation.

This commit is contained in:
Branimir Karadzic 2014-09-28 13:36:23 -07:00
parent c659e70bdc
commit af86d1b02d

View file

@ -73,6 +73,7 @@
+ (Window *)sharedDelegate; + (Window *)sharedDelegate;
- (id)init; - (id)init;
- (void)windowCreated:(NSWindow *)window; - (void)windowCreated:(NSWindow *)window;
- (void)windowWillClose:(NSNotification *)notification;
- (BOOL)windowShouldClose:(NSWindow *)window; - (BOOL)windowShouldClose:(NSWindow *)window;
@end @end
@ -107,6 +108,11 @@
self->windowCount += 1; self->windowCount += 1;
} }
- (void)windowWillClose:(NSNotification *)notification
{
BX_UNUSED(notification);
}
- (BOOL)windowShouldClose:(NSWindow *)window - (BOOL)windowShouldClose:(NSWindow *)window
{ {
assert(window); assert(window);
@ -126,13 +132,6 @@
} }
@end @end
// Scan codes on Mac taken from http://boredzo.org/blog/archives/2007-05-22/virtual-key-codes
#define KEY_RETURN 36
#define KEY_TAB 48
#define KEY_DELETE 51
#define KEY_ESCAPE 53
namespace entry namespace entry
{ {
static WindowHandle s_defaultWindow = { 0 }; // TODO: Add support for more windows static WindowHandle s_defaultWindow = { 0 }; // TODO: Add support for more windows
@ -155,44 +154,17 @@ namespace entry
Context() Context()
: m_exit(false) : m_exit(false)
{ {
s_translateKey[KEY_ESCAPE] = Key::Esc; s_translateKey[27] = Key::Esc;
s_translateKey[KEY_RETURN] = Key::Return; s_translateKey[13] = Key::Return;
s_translateKey[KEY_TAB] = Key::Tab; s_translateKey[9] = Key::Tab;
s_translateKey[KEY_DELETE] = Key::Backspace; s_translateKey[127] = Key::Backspace;
//s_translateKey[VK_SPACE] = Key::Space; s_translateKey[uint8_t(' ')] = Key::Space;
//s_translateKey[VK_UP] = Key::Up;
//s_translateKey[VK_DOWN] = Key::Down; s_translateKey[uint8_t('+')] =
//s_translateKey[VK_LEFT] = Key::Left; s_translateKey[uint8_t('=')] = Key::Plus;
//s_translateKey[VK_RIGHT] = Key::Right; s_translateKey[uint8_t('_')] =
//s_translateKey[VK_PRIOR] = Key::PageUp; s_translateKey[uint8_t('-')] = Key::Minus;
//s_translateKey[VK_NEXT] = Key::PageUp;
//s_translateKey[VK_HOME] = Key::Home;
//s_translateKey[VK_END] = Key::End;
//s_translateKey[VK_SNAPSHOT] = Key::Print;
//s_translateKey[VK_OEM_PLUS] = Key::Plus;
//s_translateKey[VK_OEM_MINUS] = Key::Minus;
//s_translateKey[VK_F1] = Key::F1;
//s_translateKey[VK_F2] = Key::F2;
//s_translateKey[VK_F3] = Key::F3;
//s_translateKey[VK_F4] = Key::F4;
//s_translateKey[VK_F5] = Key::F5;
//s_translateKey[VK_F6] = Key::F6;
//s_translateKey[VK_F7] = Key::F7;
//s_translateKey[VK_F8] = Key::F8;
//s_translateKey[VK_F9] = Key::F9;
//s_translateKey[VK_F10] = Key::F10;
//s_translateKey[VK_F11] = Key::F11;
//s_translateKey[VK_F12] = Key::F12;
//s_translateKey[VK_NUMPAD0] = Key::NumPad0;
//s_translateKey[VK_NUMPAD1] = Key::NumPad1;
//s_translateKey[VK_NUMPAD2] = Key::NumPad2;
//s_translateKey[VK_NUMPAD3] = Key::NumPad3;
//s_translateKey[VK_NUMPAD4] = Key::NumPad4;
//s_translateKey[VK_NUMPAD5] = Key::NumPad5;
//s_translateKey[VK_NUMPAD6] = Key::NumPad6;
//s_translateKey[VK_NUMPAD7] = Key::NumPad7;
//s_translateKey[VK_NUMPAD8] = Key::NumPad8;
//s_translateKey[VK_NUMPAD9] = Key::NumPad9;
s_translateKey[uint8_t('0')] = Key::Key0; s_translateKey[uint8_t('0')] = Key::Key0;
s_translateKey[uint8_t('1')] = Key::Key1; s_translateKey[uint8_t('1')] = Key::Key1;
s_translateKey[uint8_t('2')] = Key::Key2; s_translateKey[uint8_t('2')] = Key::Key2;
@ -203,58 +175,12 @@ namespace entry
s_translateKey[uint8_t('7')] = Key::Key7; s_translateKey[uint8_t('7')] = Key::Key7;
s_translateKey[uint8_t('8')] = Key::Key8; s_translateKey[uint8_t('8')] = Key::Key8;
s_translateKey[uint8_t('9')] = Key::Key9; s_translateKey[uint8_t('9')] = Key::Key9;
s_translateKey[uint8_t('A')] = Key::KeyA;
s_translateKey[uint8_t('B')] = Key::KeyB; for (char ch = 'a'; ch <= 'z'; ++ch)
s_translateKey[uint8_t('C')] = Key::KeyC; {
s_translateKey[uint8_t('D')] = Key::KeyD; s_translateKey[uint8_t(ch)] =
s_translateKey[uint8_t('E')] = Key::KeyE; s_translateKey[uint8_t(ch - ' ')] = Key::KeyA + (ch - 'a');
s_translateKey[uint8_t('F')] = Key::KeyF; }
s_translateKey[uint8_t('G')] = Key::KeyG;
s_translateKey[uint8_t('H')] = Key::KeyH;
s_translateKey[uint8_t('I')] = Key::KeyI;
s_translateKey[uint8_t('J')] = Key::KeyJ;
s_translateKey[uint8_t('K')] = Key::KeyK;
s_translateKey[uint8_t('L')] = Key::KeyL;
s_translateKey[uint8_t('M')] = Key::KeyM;
s_translateKey[uint8_t('N')] = Key::KeyN;
s_translateKey[uint8_t('O')] = Key::KeyO;
s_translateKey[uint8_t('P')] = Key::KeyP;
s_translateKey[uint8_t('Q')] = Key::KeyQ;
s_translateKey[uint8_t('R')] = Key::KeyR;
s_translateKey[uint8_t('S')] = Key::KeyS;
s_translateKey[uint8_t('T')] = Key::KeyT;
s_translateKey[uint8_t('U')] = Key::KeyU;
s_translateKey[uint8_t('V')] = Key::KeyV;
s_translateKey[uint8_t('W')] = Key::KeyW;
s_translateKey[uint8_t('X')] = Key::KeyX;
s_translateKey[uint8_t('Y')] = Key::KeyY;
s_translateKey[uint8_t('Z')] = Key::KeyZ;
s_translateKey[uint8_t('a')] = Key::KeyA;
s_translateKey[uint8_t('b')] = Key::KeyB;
s_translateKey[uint8_t('c')] = Key::KeyC;
s_translateKey[uint8_t('d')] = Key::KeyD;
s_translateKey[uint8_t('e')] = Key::KeyE;
s_translateKey[uint8_t('f')] = Key::KeyF;
s_translateKey[uint8_t('g')] = Key::KeyG;
s_translateKey[uint8_t('h')] = Key::KeyH;
s_translateKey[uint8_t('i')] = Key::KeyI;
s_translateKey[uint8_t('j')] = Key::KeyJ;
s_translateKey[uint8_t('k')] = Key::KeyK;
s_translateKey[uint8_t('l')] = Key::KeyL;
s_translateKey[uint8_t('m')] = Key::KeyM;
s_translateKey[uint8_t('n')] = Key::KeyN;
s_translateKey[uint8_t('o')] = Key::KeyO;
s_translateKey[uint8_t('p')] = Key::KeyP;
s_translateKey[uint8_t('q')] = Key::KeyQ;
s_translateKey[uint8_t('r')] = Key::KeyR;
s_translateKey[uint8_t('s')] = Key::KeyS;
s_translateKey[uint8_t('t')] = Key::KeyT;
s_translateKey[uint8_t('u')] = Key::KeyU;
s_translateKey[uint8_t('v')] = Key::KeyV;
s_translateKey[uint8_t('w')] = Key::KeyW;
s_translateKey[uint8_t('x')] = Key::KeyX;
s_translateKey[uint8_t('y')] = Key::KeyY;
s_translateKey[uint8_t('z')] = Key::KeyZ;
} }
NSEvent* waitEvent() NSEvent* waitEvent()
@ -320,22 +246,55 @@ namespace entry
{ {
NSString* key = [event charactersIgnoringModifiers]; NSString* key = [event charactersIgnoringModifiers];
unichar keyChar = 0; unichar keyChar = 0;
//DBG("keyChar %d", keyChar);
if ([key length] == 0) if ([key length] == 0)
{
return Key::None; return Key::None;
}
keyChar = [key characterAtIndex:0]; keyChar = [key characterAtIndex:0];
int keyCode = keyChar; int keyCode = keyChar;
//DBG("keyCode %d", keyCode);
*specialKeys = translateModifiers([event modifierFlags]); *specialKeys = translateModifiers([event modifierFlags]);
// if this is a unhandled key just return None // if this is a unhandled key just return None
if (keyCode < 256)
if (keyCode >= 256) {
return Key::None;
return (Key::Enum)s_translateKey[keyCode]; return (Key::Enum)s_translateKey[keyCode];
} }
switch (keyCode)
{
case NSF1FunctionKey: return Key::F1;
case NSF2FunctionKey: return Key::F2;
case NSF3FunctionKey: return Key::F3;
case NSF4FunctionKey: return Key::F4;
case NSF5FunctionKey: return Key::F5;
case NSF6FunctionKey: return Key::F6;
case NSF7FunctionKey: return Key::F7;
case NSF8FunctionKey: return Key::F8;
case NSF9FunctionKey: return Key::F9;
case NSF10FunctionKey: return Key::F10;
case NSF11FunctionKey: return Key::F11;
case NSF12FunctionKey: return Key::F12;
case NSLeftArrowFunctionKey: return Key::Left;
case NSRightArrowFunctionKey: return Key::Right;
case NSUpArrowFunctionKey: return Key::Up;
case NSDownArrowFunctionKey: return Key::Down;
case NSPageUpFunctionKey: return Key::PageUp;
case NSPageDownFunctionKey: return Key::PageDown;
case NSHomeFunctionKey: return Key::Home;
case NSEndFunctionKey: return Key::End;
case NSPrintScreenFunctionKey: return Key::Print;
}
return Key::None;
}
bool dispatchEvent(NSEvent* event) bool dispatchEvent(NSEvent* event)
{ {
if (event) if (event)
@ -347,55 +306,40 @@ namespace entry
case NSMouseMoved: case NSMouseMoved:
{ {
int x, y; int x, y;
getMousePos(&x, &y); getMousePos(&x, &y);
m_eventQueue.postMouseEvent(s_defaultWindow, x, y, 0); m_eventQueue.postMouseEvent(s_defaultWindow, x, y, 0);
break; break;
} }
case NSLeftMouseDown: case NSLeftMouseDown:
{ {
int x, y; int x, y;
getMousePos(&x, &y); getMousePos(&x, &y);
m_eventQueue.postMouseEvent(s_defaultWindow, x, y, 0, MouseButton::Left, true); m_eventQueue.postMouseEvent(s_defaultWindow, x, y, 0, MouseButton::Left, true);
break; break;
} }
case NSLeftMouseUp: case NSLeftMouseUp:
{ {
int x, y; int x, y;
getMousePos(&x, &y); getMousePos(&x, &y);
m_eventQueue.postMouseEvent(s_defaultWindow, x, y, 0, MouseButton::Left, false); m_eventQueue.postMouseEvent(s_defaultWindow, x, y, 0, MouseButton::Left, false);
break; break;
} }
case NSRightMouseDown: case NSRightMouseDown:
{ {
int x, y; int x, y;
getMousePos(&x, &y); getMousePos(&x, &y);
m_eventQueue.postMouseEvent(s_defaultWindow, x, y, 0, MouseButton::Right, true); m_eventQueue.postMouseEvent(s_defaultWindow, x, y, 0, MouseButton::Right, true);
break; break;
} }
case NSRightMouseUp: case NSRightMouseUp:
{ {
int x, y; int x, y;
getMousePos(&x, &y); getMousePos(&x, &y);
m_eventQueue.postMouseEvent(s_defaultWindow, x, y, 0, MouseButton::Right, false); m_eventQueue.postMouseEvent(s_defaultWindow, x, y, 0, MouseButton::Right, false);
break; break;
} }
@ -406,10 +350,10 @@ namespace entry
// If KeyCode is none we don't don't handle the key and special case for cmd+q (quit) // If KeyCode is none we don't don't handle the key and special case for cmd+q (quit)
// Note that return false here means that we take care of the key (instead of the default behavior) // Note that return false here means that we take care of the key (instead of the default behavior)
if (key != Key::None) if (key != Key::None)
{ {
if (key != Key::KeyQ && !((modifiers & Modifier::RightMeta))) if (key != Key::KeyQ
&& !(modifiers & Modifier::RightMeta) )
{ {
m_eventQueue.postKeyEvent(s_defaultWindow, key, modifiers, true); m_eventQueue.postKeyEvent(s_defaultWindow, key, modifiers, true);
return false; return false;
@ -434,7 +378,6 @@ namespace entry
} }
} }
[NSApp sendEvent:event]; [NSApp sendEvent:event];
[NSApp updateWindows]; [NSApp updateWindows];
@ -493,7 +436,6 @@ namespace entry
[window setTitle:appName]; [window setTitle:appName];
[window cascadeTopLeftFromPoint:NSMakePoint(20,20)]; [window cascadeTopLeftFromPoint:NSMakePoint(20,20)];
[window makeKeyAndOrderFront:window]; [window makeKeyAndOrderFront:window];
// [window setContentView:nil];
[window setAcceptsMouseMovedEvents:YES]; [window setAcceptsMouseMovedEvents:YES];
[window setBackgroundColor:[NSColor blackColor]]; [window setBackgroundColor:[NSColor blackColor]];
[[Window sharedDelegate] windowCreated:window]; [[Window sharedDelegate] windowCreated:window];